diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + + } + + override fun onDestroy() { + super.onDestroy() + dataTimer.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/res/layout/activity_power_strip.xml b/app/src/main/res/layout/activity_power_strip.xml index afee5d1..3d8bb7b 100644 --- a/app/src/main/res/layout/activity_power_strip.xml +++ b/app/src/main/res/layout/activity_power_strip.xml @@ -11,21 +11,20 @@ + android:orientation="horizontal"> @@ -33,147 +32,130 @@ android:id="@+id/turnOffCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_turn_off_check_box" android:button="@null" - android:gravity="center" /> + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="总开关" + android:textSize="@dimen/sp_16" /> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal"> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/res/layout/activity_power_strip.xml b/app/src/main/res/layout/activity_power_strip.xml index afee5d1..3d8bb7b 100644 --- a/app/src/main/res/layout/activity_power_strip.xml +++ b/app/src/main/res/layout/activity_power_strip.xml @@ -11,21 +11,20 @@ + android:orientation="horizontal"> @@ -33,147 +32,130 @@ android:id="@+id/turnOffCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_turn_off_check_box" android:button="@null" - android:gravity="center" /> + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="总开关" + android:textSize="@dimen/sp_16" /> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal"> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/res/layout/activity_robot_add_time.xml b/app/src/main/res/layout/activity_robot_add_time.xml new file mode 100644 index 0000000..eb996c0 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_add_time.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/res/layout/activity_power_strip.xml b/app/src/main/res/layout/activity_power_strip.xml index afee5d1..3d8bb7b 100644 --- a/app/src/main/res/layout/activity_power_strip.xml +++ b/app/src/main/res/layout/activity_power_strip.xml @@ -11,21 +11,20 @@ + android:orientation="horizontal"> @@ -33,147 +32,130 @@ android:id="@+id/turnOffCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_turn_off_check_box" android:button="@null" - android:gravity="center" /> + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="总开关" + android:textSize="@dimen/sp_16" /> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal"> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/res/layout/activity_robot_add_time.xml b/app/src/main/res/layout/activity_robot_add_time.xml new file mode 100644 index 0000000..eb996c0 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_add_time.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_robot_settings.xml b/app/src/main/res/layout/activity_robot_settings.xml new file mode 100644 index 0000000..e5025d1 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_settings.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/res/layout/activity_power_strip.xml b/app/src/main/res/layout/activity_power_strip.xml index afee5d1..3d8bb7b 100644 --- a/app/src/main/res/layout/activity_power_strip.xml +++ b/app/src/main/res/layout/activity_power_strip.xml @@ -11,21 +11,20 @@ + android:orientation="horizontal"> @@ -33,147 +32,130 @@ android:id="@+id/turnOffCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_turn_off_check_box" android:button="@null" - android:gravity="center" /> + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="总开关" + android:textSize="@dimen/sp_16" /> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal"> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/res/layout/activity_robot_add_time.xml b/app/src/main/res/layout/activity_robot_add_time.xml new file mode 100644 index 0000000..eb996c0 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_add_time.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_robot_settings.xml b/app/src/main/res/layout/activity_robot_settings.xml new file mode 100644 index 0000000..e5025d1 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_settings.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/res/layout/activity_power_strip.xml b/app/src/main/res/layout/activity_power_strip.xml index afee5d1..3d8bb7b 100644 --- a/app/src/main/res/layout/activity_power_strip.xml +++ b/app/src/main/res/layout/activity_power_strip.xml @@ -11,21 +11,20 @@ + android:orientation="horizontal"> @@ -33,147 +32,130 @@ android:id="@+id/turnOffCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_turn_off_check_box" android:button="@null" - android:gravity="center" /> + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="总开关" + android:textSize="@dimen/sp_16" /> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal"> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/res/layout/activity_robot_add_time.xml b/app/src/main/res/layout/activity_robot_add_time.xml new file mode 100644 index 0000000..eb996c0 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_add_time.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_robot_settings.xml b/app/src/main/res/layout/activity_robot_settings.xml new file mode 100644 index 0000000..e5025d1 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_settings.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_sweeping_robot.xml b/app/src/main/res/layout/activity_sweeping_robot.xml new file mode 100644 index 0000000..5a6b3ec --- /dev/null +++ b/app/src/main/res/layout/activity_sweeping_robot.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/res/layout/activity_power_strip.xml b/app/src/main/res/layout/activity_power_strip.xml index afee5d1..3d8bb7b 100644 --- a/app/src/main/res/layout/activity_power_strip.xml +++ b/app/src/main/res/layout/activity_power_strip.xml @@ -11,21 +11,20 @@ + android:orientation="horizontal"> @@ -33,147 +32,130 @@ android:id="@+id/turnOffCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_turn_off_check_box" android:button="@null" - android:gravity="center" /> + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="总开关" + android:textSize="@dimen/sp_16" /> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal"> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/res/layout/activity_robot_add_time.xml b/app/src/main/res/layout/activity_robot_add_time.xml new file mode 100644 index 0000000..eb996c0 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_add_time.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_robot_settings.xml b/app/src/main/res/layout/activity_robot_settings.xml new file mode 100644 index 0000000..e5025d1 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_settings.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_sweeping_robot.xml b/app/src/main/res/layout/activity_sweeping_robot.xml new file mode 100644 index 0000000..5a6b3ec --- /dev/null +++ b/app/src/main/res/layout/activity_sweeping_robot.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_t_h_senser.xml b/app/src/main/res/layout/activity_t_h_senser.xml new file mode 100644 index 0000000..f8b00a6 --- /dev/null +++ b/app/src/main/res/layout/activity_t_h_senser.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/res/layout/activity_power_strip.xml b/app/src/main/res/layout/activity_power_strip.xml index afee5d1..3d8bb7b 100644 --- a/app/src/main/res/layout/activity_power_strip.xml +++ b/app/src/main/res/layout/activity_power_strip.xml @@ -11,21 +11,20 @@ + android:orientation="horizontal"> @@ -33,147 +32,130 @@ android:id="@+id/turnOffCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_turn_off_check_box" android:button="@null" - android:gravity="center" /> + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="总开关" + android:textSize="@dimen/sp_16" /> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal"> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/res/layout/activity_robot_add_time.xml b/app/src/main/res/layout/activity_robot_add_time.xml new file mode 100644 index 0000000..eb996c0 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_add_time.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_robot_settings.xml b/app/src/main/res/layout/activity_robot_settings.xml new file mode 100644 index 0000000..e5025d1 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_settings.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_sweeping_robot.xml b/app/src/main/res/layout/activity_sweeping_robot.xml new file mode 100644 index 0000000..5a6b3ec --- /dev/null +++ b/app/src/main/res/layout/activity_sweeping_robot.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_t_h_senser.xml b/app/src/main/res/layout/activity_t_h_senser.xml new file mode 100644 index 0000000..f8b00a6 --- /dev/null +++ b/app/src/main/res/layout/activity_t_h_senser.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_dispenser.xml b/app/src/main/res/layout/activity_water_dispenser.xml new file mode 100644 index 0000000..6cdbb1c --- /dev/null +++ b/app/src/main/res/layout/activity_water_dispenser.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6abc67b..26fd5a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,7 @@ + @@ -77,6 +78,17 @@ + + + + + + + + + + + + private val context: Context, private val dataRows: MutableList ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) @@ -41,8 +40,8 @@ params.setMargins(0, 3f.dp2px(context), 0, 0) holder.imageView.requestLayout() } - holder.imageView.layoutParams.width = 80f.dp2px(context) - holder.imageView.layoutParams.height = 80f.dp2px(context) + holder.imageView.layoutParams.width = 40f.dp2px(context) + holder.imageView.layoutParams.height = 40f.dp2px(context) holder.tempLayout.visibility = View.GONE holder.imageView.setOnClickListener { //添加图片 @@ -58,12 +57,11 @@ .into(holder.imageView) holder.deviceModelView.text = rowsModel.name holder.deviceUsedTimeView.text = String.format( - "已使用${rowsModel.time.toString().diffDate()}天" + "已使用${rowsModel.time.toString().diffDate(false)}天" ) holder.rootView.setOnClickListener { clickListener?.onItemClick(position) } - // 长按监听 holder.moreOperateButton.setOnClickListener { clickListener?.onButtonClick(position) } diff --git a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt index 535b3f3..d8ca8f7 100644 --- a/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FavoriteAdapter.kt @@ -10,6 +10,7 @@ import com.casic.br.model.FavoriteModel /** + * TODO 现为模拟数据,待后期调整 * 猜你喜欢,九宫格Adapter * */ class FavoriteAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt index 8ff089f..274005d 100644 --- a/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/FeaturedGoodsAdapter.kt @@ -11,6 +11,7 @@ import com.casic.br.model.FeaturedGoodsModel /** + * TODO 现为模拟数据,待后期调整 * 精选好物,九宫格Adapter * */ class FeaturedGoodsAdapter( diff --git a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt index 3ca02e4..0e20ec2 100644 --- a/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt +++ b/app/src/main/java/com/casic/br/adapter/IconTextGridAdapter.kt @@ -13,9 +13,7 @@ * 图片在上,文字在下,九宫格Adapter * */ class IconTextGridAdapter( - private val context: Context, - private val icons: IntArray, - private val titles: Array + context: Context, private val icons: IntArray, private val titles: Array ) : RecyclerView.Adapter() { private var layoutInflater: LayoutInflater = LayoutInflater.from(context) diff --git a/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt new file mode 100644 index 0000000..183396a --- /dev/null +++ b/app/src/main/java/com/casic/br/adapter/OtherDeviceAdapter.kt @@ -0,0 +1,70 @@ +package com.casic.br.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.diffDate +import com.casic.br.model.OtherDeviceListModel + +/** + * 汉威报警器Adapter + * */ +class OtherDeviceAdapter( + private val context: Context, + private val dataRows: MutableList +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_other_device_rv_g, parent, false) + ) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + val rowsModel = dataRows[position] + holder.deviceNameView.text = rowsModel.deviceName + Glide.with(context) + .load(rowsModel.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(holder.imageView) + holder.deviceModelView.text = rowsModel.productCode + holder.deviceUsedTimeView.text = String.format( + "已使用${rowsModel.createTime.toString().diffDate(true)}天" + ) + holder.rootView.setOnClickListener { + clickListener?.onItemClick(position) + } + } + + override fun getItemCount(): Int = dataRows.size + + private var clickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClick(position: Int) + } + + fun setOnItemClickListener(clickListener: OnItemClickListener?) { + this.clickListener = clickListener + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val rootView: LinearLayout = itemView.findViewById(R.id.rootView) + val deviceNameView: TextView = itemView.findViewById(R.id.deviceNameView) + val imageView: ImageView = itemView.findViewById(R.id.imageView) + val deviceModelView: TextView = itemView.findViewById(R.id.deviceModelView) + val deviceUsedTimeView: TextView = itemView.findViewById(R.id.deviceUsedTimeView) + } +} \ 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 38212ce..b63113d 100644 --- a/app/src/main/java/com/casic/br/extensions/String.kt +++ b/app/src/main/java/com/casic/br/extensions/String.kt @@ -16,6 +16,7 @@ import top.zibin.luban.OnCompressListener import java.io.File import java.text.ParseException +import java.text.SimpleDateFormat import java.util.* import kotlin.math.abs @@ -56,17 +57,22 @@ /** * 时间差-天 * */ -fun String.diffDate(): Int { +fun String.diffDate(needFormat: Boolean): Int { if (this.isBlank()) { return 0 } - try { - val diff = abs(System.currentTimeMillis() - this.toLong() * 1000L) - return (diff / (86400000)).toInt() - } catch (e: ParseException) { - e.printStackTrace() - } - return 0 + val diff = if (needFormat) { + val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + val date = simpleDateFormat.parse(this)!! + abs(System.currentTimeMillis() - date.time) + } else { + try { + abs(System.currentTimeMillis() - this.toLong() * 1000L) + } catch (e: ParseException) { + e.printStackTrace() + } + } as Long + return (diff / (86400000)).toInt() } fun String.separateResponseCode(): Int { @@ -121,6 +127,13 @@ "pc" -> "Wi-Fi智能插排" "cz" -> "Wi-Fi智能插座" "wg2" -> "智能网关" + "wsdcg" -> "温湿度传感器" + "ywbj" -> "火灾报警器" + "rqbj" -> "燃气报警器" + "cobj" -> "一氧化碳报警器" + "yinsj" -> "即热式台式饮水机" + "kj" -> "空气净化器" + "sd" -> "智能扫地机器人" else -> "其他" } } @@ -142,4 +155,18 @@ e.printStackTrace() } return R.drawable.ic_battery_0 +} + +fun String.convertValue(deciPoint: Int): Double { + if (this.isBlank()) { + return 0.0 + } + when (deciPoint) { + 0 -> return this.toDouble() + 1 -> return (this.toDouble()) / 10 + 2 -> return (this.toDouble()) / 100 + 3 -> return (this.toDouble()) / 1000 + 4 -> return (this.toDouble()) / 10000 + } + return this.toDouble() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/View.kt b/app/src/main/java/com/casic/br/extensions/View.kt new file mode 100644 index 0000000..d6723b6 --- /dev/null +++ b/app/src/main/java/com/casic/br/extensions/View.kt @@ -0,0 +1,20 @@ +package com.casic.br.extensions + +import android.view.View +import com.casic.br.utils.LocaleConstant + +fun View.disableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_DISABLE + this.isEnabled = false + view.forEach { + it?.isEnabled = false + } +} + +fun View.enableView(vararg view: View?) { + this.alpha = LocaleConstant.VIEW_ENABLE + this.isEnabled = true + view.forEach { + it?.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt index 1bb5d99..0625a15 100644 --- a/app/src/main/java/com/casic/br/extensions/ViewGroup.kt +++ b/app/src/main/java/com/casic/br/extensions/ViewGroup.kt @@ -4,6 +4,7 @@ import android.view.ViewGroup import com.casic.br.utils.LocaleConstant +//TODO 后期整合到View扩展函数去 fun ViewGroup.disableLayout(vararg view: View) { this.alpha = LocaleConstant.VIEW_DISABLE this.isEnabled = false @@ -19,11 +20,3 @@ it.isEnabled = true } } - -fun ViewGroup.disableView() { - this.isEnabled = false -} - -fun ViewGroup.enableView() { - this.isEnabled = true -} \ 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 58f9e46..fe1e87d 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -4,17 +4,20 @@ import android.graphics.Typeface import android.os.Handler import android.util.Log +import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter +import com.casic.br.adapter.OtherDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.extensions.selectCategory +import com.casic.br.model.OtherDeviceListModel import com.casic.br.model.RecommendModel import com.casic.br.utils.DeserializeModel 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.casic.br.vm.DeviceViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -34,7 +37,10 @@ private val kTag = "DevicePageFragment" private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var addedDeviceAdapter: AddedDeviceAdapter + private lateinit var otherDeviceAdapter: OtherDeviceAdapter + private lateinit var deviceViewModel: DeviceViewModel private var dataBeans: MutableList = ArrayList() + private var dataModes: MutableList = ArrayList() private var isRefresh = false override fun initLayoutView(): Int = R.layout.fragment_device @@ -47,6 +53,23 @@ override fun initData() { weakReferenceHandler = WeakReferenceHandler(callback) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.listModel.observe(this, { + if (it.code == 200) { + val deviceBeans = it.data?.rows!! + when { + isRefresh -> { + dataModes.clear() + dataModes = deviceBeans + isRefresh = false + } + else -> { + dataModes = deviceBeans + } + } + weakReferenceHandler.sendEmptyMessage(2022112301) + } + }) //TODO 热门推荐 val imageArray = arrayOf( @@ -82,6 +105,7 @@ override fun onResume() { super.onResume() + isRefresh = true TuyaHomeSdk.newHomeInstance(DeserializeModel.getHomeId()) .getHomeDetail(object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean) { @@ -103,6 +127,7 @@ Log.d(kTag, "onError: $errorMsg") } }) + deviceViewModel.obtainOtherDeviceListByPage() } private val callback = Handler.Callback { @@ -115,66 +140,96 @@ addedDeviceAdapter.setOnItemClickListener(object : AddedDeviceAdapter.OnItemClickListener { override fun onAddDeviceClick() { - if (DeserializeModel.isLogin()) { - requireContext().navigatePageTo() - } else { - requireContext().navigatePageTo() - } + requireContext().navigatePageTo() } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - if (DeserializeModel.isLogin()) { - val deviceModel = dataBeans[position] - val selectedCategory = deviceModel.selectCategory() - Log.d(kTag, "设备类型: $selectedCategory") - when { - selectedCategory.contains("rs") -> { - //热水器 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("yyj") -> { - //油烟机 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("bgl") -> { - //壁挂炉 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("rq") -> { - //燃气灶 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("pc") -> { - //排插 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("cz") -> { - //插座 - requireContext().navigatePageTo(deviceModel.devId) - } - selectedCategory.contains("wg2") -> { - //网关 - requireContext().navigatePageTo( - deviceModel.devId - ) - } - selectedCategory.contains("0204") -> { - //人体传感器 - requireContext().navigatePageTo() - } + val deviceModel = dataBeans[position] + val selectedCategory = deviceModel.selectCategory() + Log.d(kTag, "设备类型: $selectedCategory") + when (selectedCategory) { + "rs" -> { + //热水器 + requireContext().navigatePageTo(deviceModel.devId) } - } else { - requireContext().navigatePageTo() + "yyj" -> { + //油烟机 + requireContext().navigatePageTo(deviceModel.devId) + } + "bgl" -> { + //壁挂炉 + requireContext().navigatePageTo(deviceModel.devId) + } + "rq" -> { + //燃气灶 + requireContext().navigatePageTo(deviceModel.devId) + } + "pc" -> { + //排插 + requireContext().navigatePageTo(deviceModel.devId) + } + "cz" -> { + //插座 + requireContext().navigatePageTo(deviceModel.devId) + } + "wg2" -> { + //网关 + requireContext().navigatePageTo( + deviceModel.devId + ) + } + //TODO 人体传感器设备类型待确认 + "0204" -> { + //人体传感器 + requireContext().navigatePageTo() + } + "wsdcg" -> { + //温湿度传感器 + requireContext().navigatePageTo() + } + "ywbj" -> { + //火灾报警器 + requireContext().navigatePageTo() + } + "rqbj" -> { + //燃气报警器 + requireContext().navigatePageTo() + } + "cobj" -> { + //一氧化碳报警器 + requireContext().navigatePageTo() + } + "yinsj" -> { + //即热式台式饮水机 + requireContext().navigatePageTo(deviceModel.devId) + } + "kj" -> { + //空气净化器 + requireContext().navigatePageTo(deviceModel.devId) + } + "sd" -> { + //智能扫地机器人 + requireContext().navigatePageTo(deviceModel.devId) + } } } override fun onButtonClick(position: Int) { - if (DeserializeModel.isLogin()) { - moreOperate(position) - } else { - requireContext().navigatePageTo() - } + moreOperate(position) + } + }) + } + } else if (it.what == 2022112301) { + if (isRefresh) { + otherDeviceAdapter.notifyDataSetChanged() + } else { + otherDeviceAdapter = OtherDeviceAdapter(requireContext(), dataModes) + otherDeviceRecyclerView.adapter = otherDeviceAdapter + otherDeviceAdapter.setOnItemClickListener(object : + OtherDeviceAdapter.OnItemClickListener { + override fun onItemClick(position: Int) { + requireContext().navigatePageTo(dataModes[position].id) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 4b68f47..caaae87 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -105,7 +105,7 @@ } }) - //TODO 精选好物 + //TODO 现为模拟数据,待后期调整 val imageArray = arrayOf( "https://gw.alicdn.com/imgextra/i1/1638292152/O1CN01tMPitu1Rlf73Jrbsw_!!1638292152.jpg_Q75.jpg_.webp", "https://gw.alicdn.com/imgextra/i1/2286859561/O1CN01zrNz1S2KUzXGC5Qux_!!2286859561.jpg_Q75.jpg_.webp", diff --git a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt index 1ec1301..0991ac7 100644 --- a/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/cooker/StatusPageFragment.kt @@ -87,7 +87,7 @@ } 2022092903 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt index 4b983f3..5f16326 100644 --- a/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/fireplace/StatusPageFragment.kt @@ -125,7 +125,7 @@ } 2022092803 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt index cad6d98..865e6a7 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/ControlPageFragment.kt @@ -40,24 +40,24 @@ override fun initEvent() { //开关机 turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) - } - - lowSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) } } - highSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) - } - } - - maxSpeedRadioButton.setOnCheckedChangeListener { _, isChecked -> - if (isChecked) { - CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("low")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("high")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "10".createCommand("strong")) + } } } diff --git a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt index 0598a38..8c2728c 100644 --- a/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/rangehood/StatusPageFragment.kt @@ -151,7 +151,7 @@ } 2022092303 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt index a443a98..6689187 100644 --- a/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/shop/FavoriteFragment.kt @@ -39,7 +39,7 @@ //初始化轮播图 initBanner() - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val goodsModels = ArrayList() LocaleConstant.TEST_IMAGE.forEachIndexed { index, image -> val model = FeaturedGoodsModel() @@ -58,7 +58,7 @@ } }) - //TODO 模拟数据 + //TODO 现为模拟数据,待后期调整 val favoriteModels = ArrayList() LocaleConstant.TEST_ARRAY.forEach { val model = FavoriteModel() diff --git a/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt new file mode 100644 index 0000000..2267755 --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/HumidityPageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class HumidityPageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_humidity + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt new file mode 100644 index 0000000..2d8a2df --- /dev/null +++ b/app/src/main/java/com/casic/br/fragment/th/TemperaturePageFragment.kt @@ -0,0 +1,25 @@ +package com.casic.br.fragment.th + +import com.casic.br.R +import com.pengxh.kt.lite.base.KotlinBaseFragment + +class TemperaturePageFragment : KotlinBaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_temperature + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt index 2a8c6e9..e0b0397 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/ControlPageFragment.kt @@ -32,7 +32,6 @@ private var currentProgress = 0 private val timeScope = intArrayOf(30, 60, 120, 180) private var currentTimeProgress = 0 - private var isDeviceWorking = false override fun initLayoutView(): Int = R.layout.fragment_device_waterheater_control @@ -93,7 +92,11 @@ override fun initEvent() { turnOffRadioButton.setOnClickListener { - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(!isDeviceWorking)) + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } kitchenRadioButton.setOnClickListener { @@ -140,24 +143,21 @@ } }) - //单次 - onceRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(isChecked)) - } - - //点动 - initiateRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(isChecked)) - } - - //预约 - reservationRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(isChecked)) - } - - //增压 - pressureRadioButton.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(isChecked)) + functionRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.onceRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "101".createCommand(true)) + } + R.id.initiateRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "102".createCommand(true)) + } + R.id.reservationRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "109".createCommand(true)) + } + R.id.pressureRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "110".createCommand(true)) + } + } } //单次参数设定 @@ -182,8 +182,7 @@ parseObject.keys.forEach { when (it) { "1" -> {//开关机 - isDeviceWorking = parseObject[it] as Boolean - turnOffRadioButton.isChecked = isDeviceWorking + turnOffRadioButton.isChecked = parseObject[it] as Boolean } "2" -> { diff --git a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt index 7c5ba31..6421d62 100644 --- a/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/waterheater/StatusPageFragment.kt @@ -120,7 +120,7 @@ } 2022092603 -> { val deviceBean = message.obj as DeviceBean - deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate()}天") + deviceUsedTimeView.text = String.format("${deviceBean.time.toString().diffDate(false)}天") ipAddressView.text = deviceBean.ip paramObject.put("usageTime", deviceUsedTimeView.text) diff --git a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java index 1ffeedd..685068c 100644 --- a/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java +++ b/app/src/main/java/com/casic/br/model/FeaturedGoodsModel.java @@ -1,6 +1,7 @@ package com.casic.br.model; /** + * TODO 现为模拟数据,待后期调整 * 精选好物数据模型 */ public class FeaturedGoodsModel { diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java new file mode 100644 index 0000000..3058c1f --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceListModel.java @@ -0,0 +1,283 @@ +package com.casic.br.model; + +import java.util.List; + +public class OtherDeviceListModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String brandCode; + private String brandName; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/model/OtherDeviceModel.java b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java new file mode 100644 index 0000000..8be88b3 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/OtherDeviceModel.java @@ -0,0 +1,428 @@ +package com.casic.br.model; + +/** + * 其他设备数据模型 + */ +public class OtherDeviceModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String brandCode; + private String brandName; + private BusinessExtModel businessExt; + private String createTime; + private int deviceActive; + private String deviceActiveTime; + private String deviceAddress; + private int deviceBindUser; + private String deviceCoreParts; + private String deviceHardwareVersion; + private String deviceId; + private String deviceIp; + private String deviceMac; + private String deviceName; + private String deviceSoftwareVersion; + private int deviceStatus; + private String id; + private int iotDevice; + private String picUri; + private String produceDate; + private String productCode; + private String productName; + private String snCode; + private String supplierId; + private String supplierName; + private String updateTime; + + public String getBrandCode() { + return brandCode; + } + + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public BusinessExtModel getBusinessExt() { + return businessExt; + } + + public void setBusinessExt(BusinessExtModel businessExt) { + this.businessExt = businessExt; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public int getDeviceActive() { + return deviceActive; + } + + public void setDeviceActive(int deviceActive) { + this.deviceActive = deviceActive; + } + + public String getDeviceActiveTime() { + return deviceActiveTime; + } + + public void setDeviceActiveTime(String deviceActiveTime) { + this.deviceActiveTime = deviceActiveTime; + } + + public String getDeviceAddress() { + return deviceAddress; + } + + public void setDeviceAddress(String deviceAddress) { + this.deviceAddress = deviceAddress; + } + + public int getDeviceBindUser() { + return deviceBindUser; + } + + public void setDeviceBindUser(int deviceBindUser) { + this.deviceBindUser = deviceBindUser; + } + + public String getDeviceCoreParts() { + return deviceCoreParts; + } + + public void setDeviceCoreParts(String deviceCoreParts) { + this.deviceCoreParts = deviceCoreParts; + } + + public String getDeviceHardwareVersion() { + return deviceHardwareVersion; + } + + public void setDeviceHardwareVersion(String deviceHardwareVersion) { + this.deviceHardwareVersion = deviceHardwareVersion; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceIp() { + return deviceIp; + } + + public void setDeviceIp(String deviceIp) { + this.deviceIp = deviceIp; + } + + public String getDeviceMac() { + return deviceMac; + } + + public void setDeviceMac(String deviceMac) { + this.deviceMac = deviceMac; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getDeviceSoftwareVersion() { + return deviceSoftwareVersion; + } + + public void setDeviceSoftwareVersion(String deviceSoftwareVersion) { + this.deviceSoftwareVersion = deviceSoftwareVersion; + } + + public int getDeviceStatus() { + return deviceStatus; + } + + public void setDeviceStatus(int deviceStatus) { + this.deviceStatus = deviceStatus; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIotDevice() { + return iotDevice; + } + + public void setIotDevice(int iotDevice) { + this.iotDevice = iotDevice; + } + + public String getPicUri() { + return picUri; + } + + public void setPicUri(String picUri) { + this.picUri = picUri; + } + + public String getProduceDate() { + return produceDate; + } + + public void setProduceDate(String produceDate) { + this.produceDate = produceDate; + } + + public String getProductCode() { + return productCode; + } + + public void setProductCode(String productCode) { + this.productCode = productCode; + } + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getSnCode() { + return snCode; + } + + public void setSnCode(String snCode) { + this.snCode = snCode; + } + + public String getSupplierId() { + return supplierId; + } + + public void setSupplierId(String supplierId) { + this.supplierId = supplierId; + } + + public String getSupplierName() { + return supplierName; + } + + public void setSupplierName(String supplierName) { + this.supplierName = supplierName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public static class BusinessExtModel { + private String createTime; + private String deciPoint1; + private String deciPoint2; + private String deviceId; + private String id; + private String sensorCode1; + private String sensorCode2; + private String sensorType1; + private String sensorType2; + private String sensorVal1; + private String sensorVal2; + private String sensorValUnit1; + private String sensorValUnit2; + private String updateTime; + private String workStatus1; + private String workStatus2; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDeciPoint1() { + return deciPoint1; + } + + public void setDeciPoint1(String deciPoint1) { + this.deciPoint1 = deciPoint1; + } + + public String getDeciPoint2() { + return deciPoint2; + } + + public void setDeciPoint2(String deciPoint2) { + this.deciPoint2 = deciPoint2; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSensorCode1() { + return sensorCode1; + } + + public void setSensorCode1(String sensorCode1) { + this.sensorCode1 = sensorCode1; + } + + public String getSensorCode2() { + return sensorCode2; + } + + public void setSensorCode2(String sensorCode2) { + this.sensorCode2 = sensorCode2; + } + + public String getSensorType1() { + return sensorType1; + } + + public void setSensorType1(String sensorType1) { + this.sensorType1 = sensorType1; + } + + public String getSensorType2() { + return sensorType2; + } + + public void setSensorType2(String sensorType2) { + this.sensorType2 = sensorType2; + } + + public String getSensorVal1() { + return sensorVal1; + } + + public void setSensorVal1(String sensorVal1) { + this.sensorVal1 = sensorVal1; + } + + public String getSensorVal2() { + return sensorVal2; + } + + public void setSensorVal2(String sensorVal2) { + this.sensorVal2 = sensorVal2; + } + + public String getSensorValUnit1() { + return sensorValUnit1; + } + + public void setSensorValUnit1(String sensorValUnit1) { + this.sensorValUnit1 = sensorValUnit1; + } + + public String getSensorValUnit2() { + return sensorValUnit2; + } + + public void setSensorValUnit2(String sensorValUnit2) { + this.sensorValUnit2 = sensorValUnit2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWorkStatus1() { + return workStatus1; + } + + public void setWorkStatus1(String workStatus1) { + this.workStatus1 = workStatus1; + } + + public String getWorkStatus2() { + return workStatus2; + } + + public void setWorkStatus2(String workStatus2) { + this.workStatus2 = workStatus2; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 0f56d4c..9a05cee 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -13,9 +13,9 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN + Manifest.permission.CAMERA, Manifest.permission.BLUETOOTH_ADMIN, + Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH ) val SHOP_IMAGE = intArrayOf( R.drawable.ic_gouwuche, R.drawable.ic_dingdan, R.drawable.ic_shouhou @@ -23,10 +23,8 @@ val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") val SHOP_PAGE_OPERATE = arrayOf("推荐", "智能厨房", "智能家居", "配件") val SERVER_IMAGE = intArrayOf( - R.drawable.ic_daifukuan, - R.drawable.ic_daifuwu, - R.drawable.ic_fuwuzhong, - R.drawable.ic_pingjia + R.drawable.ic_daifukuan, R.drawable.ic_daifuwu, + R.drawable.ic_fuwuzhong, R.drawable.ic_pingjia ) val SERVER_OPERATE = arrayOf("待付款", "待服务", "服务中", "评价") val USER_OPERATE = arrayOf("账号安全", "账号绑定", "支付管理", "地址管理", "系统设置") @@ -34,6 +32,7 @@ val SETTINGS_OPERATE = arrayOf("通知设置", "清除缓存", "服务协议", "隐私声明", "关于我们") val HOME_FUNC_OPERATE = arrayOf("户号管理", "燃气缴费", "历史账单", "用气分析", "服务网点", "采暖补贴") val DEVICE_PAGE_TITLE = arrayOf("设备控制", "状态显示", "服务设置") + val T_H_PAGE_TITLE = arrayOf("温度记录", "湿度记录") val CONNECT_IMAGE = intArrayOf(R.drawable.ic_kefu, R.drawable.ic_weixiu) val CONNECT_ARRAY = arrayOf("客服电话", "抢修电话") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1dc6fb1..cc48b70 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -27,7 +27,7 @@ /** * 退出登录 */ - @GET("/user/logout") + @GET("/sys/user/logout") suspend fun loginOut(@Header("token") token: String): String /** @@ -155,4 +155,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 汉威设备列表 + */ + @POST("/deviceInfo/listPage") + suspend fun obtainOtherDeviceListByPage( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 汉威设备详情 + */ + @POST("/deviceInfo/detail") + suspend fun obtainDeviceDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 4d105c3..bec22c5 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -315,4 +315,35 @@ ) return api.updateMessageById(AuthenticationHelper.token!!, requestBody) } + + /** + * 汉威设备列表 + */ + suspend fun obtainOtherDeviceListByPage(): String { + val paramObject = JSONObject() + paramObject.put("brandName", "hanwei") + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = 1 + return api.obtainOtherDeviceListByPage( + AuthenticationHelper.token!!, requestBody, limitMap, offsetMap + ) + } + + /** + * 汉威设备详情 + */ + suspend fun obtainDeviceDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.obtainDeviceDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt index 6b38073..41987b6 100644 --- a/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressManagerActivity.kt @@ -1,6 +1,5 @@ package com.casic.br.view -import android.content.Context import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 2c9d9bd..978a9d2 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -20,8 +20,6 @@ import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk import kotlinx.android.synthetic.main.activity_login.* -import kotlinx.android.synthetic.main.activity_login.userPhoneView -import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { @@ -36,6 +34,9 @@ } override fun initData() { + userPhoneView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + passwordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] } @@ -56,6 +57,8 @@ "请输入密码".show(this) return@setOnClickListener } + SaveKeyValues.putValue(LocaleConstant.ACCOUNT, userPhone) + SaveKeyValues.putValue(LocaleConstant.PASSWORD, userPassword) LoadingDialogHub.show(this, "登录中,请稍后") TuyaHomeSdk.getUserInstance().loginWithPhonePassword( diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index 0d0934d..2575c1a 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -17,6 +17,7 @@ import com.casic.br.vm.UserViewModel 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.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues @@ -70,13 +71,21 @@ mainViewPager.currentItem = 0 } R.id.nav_device -> { - mainViewPager.currentItem = 1 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 1 + } else { + navigatePageTo() + } } R.id.nav_shop -> { mainViewPager.currentItem = 2 } R.id.nav_message -> { - mainViewPager.currentItem = 3 + if (DeserializeModel.isLogin()) { + mainViewPager.currentItem = 3 + } else { + navigatePageTo() + } } R.id.nav_mine -> { mainViewPager.currentItem = 4 diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index c9e732d..7d84581 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -15,12 +15,8 @@ import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -import kotlinx.android.synthetic.main.include_left_back_title.* class SelectWiFiActivity : KotlinBaseActivity() { diff --git a/app/src/main/java/com/casic/br/view/SettingsActivity.kt b/app/src/main/java/com/casic/br/view/SettingsActivity.kt index 2c89b31..c08d8d2 100644 --- a/app/src/main/java/com/casic/br/view/SettingsActivity.kt +++ b/app/src/main/java/com/casic/br/view/SettingsActivity.kt @@ -1,18 +1,31 @@ package com.casic.br.view +import android.graphics.Color +import android.util.Log +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.casic.br.R import com.casic.br.adapter.IconTextListAdapter +import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback import kotlinx.android.synthetic.main.activity_settings.* import kotlinx.android.synthetic.main.include_base_title.* + class SettingsActivity : KotlinBaseActivity() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.activity_settings override fun setupTopBarLayout() { @@ -24,6 +37,8 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + val settingsListAdapter = IconTextListAdapter(this, LocaleConstant.SETTINGS_OPERATE) settingsRecyclerView.addItemDecoration( DividerItemDecoration(this, DividerItemDecoration.VERTICAL) @@ -44,10 +59,39 @@ } override fun observeRequestState() { - + userViewModel.outResultModel.observe(this, { + if (it.code == 200) { + AuthenticationHelper.removeToken() + this.navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) } override fun initEvent() { + loginOutButton.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("永久退出", "退出当前")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> TuyaHomeSdk.getUserInstance() + .cancelAccount(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SettingsActivity => onError: $error") + } + override fun onSuccess() { + userViewModel.out() + } + }) + 1 -> userViewModel.out() + } + } + }) + .build().show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt new file mode 100644 index 0000000..9a1c984 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/AirCleanerActivity.kt @@ -0,0 +1,375 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_air_cleaner.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 空气净化器 + * TODO 数据上报暂缓 + * */ +class AirCleanerActivity : KotlinBaseActivity() { + + private val context: Context = this@AirCleanerActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_air_cleaner + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "AirCleanerActivity => onDpUpdate: $dpStr") + //{"1":true,"11":false,"19":"cancle","2":6,"20":0,"22":"1","3":"1","4":"1","5":99,"6":true,"7":false} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> { + //设备开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "2" -> { + //pm2.5 + particulateView.text = parseObject[it].toString() + } + "3" -> { + //模式 + when (parseObject[it]) { + "0" -> manualRadioButton.isChecked = true + "1" -> autoRadioButton.isChecked = true + "2" -> sleepRadioButton.isChecked = true + "3" -> potentRadioButton.isChecked = true + } + } + "4" -> { + //风速 + when (parseObject[it]) { + "1" -> lowSpeedRadioButton.isChecked = true + "2" -> mediumSpeedRadioButton.isChecked = true + "3" -> highSpeedRadioButton.isChecked = true + } + } + "5" -> { + //滤芯剩余量 + filterElementView.text = "${parseObject[it]}%" + } + "6" -> { + //负离子 + anionStatusSwitch.isChecked = parseObject[it] as Boolean + } + "7" -> { + //童锁 + val c = parseObject[it] as Boolean + childStatusSwitch.isChecked = c + if (c) { + turnOffRadioButton.disableView() + modeRadioGroup.disableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.disableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.disableView(anionStatusSwitch) + countDownLayout.disableView() + resetFilterLayout.disableView() + } else { + turnOffRadioButton.enableView() + modeRadioGroup.enableView( + manualRadioButton, + autoRadioButton, + sleepRadioButton, + potentRadioButton + ) + speedRadioGroup.enableView( + lowSpeedRadioButton, + mediumSpeedRadioButton, + highSpeedRadioButton + ) + anionLayout.enableView(anionStatusSwitch) + countDownLayout.enableView() + resetFilterLayout.enableView() + } + } + "11" -> { + //滤芯复位 + } + "19" -> { + //倒计时 + } + "20" -> { + //倒计时剩余 + } + "22" -> { + //空气质量 + when (parseObject[it]) { + "1" -> { + airQualityView.text = "优" + airQualityView.setTextColor( + R.color.greenColor.convertColor( + context + ) + ) + } + "2" -> { + airQualityView.text = "良" + airQualityView.setTextColor( + R.color.mainThemeColor.convertColor( + context + ) + ) + } + else -> { + airQualityView.text = "差" + airQualityView.setTextColor( + R.color.redTextColor.convertColor( + context + ) + ) + } + } + } + } + } + } + }) + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "AirCleanerActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.manualRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("0")) + } + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("1")) + } + R.id.sleepRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("2")) + } + R.id.potentRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "3".createCommand("3")) + } + } + } + + speedRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.lowSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("1")) + } + R.id.mediumSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("2")) + } + R.id.highSpeedRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "4".createCommand("3")) + } + } + } + + anionStatusSwitch.setOnClickListener { + if (anionStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "6".createCommand(false)) + } + } + + childStatusSwitch.setOnClickListener { + if (childStatusSwitch.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "7".createCommand(false)) + } + } + + countDownLayout.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("不设置定时", "1h", "2h", "4h", "8h")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + //cancle,1,2,3,4 + val value = when (position) { + 0 -> "cancle" + 1 -> "1" + 2 -> "2" + 3 -> "3" + 4 -> "4" + else -> "cancle" + } + CommandManager.sendTuyaDp(deviceInstance, "19".createCommand(value)) + } + }) + .build().show() + } + + resetFilterLayout.setOnClickListener { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("滤芯复位") + .setMessage("确定要复位滤芯么?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + CommandManager.sendTuyaDp(deviceInstance, "11".createCommand(true)) + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt new file mode 100644 index 0000000..68aa36e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/CoSensorActivity.kt @@ -0,0 +1,149 @@ +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.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.timestampToCompleteDate +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_co_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +class CoSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_co_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) + 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 == "cobj") { + //一氧化碳报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102003 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102003) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + /** + * {"11":0,"1":"2","15":100} + * + * 11 - 故障告警 + * 1 - CO检测状态 + * 15 - 电池电量 + * */ + val dataMap = HashMap() + if (it.isOnline) { + val value = it.dps["15"].toString() + batteryView.setBackgroundResource(value.toBatteryImage()) + batteryValueView.text = "${value}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val c = it.dps["1"] as String + coAlarmView.text = if (c == "2") { + "正常" + } else { + "异常" + } + coAlarmTimeView.text = if (coAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + coAlarmView.text = "已离线" + coAlarmTimeView.text = "--:--:--" + } + + dataLinkedList.add(dataMap) + } + } + 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/FireSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt new file mode 100644 index 0000000..acfb14a --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/FireSensorActivity.kt @@ -0,0 +1,179 @@ +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.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.* +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_co_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.* +import kotlinx.android.synthetic.main.activity_fire_senser.batteryValueView +import kotlinx.android.synthetic.main.activity_fire_senser.batteryView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceLogoView +import kotlinx.android.synthetic.main.activity_fire_senser.deviceStateView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmTimeView +import kotlinx.android.synthetic.main.activity_fire_senser.faultAlarmView +import kotlinx.android.synthetic.main.activity_fire_senser.rootView +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 火灾报警器 + * TODO 数据上报暂缓 + * */ +class FireSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_fire_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) + //每隔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 == "ywbj") { + //火灾报警器 + val msg = weakReference.obtainMessage() + msg.what = 2022102002 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102002) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal","15":100,"4":false} + * + * {"11":{"name":"故障告警"},"1":{"name":"烟雾检测状态"},"4":{"name":"防拆报警"},"15":{"name":"电池电量"}} + * */ + + val b = it.dps["15"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val t = it.dps["4"] as Boolean + tamperAlarmView.text = if (!t) { + "正常" + } else { + "异常" + } + tamperAlarmTimeView.text = if (tamperAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + + tamperAlarmView.text = "已离线" + tamperAlarmTimeView.text = "--:--:--" + } +// dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + dataLinkedList.add(dataMap) + } + } + true + } + + override fun initEvent() { + createSceneLayout.setOnClickListener { + "后续功能待完善".show(this) + } + } + + 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/GasSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt new file mode 100644 index 0000000..829eeaa --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/GasSensorActivity.kt @@ -0,0 +1,144 @@ +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.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.utils.DeserializeModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +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_ch4_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* + +/** + * 可燃气体探测器 + * TODO 数据上报暂缓 + * */ +class GasSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + + override fun initLayoutView(): Int = R.layout.activity_ch4_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) + //每隔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 == "rqbj") { + val msg = weakReference.obtainMessage() + msg.what = 2022102101 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "GasSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022102101) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + + deviceStateView.text = if (it.isOnline) { + "在线" + } else { + "离线" + } + + titleView.text = it.name + Glide.with(this) + .load(it.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + val dataMap = HashMap() + if (it.isOnline) { + /** + * {"11":0,"1":"normal"} + * + * {"fault":{"id":"11","name":"故障告警"},"gas_sensor_state":{"id":"1","name":"燃气检测状态"}} + * */ + val f = it.dps["11"] + faultAlarmView.text = if (f == 0) { + "正常" + } else { + "异常" + } + faultAlarmTimeView.text = if (faultAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + + val s = it.dps["1"] as String + fireAlarmView.text = if (s == "normal") { + "正常" + } else { + "异常" + } + fireAlarmTimeView.text = if (fireAlarmView.text.toString() == "异常") { + System.currentTimeMillis().timestampToCompleteDate() + } else { + "--:--:--" + } + } else { + faultAlarmView.text = "已离线" + faultAlarmTimeView.text = "--:--:--" + + fireAlarmView.text = "已离线" + fireAlarmTimeView.text = "--:--:--" + } + dataLinkedList.add(dataMap) + } + } + 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/HWGasAlarmActivity.kt b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt new file mode 100644 index 0000000..23f5357 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/HWGasAlarmActivity.kt @@ -0,0 +1,93 @@ +package com.casic.br.view.device + +import android.view.View +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.convertValue +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.vm.DeviceViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_gas_alarm_hw.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 汉威报警器 + * */ +class HWGasAlarmActivity : KotlinBaseActivity() { + + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_gas_alarm_hw + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> { + LoadingDialogHub.show(this, "加载数据中...") + } + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + rightOperateView.visibility = View.GONE + } + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + deviceViewModel.obtainDeviceDetail(id) + deviceViewModel.deviceModel.observe(this, { + if (it.code == 200) { + val sensorData = it.data.businessExt + + Glide.with(this) + .load(it.data.picUri.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceStateView.text = if (it.data.deviceActive == 1) { + "在线" + } else { + "离线" + } + + //取数据小数点位 + tempValueView.text = + "${sensorData.sensorVal2.convertValue(sensorData.deciPoint2.toInt())}${sensorData.sensorValUnit2}" + sensorValueView.text = + "${sensorData.sensorVal1.convertValue(sensorData.deciPoint1.toInt())}${sensorData.sensorValUnit1}" + + updateTimeView.text = sensorData.updateTime + + tempStateView.text = sensorData.workStatus2 + sensorStateView.text = sensorData.workStatus1 + } + }) + } + + override fun initEvent() { + showMoreView.setOnClickListener { + "此功能待后续完善".show(this) + } + } +} \ No newline at end of file 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 index 5ecd0c8..adb9446 100644 --- a/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/MotionSensorActivity.kt @@ -63,7 +63,7 @@ override fun onSuccess(bean: HomeBean) { bean.deviceList.forEach { val selectedCategory = it.selectCategory() - if (selectedCategory.contains("0204")) { + if (selectedCategory == "0204") { //人体传感器 val msg = weakReference.obtainMessage() msg.what = 2022102001 @@ -83,35 +83,37 @@ 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) + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" } - motionAdapter.notifyDataSetChanged() - } else { - Log.d(kTag, "未检测到人体数据") + titleView.text = it.name + Glide.with(this) + .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 diff --git a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt index 68a0785..09f0e3a 100644 --- a/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/PowerStripActivity.kt @@ -12,7 +12,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet @@ -60,13 +59,12 @@ "查询设备信息失败,请检查设备是否已离线".show(this) return } - Log.d(kTag, deviceBean.dps.toJson()) titleView.text = deviceBean.toChineseTypeName() deviceBean.dpName.entries.forEach { when (it.key) { - "1" -> firstNameView.text = it.value - "2" -> secondNameView.text = it.value - "3" -> thirdNameView.text = it.value + "1" -> firstTurnOffCheckBox.text = it.value + "2" -> secondTurnOffCheckBox.text = it.value + "3" -> thirdTurnOffCheckBox.text = it.value } } deviceBean.dps.entries.forEach { diff --git a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt index 4ea83fc..e613a61 100644 --- a/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/SingleStripActivity.kt @@ -135,8 +135,12 @@ .build().show() } - turnOffCheckBox.setOnCheckedChangeListener { _, isChecked -> - CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(isChecked)) + turnOffCheckBox.setOnClickListener { + if (turnOffCheckBox.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } } } diff --git a/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt new file mode 100644 index 0000000..41cabdd --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/SweepingRobotActivity.kt @@ -0,0 +1,301 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.toChineseTypeName +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.robot.RobotSettingsActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_sweeping_robot.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能扫地机器人 + * TODO 数据上报暂缓 + * */ +class SweepingRobotActivity : KotlinBaseActivity() { + + private val context: Context = this@SweepingRobotActivity + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_sweeping_robot + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "SweepingRobotActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "1" -> {//设备开关,不是工作开关 + + } + "11" -> { + //故障 + } + "14" -> { + //剩余电量 + batteryValueView.text = "${parseObject[it]}%" + } + "25" -> { + //Power on button,工作开关 + turnOffRadioButton.isChecked = parseObject[it] as Boolean + } + "26" -> { + //清扫方向 + + } + "27" -> { + //工作模式 + when (parseObject[it]) { + "0" -> turnOffRadioButton.isChecked = parseObject[it] as Boolean + "1" -> autoRadioButton.isChecked = true + "2" -> pointRadioButton.isChecked = true + "3" -> {} + "4" -> edgeRadioButton.isChecked = true + "5" -> rechargeRadioButton.isChecked = true + "6" -> {} + "7" -> {} + "8" -> {} + "9" -> {} + "10" -> {} + "11" -> {} + "12" -> {} + "13" -> {} + "14" -> {} + "15" -> {} + } + } + "29" -> { + //打扫速度 + } + "30" -> { + //工作状态 + workStateView.text = when (parseObject[it]) { + "1" -> "工作中" + "2" -> "停止中" + "3" -> "充电中" + "4" -> "找回充电" + "5" -> "休眠中" + "6" -> "报错中" + "7" -> "升级中" + "8" -> "寻回机器中" + "9" -> "功能演示中" + else -> "备用中" + } + } + "31" -> { + //UV灯 + } + "32" -> { + //语言包 + } + "33" -> { + //静音模式 + } + "34" -> { + //寻回 + } + "35" -> { + //机器时间同步 + } + "38" -> { + //清扫时间 + workingTimeView.text = "${parseObject[it]}min" + } + "43" -> { + //声音 + } + "44" -> { + //清扫强度 + } + "45" -> { + //清扫记录 + } + "46" -> { + //累计面积 + } + "47" -> { + //累计次数 + } + "48" -> { + //累计时间 + } + "49" -> { + //耗材使用 + } + } + } + } + }) + + turnOffRadioButton.setOnClickListener { + if (turnOffRadioButton.isChecked) { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "1".createCommand(false)) + } + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.autoRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("1")) + } + R.id.pointRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("2")) + } + R.id.edgeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("4")) + } + R.id.rechargeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "27".createCommand("5")) + } + R.id.cycleRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "34".createCommand(true)) + } + } + } + + timeConfigLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + cleanRecordLayout.setOnClickListener { + "此功能待后续完善".show(context) + } + + settingsLayout.setOnClickListener { + navigatePageTo(deviceId) + } + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "SweepingRobotActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "25") + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt new file mode 100644 index 0000000..e60f833 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/TAndHSensorActivity.kt @@ -0,0 +1,144 @@ +package com.casic.br.view.device + +import android.os.Handler +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import com.casic.br.R +import com.casic.br.adapter.TabPagerAdapter +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.extensions.selectCategory +import com.casic.br.extensions.toBatteryImage +import com.casic.br.fragment.th.HumidityPageFragment +import com.casic.br.fragment.th.TemperaturePageFragment +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LocaleConstant +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +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_t_h_senser.* +import kotlinx.android.synthetic.main.include_device_title.* +import java.util.* +import kotlin.collections.HashMap + +/** + * 温湿度传感器 + * TODO 数据上报暂缓 + * */ +class TAndHSensorActivity : KotlinBaseActivity() { + + private val dataTimer by lazy { Timer() }//数据上传Timer + private val dataLinkedList = LinkedList>() + private lateinit var weakReference: WeakReferenceHandler + private var fragmentPages: ArrayList = ArrayList() + + override fun initLayoutView(): Int = R.layout.activity_t_h_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) + //每隔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 == "wsdcg") { + //温湿度传感器 + val msg = weakReference.obtainMessage() + msg.what = 2022112001 + msg.obj = it + weakReference.sendMessage(msg) + } + } + } + + override fun onError(errorCode: String, errorMsg: String) { + Log.d("Casic", "TAndHSensorActivity => onError: $errorMsg") + } + }) + } + }, 0, 5000) + + fragmentPages.add(TemperaturePageFragment()) + fragmentPages.add(HumidityPageFragment()) + viewPager.adapter = + TabPagerAdapter(fragmentPages, LocaleConstant.T_H_PAGE_TITLE, supportFragmentManager) + tabLayout.setupWithViewPager(viewPager) + } + + private val callback = Handler.Callback { message -> + if (message.what == 2022112001) { + if (!this.isDestroyed) { + val it = message.obj as DeviceBean + deviceStateView.text = if (it.isOnline) { + "设备在线" + } else { + "设备已离线" + } + titleView.text = String.format(it.name + "传感器") + + val dataMap = HashMap() + if (it.isOnline) { + val h = it.dps["101"].toString() + //温湿度的值需要缩小100倍 + humidityView.text = if (h.isBlank()) { + "0%" + } else { + "${h.toDouble() / 100}%" + } + dataMap["humidity"] = humidityView.text.toString().replace("%", "") + + val b = it.dps["102"].toString() + batteryView.setBackgroundResource(b.toBatteryImage()) + batteryValueView.text = "${b}%" + + val t = it.dps["103"].toString() + //{"unit":"℃","min":-2000,"max":10000,"scale":2,"step":1,"type":"value"} + temperatureView.text = if (h.isBlank()) { + "0${resources.getString(R.string.temperature_unit)}" + } else { + "${t.toDouble() / 100}${resources.getString(R.string.temperature_unit)}" + } + dataMap["temperature"] = temperatureView.text.toString().replace("°C", "") + } else { + batteryView.setBackgroundResource("0".toBatteryImage()) + batteryValueView.text = "0%" + + temperatureView.text = "已离线" + + humidityView.text = "已离线" + } + + dataLinkedList.add(dataMap) + } + } + 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/WaterDispenserActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt new file mode 100644 index 0000000..9d4829f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/WaterDispenserActivity.kt @@ -0,0 +1,265 @@ +package com.casic.br.view.device + +import android.content.Context +import android.graphics.Color +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.br.R +import com.casic.br.extensions.* +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.casic.br.view.device.waterdispenser.WaterConfigActivity +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.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.tuya.smart.android.device.bean.UpgradeInfoBean +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IGetOtaInfoCallback +import com.tuya.smart.sdk.api.IResultCallback +import com.tuya.smart.sdk.api.ITuyaDevice +import com.tuya.smart.sdk.api.ITuyaOta +import kotlinx.android.synthetic.main.activity_water_dispenser.* +import kotlinx.android.synthetic.main.include_device_title.* + +/** + * 智能网关 + * TODO 数据上报暂缓 + * */ +class WaterDispenserActivity : KotlinBaseActivity() { + + private val context: Context = this@WaterDispenserActivity + private lateinit var deviceId: String + private lateinit var tuyaOTA: ITuyaOta + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_water_dispenser + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + initLayoutImmersionBar(rootView) + ImmersionBar.with(this).statusBarDarkFont(true).init() + + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + tuyaOTA = TuyaHomeSdk.newOTAInstance(deviceId) + //控制设备前必须初始家庭化数据,每次 App 活跃期间,初始化一次即可。 + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + val deviceBean = TuyaHomeSdk.getDataInstance().getDeviceBean(deviceId) + if (deviceBean == null) { + "查询设备信息失败,请检查设备是否已离线".show(this) + return + } + titleView.text = deviceBean.toChineseTypeName() + Glide.with(this) + .load(deviceBean.iconUrl) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(deviceLogoView) + + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "WaterDispenserActivity => onDpUpdate: $dpStr") + //{"10":0,"101":29,"102":300,"103":false,"104":"300ml","105":"milk","106":true,"3":45,"7":30} + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + targetWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "7" -> { + //当前水温 + } + "10" -> { + //故障 + } + "101" -> { + //进水水温 + importWaterTempView.text = String.format( + "${parseObject[it]}${resources.getString(R.string.temperature_unit)}" + ) + } + "102" -> {} + "103" -> { + //出水开关 + switchCheckBox.isChecked = parseObject[it] as Boolean + } + "104" -> { + //出水量 + outputWaterView.text = when (parseObject[it]) { + "wuxian" -> "无限" + else -> parseObject[it] as String + } + } + "105" -> { + //水温模式 + waterModeView.text = when (parseObject[it]) { + "normal" -> "常温" + "milk" -> "冲牛奶" + "coffee" -> "冲咖啡" + "boiling_water" -> "开水" + else -> "自定义" + } + + when (parseObject[it]) { + "normal" -> normalRadioButton.isChecked = true + "milk" -> milkRadioButton.isChecked = true + "coffee" -> coffeeRadioButton.isChecked = true + "boiling_water" -> boiledRadioButton.isChecked = true + else -> customRadioButton.isChecked = true + } + } + "106" -> { + childCheckBox.isChecked = parseObject[it] as Boolean + } + } + } + } + }) + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "1") + } + + override fun initEvent() { + rightOperateView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("固件升级", "移除设备")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> { + tuyaOTA.getOtaInfo(object : IGetOtaInfoCallback { + override fun onSuccess(upgradeInfoBeans: MutableList?) { + if (upgradeInfoBeans.isNullOrEmpty()) { + "无新版本可用".show(context) + } + val mainModel = upgradeInfoBeans!![0] + when (mainModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "主联网模组无新版本可用".show(context) + } + + val mcuModel = upgradeInfoBeans[1] + when (mcuModel.upgradeStatus) { + 1 -> updateVersion() + 2 -> { + + } + else -> "MCU模块无新版本可用".show(context) + } + } + + override fun onFailure(code: String?, error: String?) { + + } + }) + } + 1 -> deviceInstance.removeDevice(object : IResultCallback { + override fun onError(code: String?, error: String?) { + Log.d("Casic", "WaterDispenserActivity => onError: $error") + } + + override fun onSuccess() { + finish() + } + }) + } + } + }) + .build().show() + } + + modeRadioGroup.setOnCheckedChangeListener { _, checkedId -> + when (checkedId) { + R.id.normalRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("normal")) + } + R.id.milkRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("milk")) + } + R.id.coffeeRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("coffee")) + } + R.id.boiledRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("boiling_water")) + } + R.id.customRadioButton -> { + CommandManager.sendTuyaDp(deviceInstance, "105".createCommand("customize")) + } + } + } + + childCheckBox.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + //童锁状态下不能出水 + switchCheckBox.isEnabled = false + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(true)) + } else { + switchCheckBox.isEnabled = true + CommandManager.sendTuyaDp(deviceInstance, "106".createCommand(false)) + + switchCheckBox.setOnCheckedChangeListener { _, switchIsChecked -> + if (switchIsChecked) { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(true)) + } else { + CommandManager.sendTuyaDp(deviceInstance, "103".createCommand(false)) + } + } + } + } + + settingsCheckBox.setOnClickListener { + navigatePageTo(deviceId) + } + } + + private fun updateVersion() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("版本升级") + .setMessage("有新版本可以升级,是否升级?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + tuyaOTA.startOta() + } + + override fun onConfirmClick() { + + } + }) + .build().show() + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt index 3b5cff9..22685d9 100644 --- a/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt +++ b/app/src/main/java/com/casic/br/view/device/WaterHeaterActivity.kt @@ -55,7 +55,6 @@ ImmersionBar.with(this).statusBarDarkFont(true).init() leftBackView.setOnClickListener { finish() } - titleView.text = intent.getStringExtra(Constant.INTENT_PARAM) } override fun initData() { diff --git a/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt new file mode 100644 index 0000000..532642f --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/AddTimeConfigActivity.kt @@ -0,0 +1,33 @@ +package com.casic.br.view.device.robot + +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.include_left_back_title.* + +class AddTimeConfigActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_robot_add_time + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "定时" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt new file mode 100644 index 0000000..02ea655 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/robot/RobotSettingsActivity.kt @@ -0,0 +1,104 @@ +package com.casic.br.view.device.robot + +import android.util.Log +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.utils.CommandManager +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_robot_settings.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RobotSettingsActivity : KotlinBaseActivity() { + + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_robot_settings + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "耗材维护" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + Log.d("Casic", "RobotSettingsActivity => onDpUpdate: $dpStr") + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + if (it == "49") { + //TODO 待定 + val any = parseObject[it] + } + } + } + }) + } + + override fun initEvent() { + clearBatteryButton.setOnClickListener { + showDialog() + } + + clearFilterButton.setOnClickListener { + showDialog() + } + + clearMiddleButton.setOnClickListener { + showDialog() + } + + clearEdgeButton.setOnClickListener { + showDialog() + } + } + + private fun showDialog() { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("是否清除记录?如果没有更换耗材而清除记录将会导致数据错误") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //TODO 待定 +// CommandManager.sendTuyaDp(deviceInstance, "49".createCommand("64")) + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + //每次获取焦点都查询设备的开关机状态 + CommandManager.getTuyaDp(deviceInstance, "49") + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt new file mode 100644 index 0000000..3653425 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/device/waterdispenser/WaterConfigActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.view.device.waterdispenser + +import com.alibaba.fastjson.JSONObject +import com.casic.br.R +import com.casic.br.extensions.createCommand +import com.casic.br.utils.CommandManager +import com.casic.br.utils.SliderCallback +import com.casic.br.utils.TuyaDeviceListener +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.qmuiteam.qmui.widget.QMUISlider +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.ITuyaDevice +import kotlinx.android.synthetic.main.activity_add_water_config.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import kotlin.math.abs + +class WaterConfigActivity : KotlinBaseActivity() { + + private val minTemp = 40 + private var maxTemp = 100 + private var currentProgress = 0 + private val volumeScope = intArrayOf(150, 300, 1000) + private var currentTimeProgress = 0 + private lateinit var deviceInstance: ITuyaDevice + + override fun initLayoutView(): Int = R.layout.activity_add_water_config + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainBackColor.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.text = "即热式台式饮水机" + } + + override fun initData() { + val deviceId = intent.getStringExtra(Constant.INTENT_PARAM)!! + deviceInstance = TuyaHomeSdk.newDeviceInstance(deviceId) + + setTemperatureScope() + setVolumeScope() + + CommandManager.getTuyaDp(deviceInstance, "3") + CommandManager.getTuyaDp(deviceInstance, "104") + deviceInstance.registerDevListener(object : TuyaDeviceListener() { + override fun onDpUpdate(devId: String?, dpStr: String?) { + val parseObject = JSONObject.parseObject(dpStr) + parseObject.keys.forEach { + when (it) { + "3" -> { + //目标水温度 + val tempValue = parseObject[it] as Int + currentTempView.text = String.format( + "$tempValue${resources.getString(R.string.temperature_unit)}" + ) + //转为刻度 + temperatureSlider.currentProgress = tempValue - minTemp + } + "104" -> { + //出水量 + when (val volumeValue = parseObject[it] as String) { + "150ml" -> { + volumeSeekBar.currentProgress = 0 + currentVolumeView.text = volumeValue + } + "300ml" -> { + volumeSeekBar.currentProgress = 1 + currentVolumeView.text = volumeValue + } + else -> { + volumeSeekBar.currentProgress = 2 + currentVolumeView.text = "无限" + } + } + } + } + } + } + }) + } + + /** + * 设置温度范围 + * */ + private fun setTemperatureScope() { + temperatureSlider.tickCount = abs(maxTemp - minTemp) + temperatureSlider.currentProgress = currentProgress + currentTempView.text = String.format( + "${minTemp + currentProgress}${resources.getString(R.string.temperature_unit)}" + ) + minTempView.text = minTemp.toString() + maxTempView.text = maxTemp.toString() + } + + /** + * 设置出水量范围 + * */ + private fun setVolumeScope() { + volumeSeekBar.tickCount = volumeScope.size - 1 + volumeSeekBar.currentProgress = currentTimeProgress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + minVolumeView.text = "${volumeScope.first()}" + maxVolumeView.text = "${volumeScope.last()}" + } + + override fun initEvent() { + temperatureSlider.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentProgress = progress + currentTempView.text = String.format( + "${minTemp + progress}${resources.getString(R.string.temperature_unit)}" + ) + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "3".createCommand(minTemp + progress) + ) + } + }) + + volumeSeekBar.setCallback(object : SliderCallback() { + override fun onProgressChange( + slider: QMUISlider?, progress: Int, tickCount: Int, fromUser: Boolean + ) { + currentTimeProgress = progress + currentVolumeView.text = String.format("${volumeScope[currentTimeProgress]}mL") + } + + override fun onStopMoving(slider: QMUISlider?, progress: Int, tickCount: Int) { + CommandManager.sendTuyaDp( + deviceInstance, "102".createCommand(volumeScope[currentTimeProgress]) + ) + } + }) + } + + override fun onDestroy() { + super.onDestroy() + deviceInstance.unRegisterDevListener() + deviceInstance.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt index 300e963..a3535c2 100644 --- a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -1,11 +1,16 @@ package com.casic.br.vm +import androidx.lifecycle.MutableLiveData import com.amap.api.location.AMapLocation import com.casic.br.base.BaseApplication import com.casic.br.extensions.separateResponseCode import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.OtherDeviceListModel +import com.casic.br.model.OtherDeviceModel import com.casic.br.model.UserDetailModel import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel @@ -14,6 +19,11 @@ import org.json.JSONObject class DeviceViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val listModel = MutableLiveData() + val deviceModel = MutableLiveData() + fun addDevice( devResp: DeviceBean, userModel: UserDetailModel.DataModel, @@ -43,4 +53,32 @@ launch({ RetrofitServiceManager.addDeviceData(dataModel) }, { it.printStackTrace() }) + + fun obtainOtherDeviceListByPage() = launch({ + val response = RetrofitServiceManager.obtainOtherDeviceListByPage() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + listModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) + + fun obtainDeviceDetail(id: String) = launch({ + val response = RetrofitServiceManager.obtainDeviceDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + deviceModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index 5949d56..3e748d6 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -23,6 +23,7 @@ val registerResult = MutableLiveData() val loginResult = MutableLiveData() val userDetailResult = MutableLiveData() + val outResultModel = MutableLiveData() fun register( account: String, @@ -96,4 +97,18 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun out() = launch({ + val response = RetrofitServiceManager.loginOut() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + outResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_water_config.xml b/app/src/main/res/layout/activity_add_water_config.xml new file mode 100644 index 0000000..18a0e75 --- /dev/null +++ b/app/src/main/res/layout/activity_add_water_config.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_air_cleaner.xml b/app/src/main/res/layout/activity_air_cleaner.xml new file mode 100644 index 0000000..857c8b1 --- /dev/null +++ b/app/src/main/res/layout/activity_air_cleaner.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ch4_senser.xml b/app/src/main/res/layout/activity_ch4_senser.xml new file mode 100644 index 0000000..f38455a --- /dev/null +++ b/app/src/main/res/layout/activity_ch4_senser.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_co_senser.xml b/app/src/main/res/layout/activity_co_senser.xml new file mode 100644 index 0000000..75ff538 --- /dev/null +++ b/app/src/main/res/layout/activity_co_senser.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_fire_senser.xml b/app/src/main/res/layout/activity_fire_senser.xml new file mode 100644 index 0000000..ead99dd --- /dev/null +++ b/app/src/main/res/layout/activity_fire_senser.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gas_alarm_hw.xml b/app/src/main/res/layout/activity_gas_alarm_hw.xml new file mode 100644 index 0000000..6ea32d5 --- /dev/null +++ b/app/src/main/res/layout/activity_gas_alarm_hw.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gateway.xml b/app/src/main/res/layout/activity_gateway.xml index 1fa144d..1abbde5 100644 --- a/app/src/main/res/layout/activity_gateway.xml +++ b/app/src/main/res/layout/activity_gateway.xml @@ -13,35 +13,43 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="horizontal"> + android:orientation="vertical"> - + + + + + + - - + android:orientation="horizontal"> + android:orientation="vertical"> - - + - - - - - + + + android:id="@+id/deviceStateView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:text="@string/app_name" + android:textSize="@dimen/sp_14" /> + + + + + + + diff --git a/app/src/main/res/layout/activity_power_strip.xml b/app/src/main/res/layout/activity_power_strip.xml index afee5d1..3d8bb7b 100644 --- a/app/src/main/res/layout/activity_power_strip.xml +++ b/app/src/main/res/layout/activity_power_strip.xml @@ -11,21 +11,20 @@ + android:orientation="horizontal"> @@ -33,147 +32,130 @@ android:id="@+id/turnOffCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/selector_turn_off_check_box" android:button="@null" - android:gravity="center" /> + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="总开关" + android:textSize="@dimen/sp_16" /> + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:orientation="horizontal"> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> - - + android:drawableBottom="@drawable/selector_power_strip_turn_off" + android:drawablePadding="@dimen/dp_10" + android:gravity="center" + android:text="@string/app_name" + android:textSize="@dimen/sp_16" /> diff --git a/app/src/main/res/layout/activity_robot_add_time.xml b/app/src/main/res/layout/activity_robot_add_time.xml new file mode 100644 index 0000000..eb996c0 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_add_time.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_robot_settings.xml b/app/src/main/res/layout/activity_robot_settings.xml new file mode 100644 index 0000000..e5025d1 --- /dev/null +++ b/app/src/main/res/layout/activity_robot_settings.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_single_strip.xml b/app/src/main/res/layout/activity_single_strip.xml index 8fc949d..455645e 100644 --- a/app/src/main/res/layout/activity_single_strip.xml +++ b/app/src/main/res/layout/activity_single_strip.xml @@ -24,7 +24,7 @@ android:id="@+id/turnOffCheckBox" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/selector_turn_off_single_strip" + android:background="@drawable/selector_single_strip_turn_off" android:button="@null" android:gravity="center" /> diff --git a/app/src/main/res/layout/activity_sweeping_robot.xml b/app/src/main/res/layout/activity_sweeping_robot.xml new file mode 100644 index 0000000..5a6b3ec --- /dev/null +++ b/app/src/main/res/layout/activity_sweeping_robot.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_t_h_senser.xml b/app/src/main/res/layout/activity_t_h_senser.xml new file mode 100644 index 0000000..f8b00a6 --- /dev/null +++ b/app/src/main/res/layout/activity_t_h_senser.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_water_dispenser.xml b/app/src/main/res/layout/activity_water_dispenser.xml new file mode 100644 index 0000000..6cdbb1c --- /dev/null +++ b/app/src/main/res/layout/activity_water_dispenser.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device.xml b/app/src/main/res/layout/fragment_device.xml index f58ad51..24c8a8b 100644 --- a/app/src/main/res/layout/fragment_device.xml +++ b/app/src/main/res/layout/fragment_device.xml @@ -16,54 +16,67 @@ + android:orientation="vertical"> + + + + + +