Bladeren bron

修改首页房间样式、增加创建房间选择设备类型、房间详情调整、温度湿度等跳转详情页

于秀娟 1 jaar geleden
bovenliggende
commit
31cbd7549b
100 gewijzigde bestanden met toevoegingen van 2040 en 1165 verwijderingen
  1. 1 6
      .gitignore
  2. 0 3
      .idea/.gitignore
  3. 0 1
      .idea/.name
  4. 0 117
      .idea/codeStyles/Project.xml
  5. 0 5
      .idea/codeStyles/codeStyleConfig.xml
  6. 0 6
      .idea/compiler.xml
  7. 0 25
      .idea/deploymentTargetDropDown.xml
  8. 0 24
      .idea/gradle.xml
  9. 0 6
      .idea/kotlinc.xml
  10. 0 83
      .idea/misc.xml
  11. 0 6
      .idea/render.experimental.xml
  12. 0 6
      .idea/vcs.xml
  13. 1 0
      app/src/main/AndroidManifest.xml
  14. 72 0
      app/src/main/java/com/rdiot/yx485/adapter/SelectDeviceTypeAdapter.kt
  15. 8 0
      app/src/main/java/com/rdiot/yx485/base/LocalData.kt
  16. 34 0
      app/src/main/java/com/rdiot/yx485/bean/DeviceTypeData.kt
  17. 3 1
      app/src/main/java/com/rdiot/yx485/bean/FamilyData.kt
  18. 11 2
      app/src/main/java/com/rdiot/yx485/bean/RoomData.kt
  19. 19 0
      app/src/main/java/com/rdiot/yx485/bean/WelcomeData.kt
  20. 52 3
      app/src/main/java/com/rdiot/yx485/net/Api.kt
  21. 4 3
      app/src/main/java/com/rdiot/yx485/ui/bind/BindActivity.kt
  22. 8 3
      app/src/main/java/com/rdiot/yx485/ui/bind/BindDeviceFragment.kt
  23. 6 0
      app/src/main/java/com/rdiot/yx485/ui/bind/ResetFragment.kt
  24. 131 0
      app/src/main/java/com/rdiot/yx485/ui/bind/SelectDeviceTypeFragment.kt
  25. 3 0
      app/src/main/java/com/rdiot/yx485/ui/bind/ble/BindInfo.kt
  26. 6 2
      app/src/main/java/com/rdiot/yx485/ui/bind/ble/BleCtrl.kt
  27. 6 0
      app/src/main/java/com/rdiot/yx485/ui/bind/model/BindViewModel.kt
  28. 75 4
      app/src/main/java/com/rdiot/yx485/ui/ctrl/RoomCtrlFragment.kt
  29. 3 2
      app/src/main/java/com/rdiot/yx485/ui/ctrl/RoomCtrlMainActivity.kt
  30. 25 4
      app/src/main/java/com/rdiot/yx485/ui/ctrl/SubRoomCtrlFragment.kt
  31. 12 4
      app/src/main/java/com/rdiot/yx485/ui/home/HomeFragment.kt
  32. 4 2
      app/src/main/java/com/rdiot/yx485/ui/login/LoginActivity.kt
  33. 4 2
      app/src/main/java/com/rdiot/yx485/ui/login/LoginPwdFragment.kt
  34. 4 2
      app/src/main/java/com/rdiot/yx485/ui/login/LoginSmsFragment.kt
  35. 4 1
      app/src/main/java/com/rdiot/yx485/ui/main/MainActivity.kt
  36. 6 3
      app/src/main/java/com/rdiot/yx485/ui/mine/MineFragment.kt
  37. 6 2
      app/src/main/java/com/rdiot/yx485/ui/room/RoomFragment.kt
  38. 61 9
      app/src/main/java/com/rdiot/yx485/ui/web/WebActivity.kt
  39. 14 0
      app/src/main/java/com/rdiot/yx485/ui/web/util/JsBridge.kt
  40. 150 0
      app/src/main/java/com/rdiot/yx485/util/RoomUtils.kt
  41. 57 0
      app/src/main/java/com/rdiot/yx485/view/CustomPopupWindow.kt
  42. 22 0
      app/src/main/java/com/rdiot/yx485/view/CustomScrollView.kt
  43. 5 0
      app/src/main/res/drawable/arc_seek_bar_bg.xml
  44. 6 0
      app/src/main/res/drawable/bg_device_ctrl_bg.xml
  45. 1 1
      app/src/main/res/drawable/bg_device_ctrl_btn_sel.xml
  46. 6 0
      app/src/main/res/drawable/bg_item_room_disconnect.xml
  47. 6 0
      app/src/main/res/drawable/bg_item_room_humidity_temperature.xml
  48. 6 0
      app/src/main/res/drawable/bg_room_device.xml
  49. 5 0
      app/src/main/res/drawable/corners_5dp.xml
  50. 6 0
      app/src/main/res/drawable/room_seekbar_bg.xml
  51. 6 0
      app/src/main/res/drawable/room_seekbar_default_bg.xml
  52. 7 0
      app/src/main/res/drawable/room_seekbar_left_bg.xml
  53. 14 0
      app/src/main/res/drawable/rsb_thumb_drawable.xml
  54. 6 0
      app/src/main/res/drawable/rsb_thumb_shadow.xml
  55. 7 0
      app/src/main/res/drawable/shape_divider_1px.xml
  56. 9 0
      app/src/main/res/layout/act_web.xml
  57. 8 4
      app/src/main/res/layout/fra_home.xml
  58. 522 453
      app/src/main/res/layout/fra_room_ctrl.xml
  59. 58 0
      app/src/main/res/layout/fra_select_device_type.xml
  60. 220 198
      app/src/main/res/layout/fra_sub_room_ctrl.xml
  61. 1 1
      app/src/main/res/layout/item_bottom_tab.xml
  62. 96 0
      app/src/main/res/layout/item_device_type.xml
  63. 12 0
      app/src/main/res/layout/item_device_type_vp.xml
  64. 89 169
      app/src/main/res/layout/item_room.xml
  65. 58 0
      app/src/main/res/layout/room_ctrl_popup.xml
  66. BIN
      app/src/main/res/mipmap-xxhdpi/fluorine_master.png
  67. BIN
      app/src/main/res/mipmap-xxhdpi/fluorine_sub.png
  68. BIN
      app/src/main/res/mipmap-xxhdpi/icon_add_1.png
  69. BIN
      app/src/main/res/mipmap-xxhdpi/icon_air.png
  70. BIN
      app/src/main/res/mipmap-xxhdpi/icon_air_sel.png
  71. BIN
      app/src/main/res/mipmap-xxhdpi/icon_co2_room.png
  72. BIN
      app/src/main/res/mipmap-xxhdpi/icon_fan.png
  73. BIN
      app/src/main/res/mipmap-xxhdpi/icon_humidity_room.png
  74. BIN
      app/src/main/res/mipmap-xxhdpi/icon_item_room_meeting.png
  75. BIN
      app/src/main/res/mipmap-xxhdpi/icon_off.png
  76. BIN
      app/src/main/res/mipmap-xxhdpi/icon_on.png
  77. BIN
      app/src/main/res/mipmap-xxhdpi/icon_on_sel.png
  78. BIN
      app/src/main/res/mipmap-xxhdpi/icon_on_sel_1.png
  79. BIN
      app/src/main/res/mipmap-xxhdpi/icon_pm2_5_room.png
  80. BIN
      app/src/main/res/mipmap-xxhdpi/icon_reduce.png
  81. BIN
      app/src/main/res/mipmap-xxhdpi/icon_sleep.png
  82. BIN
      app/src/main/res/mipmap-xxhdpi/icon_sleep_1.png
  83. BIN
      app/src/main/res/mipmap-xxhdpi/icon_tab_home.png
  84. BIN
      app/src/main/res/mipmap-xxhdpi/icon_tab_home_sel.png
  85. BIN
      app/src/main/res/mipmap-xxhdpi/icon_tab_me.png
  86. BIN
      app/src/main/res/mipmap-xxhdpi/icon_tab_me_sel.png
  87. BIN
      app/src/main/res/mipmap-xxhdpi/icon_tab_room.png
  88. BIN
      app/src/main/res/mipmap-xxhdpi/icon_tab_room_sel.png
  89. BIN
      app/src/main/res/mipmap-xxhdpi/icon_temperature_room.png
  90. BIN
      app/src/main/res/mipmap-xxhdpi/icon_time.png
  91. BIN
      app/src/main/res/mipmap-xxhdpi/icon_time_sel.png
  92. BIN
      app/src/main/res/mipmap-xxhdpi/range_seek_bar_thumb.png
  93. BIN
      app/src/main/res/mipmap-xxhdpi/sanjiao.png
  94. BIN
      app/src/main/res/mipmap-xxhdpi/water_intelligence.png
  95. BIN
      app/src/main/res/mipmap-xxhdpi/water_master.png
  96. BIN
      app/src/main/res/mipmap-xxhdpi/water_sub.png
  97. 14 2
      app/src/main/res/navigation/nav_bind.xml
  98. 30 0
      app/src/main/res/values/colors.xml
  99. 25 0
      app/src/main/res/values/strings.xml
  100. 5 0
      app/src/main/res/values/style.xml

+ 1 - 6
.gitignore

@@ -1,12 +1,7 @@
 *.iml
 .gradle
 /local.properties
-/.idea/caches
-/.idea/libraries
-/.idea/modules.xml
-/.idea/workspace.xml
-/.idea/navEditor.xml
-/.idea/assetWizardSettings.xml
+/.idea/
 .DS_Store
 /build
 /captures

+ 0 - 3
.idea/.gitignore

@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml

+ 0 - 1
.idea/.name

@@ -1 +0,0 @@
-YX 485

+ 0 - 117
.idea/codeStyles/Project.xml

@@ -1,117 +0,0 @@
-<component name="ProjectCodeStyleConfiguration">
-  <code_scheme name="Project" version="173">
-    <codeStyleSettings language="XML">
-      <option name="FORCE_REARRANGE_MODE" value="1" />
-      <indentOptions>
-        <option name="CONTINUATION_INDENT_SIZE" value="4" />
-      </indentOptions>
-      <arrangement>
-        <rules>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>xmlns:android</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>xmlns:.*</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-              <order>BY_NAME</order>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*:id</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*:name</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>name</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>style</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>^$</XML_NAMESPACE>
-                </AND>
-              </match>
-              <order>BY_NAME</order>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
-                </AND>
-              </match>
-              <order>ANDROID_ATTRIBUTE_ORDER</order>
-            </rule>
-          </section>
-          <section>
-            <rule>
-              <match>
-                <AND>
-                  <NAME>.*</NAME>
-                  <XML_ATTRIBUTE />
-                  <XML_NAMESPACE>.*</XML_NAMESPACE>
-                </AND>
-              </match>
-              <order>BY_NAME</order>
-            </rule>
-          </section>
-        </rules>
-      </arrangement>
-    </codeStyleSettings>
-  </code_scheme>
-</component>

+ 0 - 5
.idea/codeStyles/codeStyleConfig.xml

@@ -1,5 +0,0 @@
-<component name="ProjectCodeStyleConfiguration">
-  <state>
-    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
-  </state>
-</component>

+ 0 - 6
.idea/compiler.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="CompilerConfiguration">
-    <bytecodeTargetLevel target="11" />
-  </component>
-</project>

+ 0 - 25
.idea/deploymentTargetDropDown.xml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="deploymentTargetDropDown">
-    <runningDeviceTargetsSelectedWithDialog>
-      <Target>
-        <type value="RUNNING_DEVICE_TARGET" />
-        <deviceKey>
-          <Key>
-            <type value="SERIAL_NUMBER" />
-            <value value="192.168.1.186:5555" />
-          </Key>
-        </deviceKey>
-      </Target>
-      <Target>
-        <type value="RUNNING_DEVICE_TARGET" />
-        <deviceKey>
-          <Key>
-            <type value="SERIAL_NUMBER" />
-            <value value="a4426be8" />
-          </Key>
-        </deviceKey>
-      </Target>
-    </runningDeviceTargetsSelectedWithDialog>
-  </component>
-</project>

+ 0 - 24
.idea/gradle.xml

@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="GradleMigrationSettings" migrationVersion="1" />
-  <component name="GradleSettings">
-    <option name="linkedExternalProjectsSettings">
-      <GradleProjectSettings>
-        <option name="testRunner" value="GRADLE" />
-        <option name="distributionType" value="DEFAULT_WRAPPED" />
-        <option name="externalProjectPath" value="$PROJECT_DIR$" />
-        <option name="gradleJvm" value="11" />
-        <option name="modules">
-          <set>
-            <option value="$PROJECT_DIR$" />
-            <option value="$PROJECT_DIR$/FastBleLib" />
-            <option value="$PROJECT_DIR$/RangeSeekBar" />
-            <option value="$PROJECT_DIR$/app" />
-            <option value="$PROJECT_DIR$/arcseekbar" />
-            <option value="$PROJECT_DIR$/pageview" />
-          </set>
-        </option>
-      </GradleProjectSettings>
-    </option>
-  </component>
-</project>

+ 0 - 6
.idea/kotlinc.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="KotlinJpsPluginSettings">
-    <option name="version" value="1.7.10" />
-  </component>
-</project>

+ 0 - 83
.idea/misc.xml

@@ -1,83 +0,0 @@
-<project version="4">
-  <component name="DesignSurface">
-    <option name="filePathToZoomLevelMap">
-      <map>
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bar_constact.xml" value="0.2365" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bar_news.xml" value="0.241" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_badge.xml" value="0.2225" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_device_ctrl_btn.xml" value="0.2295" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_device_ctrl_btn_pressed.xml" value="0.2295" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_home_no_room_add_btn.xml" value="0.2655" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_home_scene.xml" value="0.2695" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_home_weather.xml" value="0.139" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_login_btn.xml" value="0.2325" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_login_btn_pressed.xml" value="0.2325" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_login_get_sms_btn.xml" value="0.2325" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_login_get_sms_btn_disable.xml" value="0.2555" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_login_get_sms_btn_pressed.xml" value="0.2555" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_mine_option.xml" value="0.2485" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_my_home_banner.xml" value="0.11" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_popup_main_add.xml" value="0.273" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_room_device_off.xml" value="0.2305" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_room_device_on.xml" value="0.254" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_room_item.xml" value="0.2305" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/bg_tab_text_color.xml" value="0.176" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/item_check.xml" value="0.2245" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_check_box.xml" value="0.2295" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_device_ctrl_btn.xml" value="0.2295" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_login_btn.xml" value="0.2315" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_login_get_sms_btn.xml" value="0.2545" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_login_get_sms_btn_text.xml" value="0.2545" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_room_ctrl_btn.xml" value="0.2465" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_tab_find.xml" value="0.2225" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_tab_home.xml" value="0.2225" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_tab_mine.xml" value="0.2225" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_tab_room.xml" value="0.2225" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_tab_text_color.xml" value="0.2555" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/drawable/sel_warm_mode.xml" value="0.2295" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/act_bind.xml" value="0.18802083333333333" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/act_family_list.xml" value="0.22103463018383926" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/act_family_management.xml" value="0.25" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/act_login.xml" value="0.22604166666666667" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/act_main.xml" value="0.3504854368932039" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/act_main2.xml" value="0.2677083333333333" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/act_qr_code.xml" value="0.21" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/act_room_ctrl.xml" value="0.43359375" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/activity_main.xml" value="0.22" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_bind_device.xml" value="0.2984375" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_device_ctrl.xml" value="0.22291666666666668" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_enter_room_info.xml" value="0.27254374158815614" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_enter_wifi_info.xml" value="0.4106280193236715" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_find.xml" value="0.25" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_forget_pwd.xml" value="0.2890625" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_home.xml" value="0.38155668358714045" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_login_phone.xml" value="0.3645833333333333" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_login_pwd.xml" value="0.25" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_login_sms.xml" value="0.25" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_main.xml" value="0.26875" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_mine.xml" value="0.3391243919388464" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_reset.xml" value="0.18802083333333333" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_reset_pwd.xml" value="0.3382084095063985" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_room.xml" value="0.25" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_room_ctrl.xml" value="0.25729166666666664" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/fra_room_info_input.xml" value="0.27395833333333336" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/item_bottom_tab.xml" value="0.75" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/item_family.xml" value="0.33" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/item_horizontal_grid.xml" value="0.365625" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/item_room.xml" value="0.25" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/item_scene.xml" value="0.33" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/popup_main_add.xml" value="0.35104166666666664" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/layout/view_navbar.xml" value="0.33" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/app/src/main/res/menu/navigation_menu.xml" value="0.23020833333333332" />
-        <entry key="..\:/Work/AndroidPorjects/RD/YongXu485/pageview/src/main/res/drawable/shape_point_unselected.xml" value="0.1935" />
-        <entry key="..\:/Work/Cache/.gradle/caches/transforms-3/b75bde5c00aa87c2e7752c5e8569bc51/transformed/zxing-lite-2.2.1/res/layout/zxl_capture.xml" value="0.1731509191962377" />
-      </map>
-    </option>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/build/classes" />
-  </component>
-  <component name="ProjectType">
-    <option name="id" value="Android" />
-  </component>
-</project>

+ 0 - 6
.idea/render.experimental.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="RenderSettings">
-    <option name="quality" value="0.0" />
-  </component>
-</project>

+ 0 - 6
.idea/vcs.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="VcsDirectoryMappings">
-    <mapping directory="$PROJECT_DIR$" vcs="Git" />
-  </component>
-</project>

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -51,6 +51,7 @@
         android:label="@string/app_name"
         android:supportsRtl="true"
         android:theme="@style/AppTheme"
+        android:usesCleartextTraffic="true"
         tools:targetApi="31">
         <activity
             android:name="com.rdiot.yx485.ui.main.MainActivity"

+ 72 - 0
app/src/main/java/com/rdiot/yx485/adapter/SelectDeviceTypeAdapter.kt

@@ -0,0 +1,72 @@
+package com.rdiot.yx485.adapter
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.databinding.DataBindingUtil
+import androidx.viewpager.widget.PagerAdapter
+import com.drake.brv.annotaion.DividerOrientation
+import com.drake.brv.utils.divider
+import com.drake.brv.utils.grid
+import com.drake.brv.utils.models
+import com.drake.brv.utils.setup
+import com.rdiot.yx485.R
+import com.rdiot.yx485.bean.DeviceTypeData
+import com.rdiot.yx485.databinding.ItemDeviceTypeBinding
+import com.rdiot.yx485.databinding.ItemDeviceTypeVpBinding
+
+/**
+ * 选择设备类型adapter
+ */
+class SelectDeviceTypeAdapter(
+    private val context: Context?, private val list: ArrayList<DeviceTypeData>,
+    private val onItemClickListener: OnItemClickListener
+) : PagerAdapter() {
+
+    override fun getCount(): Int {
+        return list.size;
+    }
+
+    override fun isViewFromObject(view: View, `object`: Any): Boolean {
+        return view == `object`
+    }
+
+    override fun instantiateItem(container: ViewGroup, position: Int): Any {
+        val binding = DataBindingUtil.inflate<ItemDeviceTypeVpBinding>(
+            LayoutInflater.from(context),
+            R.layout.item_device_type_vp,
+            null,
+            false
+        )
+        binding.itemDeviceTypeVpRv.grid(1).divider {
+            setDrawable(R.drawable.divider_horizontal)
+            orientation = DividerOrientation.GRID
+            includeVisible = true
+        }.setup {
+            addType<DeviceTypeData>(R.layout.item_device_type)
+            onBind {
+                getBinding<ItemDeviceTypeBinding>().context = context // ViewBinding/DataBinding都支持
+            }
+            R.id.item_device_type.onClick {
+                if (list.size > position) {
+                    val i = list[position].children?.get(this.modelPosition)
+                    onItemClickListener.onClick(this.modelPosition, i)
+                }
+            }
+        }
+        if (list.size > position)
+            binding.itemDeviceTypeVpRv.models = list[position].children
+        container.addView(binding.itemDeviceTypeVpRv)
+        return binding.itemDeviceTypeVpRv
+    }
+
+    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
+//        super.destroyItem(container, position, `object`)
+        container.removeViewAt(position)
+    }
+
+    interface OnItemClickListener {
+        fun onClick(position: Int, deviceTypeData: DeviceTypeData?)
+    }
+}

+ 8 - 0
app/src/main/java/com/rdiot/yx485/base/LocalData.kt

@@ -5,10 +5,12 @@ import com.drake.serialize.serialize.serialLazy
 import com.drake.serialize.serialize.serialLiveData
 import com.rdiot.yx485.BuildConfig
 import com.rdiot.yx485.bean.AppVersionData
+import com.rdiot.yx485.bean.DeviceTypeData
 import com.rdiot.yx485.bean.FamilyData
 import com.rdiot.yx485.bean.LoginData
 import com.rdiot.yx485.bean.UserData
 import com.rdiot.yx485.bean.WeatherData
+import com.rdiot.yx485.bean.WelcomeData
 import com.rdiot.yx485.bean.YXBean
 import com.rdiot.yx485.net.Api
 import com.rdiot.yx485.ui.login.model.LoginRecord
@@ -37,6 +39,9 @@ object LocalData {
     /** 天气数据 selFamilyId为空时,获取默认家庭*/
     val weatherData by serialLiveData(WeatherData())
 
+    /** 欢迎页数据*/
+    val welcomeData by serialLiveData(WelcomeData())
+
     /** 所有家庭简单信息 */
     val allFamily by serialLiveData(mutableListOf<FamilyData>())
 
@@ -64,6 +69,9 @@ object LocalData {
     /** 测试 让Token失效 */
     var makeTokenErr by serialLazy(false)
 
+    /** 设备类型 */
+    val deviceTypeData by serialLiveData(mutableListOf<DeviceTypeData>())
+
     /** 登出 */
     fun logout() {
         lastGetCodeTime = 0

+ 34 - 0
app/src/main/java/com/rdiot/yx485/bean/DeviceTypeData.kt

@@ -0,0 +1,34 @@
+package com.rdiot.yx485.bean
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+/**
+ * 设备类型信息
+ */
+@Serializable
+data class DeviceTypeData(
+    /** id */
+    @SerialName("record_id")
+    var recordId: String = "",
+    /** code */
+    @SerialName("code")
+    var code: String = "",
+    /** 名称 */
+    @SerialName("name")
+    var name: String = "",
+    /** 父id */
+    @SerialName("parent_id")
+    var parentId: String = "",
+    /** icon */
+    @SerialName("icon")
+    var icon: String = "",
+    /** 子 */
+    @SerialName("children")
+    var children: List<DeviceTypeData>? = null
+) : java.io.Serializable {
+
+    companion object {
+        private const val serialVersionUID = -85L
+    }
+}

+ 3 - 1
app/src/main/java/com/rdiot/yx485/bean/FamilyData.kt

@@ -42,7 +42,9 @@ data class FamilyData(
     @SerialName("record_id")
     var recordId: String = "", // 1t7svi0l6m4codj7wi7dd1u500cqkuzk
     @SerialName("room")
-    var room: List<RoomData>? = null
+    var room: List<RoomData>? = null,
+    @SerialName("icon")
+    var icon: String = "", // 图片地址
 ) : java.io.Serializable {
     companion object {
         private const val serialVersionUID = -54L

+ 11 - 2
app/src/main/java/com/rdiot/yx485/bean/RoomData.kt

@@ -38,6 +38,9 @@ data class RoomData(
     /** 新风系统开关 */
     @SerialName("new_fan")
     var freshAir: Boolean = false,
+    /** 睡眠系统开关 */
+    @SerialName("sleep_mode")
+    var sleepMode: Boolean = false,
     /** 名称 */
     @SerialName("name")
     var name: String = "", // 随意房间
@@ -68,10 +71,16 @@ data class RoomData(
     /** 用户id */
     @SerialName("user_id")
     var userId: String = "",
-
+    @SerialName("code")
+    var code: String = "",
+    @SerialName("icon")
+    var icon: String = "",
 
     /** 编辑模式 */
-    var isEditMode: Boolean = false
+    var isEditMode: Boolean = false,
+
+    /** 这个值是房间的,但是每个设备都需要判断,然后展示是否在线,所以在这加一个字段 */
+    var isOnline: Boolean = false
 ) : java.io.Serializable {
 
     companion object {

+ 19 - 0
app/src/main/java/com/rdiot/yx485/bean/WelcomeData.kt

@@ -0,0 +1,19 @@
+package com.rdiot.yx485.bean
+
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+
+
+@Serializable
+data class WelcomeData(
+    /** 欢迎语 */
+    @SerialName("value")
+    var value: String = "",
+): java.io.Serializable {
+
+    companion object {
+
+        private const  val serialVersionUID = -4798L
+    }
+
+}

+ 52 - 3
app/src/main/java/com/rdiot/yx485/net/Api.kt

@@ -6,6 +6,7 @@ import com.drake.net.interfaces.ProgressListener
 import com.rdiot.yx485.BuildConfig
 import com.rdiot.yx485.base.LocalData
 import com.rdiot.yx485.bean.*
+import com.rdiot.yx485.util.RoomUtils
 import com.rdiot.yx485.util.md5
 import kotlinx.coroutines.CoroutineScope
 import java.io.File
@@ -18,6 +19,7 @@ import java.io.File
 object Api {
     /** Api地址 */
     const val TEST_HOST = "http://yongxu.yehaoji.cn:8199/api/v1/"
+//    const val TEST_HOST = "https://app.yongxulvjian.com/api/v1/"
 
     /** 头像地址 */
     const val TEST_AVATAR_HOST = "http://yongxu.yehaoji.cn:18199"
@@ -38,6 +40,9 @@ object Api {
 
         /** 天气 */
         const val WEATHER = "homepages/weather"
+
+        /** 欢迎 */
+        const val WELCOME = "system_parameter/app_homepage"
     }
 
     /** 登录接口 */
@@ -122,6 +127,9 @@ object Api {
         /** 新风开关 */
         const val FRESH_AIR = "${BASE}/new_fan"
 
+        /** 睡眠开关 */
+        const val SLEEP = "${BASE}/sleep"
+
         /** 模式 */
         const val MODE = "${BASE}/mode"
 
@@ -145,6 +153,12 @@ object Api {
         const val BASE = "files"
 
     }
+
+    /** 设备接口 */
+    object Device {
+        /** 获取设备类型 */
+        const val GET_DEVICE_TYPES = "device_types"
+    }
 }
 
 /************************** App相关 **************************/
@@ -166,6 +180,10 @@ fun CoroutineScope.getWeather(familyId: String? = null) = Get<WeatherData>(Api.A
     param("home_id", familyId ?: LocalData.selFamilyId.value)
 }
 
+/** 获取欢迎语 */
+fun CoroutineScope.getWelcome() =
+    Get<WelcomeData>(Api.App.WELCOME)
+
 /************************** 登录、用户相关 **************************/
 /** 短信类型 */
 enum class SmsLimit(val limitType: Int) {
@@ -318,12 +336,13 @@ fun CoroutineScope.deleteFamily(familyId: String?) =
 
 /************************** 房间管理 **************************/
 /** 添加房间(分控) */
-fun CoroutineScope.addRoom(roomName: String, ctrlNum: String) =
+fun CoroutineScope.addRoom(roomName: String, ctrlNum: String, recordId: String) =
     Post<BaseResp<String>>(Api.Room.BASE) {
         json(
             "name" to roomName,
             "home_id" to LocalData.selFamilyId.value,
-            "control_number" to ctrlNum
+            "control_number" to ctrlNum,
+            "device_type_id" to recordId
         )
     }
 
@@ -357,7 +376,7 @@ fun CoroutineScope.getRoomInfo(roomId: String) =
 /************************** 设备控制 **************************/
 /** 总控开关 */
 fun CoroutineScope.setPower(gateway: String, roomData: RoomData) =
-    Post<BaseResp<String>>(if (roomData.isMaster) Api.Ctrl.POWER else Api.Ctrl.SUB_POWER) {
+    Post<BaseResp<String>>(if (RoomUtils.isMaster(roomData.code)) Api.Ctrl.POWER else Api.Ctrl.SUB_POWER) {
         json(
             "gateway" to gateway,
             "control_number" to roomData.controlNumber,
@@ -383,6 +402,23 @@ enum class ModeType(val typeCode: Int) {
 
 }
 
+enum class DeviceCode(val typeCode: String) {
+    /** 水系统-主控 */
+    WATER_MASTER("YXK-Z/86-FC-B"),
+
+    /** 水系统-分控 */
+    WATER_SUB("YXK-F/86-FC-B"),
+
+    /** 水系统-智能 */
+    WATER_INTELLIGENCE("YXK-P/DN-JF-8"),
+
+    /** 氟系统-主控 */
+    FLUORINE_MASTER("YXK-Z/86-FG-A"),
+
+    /** 氟系统-分控 */
+    FLUORINE_SUB("YXK-F/86-FG-A"),
+}
+
 /** 设置模式 */
 fun CoroutineScope.setMode(gateway: String, roomData: RoomData, modeType: ModeType) =
     Post<BaseResp<String>>(Api.Ctrl.MODE) {
@@ -402,6 +438,15 @@ fun CoroutineScope.setFreshAir(gateway: String, roomData: RoomData) =
         )
     }
 
+fun CoroutineScope.setSleep(gateway: String, roomData: RoomData) =
+    Post<BaseResp<String>>(Api.Ctrl.SLEEP) {
+        json(
+            "gateway" to gateway,
+            "control_number" to roomData.controlNumber,
+            "power" to roomData.sleepMode
+        )
+    }
+
 /** 设置定时 */
 fun CoroutineScope.setTimer(
     gateway: String,
@@ -443,3 +488,7 @@ fun CoroutineScope.setWindSpeed(
         )
     }
 
+/** 获取设备类型列表 */
+fun CoroutineScope.getDeviceTypeList() =
+    Get<List<DeviceTypeData>>(String.format(Api.Device.GET_DEVICE_TYPES))
+

+ 4 - 3
app/src/main/java/com/rdiot/yx485/ui/bind/BindActivity.kt

@@ -26,6 +26,7 @@ import com.rdiot.yx485.ui.bind.BindActivity.AskTypes.BLE
 import com.rdiot.yx485.ui.bind.BindActivity.AskTypes.LOCATION
 import com.rdiot.yx485.ui.bind.model.BindViewModel
 import com.rdiot.yx485.util.LocationUtils
+import com.rdiot.yx485.util.RoomUtils
 import com.rdiot.yx485.util.askPermission
 import com.rdiot.yx485.util.goToAppSetting
 import com.rdiot.yx485.util.goToSystemLocationSetting
@@ -67,14 +68,14 @@ class BindActivity : BaseActivity<ActBindBinding>() {
         }
         bindViewModel = ViewModelProvider(this)[BindViewModel::class.java]
 
-        val isHasMaster = LocalData.familyData.value?.room?.any { it.isMaster }
-        bindViewModel.isBindSub = (isHasMaster == true)
+//        val isHasMaster = LocalData.familyData.value?.room?.any { it.isMaster }
+//        bindViewModel.isBindSub = (RoomUtils.isMaster(LocalData.familyData.value?.code))
 
 //        bindViewModel.testMode()
 
         binding.nb.setLeftClickListener {
             val navCtrl = findNavController(R.id.fcv)
-            if (navCtrl.currentDestination?.id == R.id.resetFragment) {
+            if (navCtrl.currentDestination?.id == R.id.selectDeviceTypeFragment) {
                 finish()
             } else {
                 navCtrl.popBackStack()

+ 8 - 3
app/src/main/java/com/rdiot/yx485/ui/bind/BindDeviceFragment.kt

@@ -8,6 +8,9 @@ import android.view.animation.Animation
 import android.view.animation.LinearInterpolator
 import android.view.animation.RotateAnimation
 import androidx.fragment.app.activityViewModels
+import androidx.navigation.Navigation.findNavController
+import androidx.navigation.findNavController
+import androidx.navigation.fragment.findNavController
 import com.drake.net.utils.scopeNetLife
 import com.king.zxing.util.LogUtils
 import com.lindroy.iosdialog.IAlertDialog
@@ -37,7 +40,7 @@ class BindDeviceFragment : BaseFragment<FraBindDeviceBinding>() {
     private var dialog: IAlertDialog? = null
 
     /** 定位市名 */
-    private lateinit var cityName: String
+//    private lateinit var cityName: String
 
     override fun initView(
         inflater: LayoutInflater,
@@ -72,6 +75,7 @@ class BindDeviceFragment : BaseFragment<FraBindDeviceBinding>() {
             addRoom(
                 bindViewModel.roomName.get()!!,
                 bindViewModel.panelNum.get()!!,
+                bindViewModel.deviceTypeId.get()!!
             ).await()
             delay(1500)
             bindSuccess()
@@ -85,7 +89,8 @@ class BindDeviceFragment : BaseFragment<FraBindDeviceBinding>() {
             bindViewModel.panelNum.get()!!,
             bindViewModel.roomName.get()!!,
             bindViewModel.wifiSsid.get()!!,
-            bindViewModel.wifiPwd.get()!!
+            bindViewModel.wifiPwd.get()!!,
+            bindViewModel.deviceTypeId.get()!!
         ) { e ->
             if (!isResumed) return@autoBind
 
@@ -161,7 +166,7 @@ class BindDeviceFragment : BaseFragment<FraBindDeviceBinding>() {
             .setAlpha(1.0F)
             .setPosButtonText(R.string.got_it)
             .setPosClickListener {
-                act.finish()
+                findNavController().popBackStack()
             }
 
         code?.let {

+ 6 - 0
app/src/main/java/com/rdiot/yx485/ui/bind/ResetFragment.kt

@@ -6,6 +6,7 @@ import android.view.LayoutInflater
 import android.view.ViewGroup
 import androidx.fragment.app.activityViewModels
 import androidx.navigation.fragment.findNavController
+import com.king.zxing.util.LogUtils
 import com.rdiot.yx485.R
 import com.rdiot.yx485.base.BaseFragment
 import com.rdiot.yx485.base.BindModelFactory
@@ -28,6 +29,7 @@ class ResetFragment : BaseFragment<FraResetBinding>() {
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ) {
+        LogUtils.e("绑定的数据:${bindViewModel.deviceTypeId.get()!!}")
 
         binding.btnNext.setClickLimitListener {
             findNavController().navigate(R.id.action_resetFragment_to_enterRoomInfoFragment)
@@ -36,4 +38,8 @@ class ResetFragment : BaseFragment<FraResetBinding>() {
 
     }
 
+    override fun onResume() {
+        super.onResume()
+        (act as BindActivity).setNBTitle(getString(R.string.add_room))
+    }
 }

+ 131 - 0
app/src/main/java/com/rdiot/yx485/ui/bind/SelectDeviceTypeFragment.kt

@@ -0,0 +1,131 @@
+package com.rdiot.yx485.ui.bind
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.activityViewModels
+import androidx.navigation.fragment.findNavController
+import androidx.viewpager.widget.ViewPager
+import com.drake.net.utils.scope
+import com.google.android.material.tabs.TabLayout
+import com.lindroy.iosdialog.IAlertDialog
+import com.rdiot.yx485.R
+import com.rdiot.yx485.adapter.SelectDeviceTypeAdapter
+import com.rdiot.yx485.adapter.SelectDeviceTypeAdapter.OnItemClickListener
+import com.rdiot.yx485.base.BaseFragment
+import com.rdiot.yx485.base.BindModelFactory
+import com.rdiot.yx485.bean.DeviceTypeData
+import com.rdiot.yx485.databinding.FraSelectDeviceTypeBinding
+import com.rdiot.yx485.net.DeviceCode
+import com.rdiot.yx485.net.getDeviceTypeList
+import com.rdiot.yx485.ui.bind.model.BindViewModel
+import com.rdiot.yx485.util.RoomUtils
+
+/**
+ * 选择设备类型页
+ */
+class SelectDeviceTypeFragment : BaseFragment<FraSelectDeviceTypeBinding>() {
+    override fun getLayoutId() = R.layout.fra_select_device_type
+    private val bindViewModel: BindViewModel by activityViewModels { BindModelFactory() }
+    private lateinit var pagerAdapter: SelectDeviceTypeAdapter
+    private lateinit var list: ArrayList<DeviceTypeData>
+    private var dialog: IAlertDialog? = null
+
+    override fun initView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ) {
+        binding.vm = bindViewModel
+        initTab()
+    }
+
+    private fun initTab() {
+        list = ArrayList()
+        pagerAdapter = SelectDeviceTypeAdapter(context, list, object : OnItemClickListener {
+            override fun onClick(position: Int, deviceTypeData: DeviceTypeData?) {
+                if ((deviceTypeData?.code == DeviceCode.WATER_INTELLIGENCE.typeCode)){
+                    showNoticeDialog()
+                    return
+                }
+                bindViewModel.deviceTypeId.set(deviceTypeData?.recordId)
+                bindViewModel.isBindSub = !RoomUtils.isMaster(deviceTypeData?.code)
+
+                findNavController().navigate(R.id.action_selectDeviceTypeFragment_to_resetFragment)
+            }
+        })
+        binding.viewPager.adapter = pagerAdapter
+        binding.viewPager.offscreenPageLimit = list.size
+        binding.tabLayout.setupWithViewPager(binding.viewPager)
+
+        binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+            override fun onPageScrolled(
+                position: Int,
+                positionOffset: Float,
+                positionOffsetPixels: Int
+            ) {
+            }
+
+            override fun onPageSelected(position: Int) {
+            }
+
+            override fun onPageScrollStateChanged(state: Int) {
+            }
+        })
+
+        scope {
+            getDeviceTypeList().await().apply {
+                list.clear()
+                list.addAll(this)
+                pagerAdapter.notifyDataSetChanged()
+                for (i in list.indices) { // 循环添加自定义的tab
+                    val tab: TabLayout.Tab? = binding.tabLayout.getTabAt(i)
+                    tab?.text = list[i].name
+                }
+            }
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        (act as BindActivity).setNBTitle(getString(R.string.select_device_type))
+    }
+
+//    override fun onSaveInstanceState(outState: Bundle) {
+//        super.onSaveInstanceState(outState)
+//        outState.putInt("selected_tab", binding.tabLayout.selectedTabPosition)
+//        val titles = ArrayList<String>()
+//        list.forEach {
+//            titles.add(it.name)
+//        }
+//        outState.putStringArrayList("tab_titles", titles)
+//    }
+
+//    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+//        super.onViewCreated(view, savedInstanceState)
+//        savedInstanceState?.getInt("selected_tab", 0).let {
+//            if (it != null) {
+//                binding.tabLayout.getTabAt(it)?.select()
+//            }
+//        }
+//
+//        savedInstanceState?.getStringArrayList("tab_titles")?.forEachIndexed { index, title ->
+//            binding.tabLayout.getTabAt(index)?.text = title
+//        }
+//    }
+
+    private fun showNoticeDialog() {
+        dialog?.dismiss()
+        dialog = IAlertDialog.build(this)
+            .setTitle(R.string.notice)
+            .setCancelOutside(false)
+            .setShowNegButton(false)
+            .setAlpha(1.0F)
+            .setPosButtonText(R.string.got_it)
+            .setMessage(R.string.coding)
+
+        dialog?.isCancelable = false
+        dialog?.show()
+    }
+}

+ 3 - 0
app/src/main/java/com/rdiot/yx485/ui/bind/ble/BindInfo.kt

@@ -23,6 +23,8 @@ data class BindInfo(
     var pwd: String = "", // wifi密码
     @SerialName("env")//蓝牙调试模式 0生产环境 1测试环境
     var bindMode: Int = 0,
+    @SerialName("device_type_id")//设备类型id
+    var deviceTypeId: String = "",
 ) {
     fun toJsonString(): String {
         return "{\"user_id\":\"$userId\"," +
@@ -30,6 +32,7 @@ data class BindInfo(
                 "\"room_name\":\"$roomName\"" +
                 ",\"ssid\":\"$ssid\"" +
                 ",\"pwd\":\"$pwd\"" +
+                ",\"device_type_id\":\"$deviceTypeId\"" +
                 ",\"env\":$bindMode}"
     }
 }

+ 6 - 2
app/src/main/java/com/rdiot/yx485/ui/bind/ble/BleCtrl.kt

@@ -41,6 +41,7 @@ object BleCtrl : DefaultLifecycleObserver {
     private lateinit var roomName: String
     private lateinit var wifiSsid: String
     private lateinit var wifiPwd: String
+    private lateinit var deviceTypeId: String
     private var callBack: ((BLECtrlEvent) -> Unit)? = null
 
     private const val TAG = "BleCtrl"
@@ -82,12 +83,14 @@ object BleCtrl : DefaultLifecycleObserver {
         roomName: String,
         wifiSsid: String,
         wifiPwd: String,
+        deviceTypeId: String,
         callBack: ((BLECtrlEvent) -> Unit)? = null
     ) {
         this.deviceName = deviceName
         this.roomName = roomName
         this.wifiSsid = wifiSsid
         this.wifiPwd = wifiPwd
+        this.deviceTypeId = deviceTypeId
         this.callBack = callBack
         initBleManager()
 
@@ -260,9 +263,10 @@ object BleCtrl : DefaultLifecycleObserver {
             roomName,
             wifiSsid,
             wifiPwd,
-            if (LocalData.apiHost == ApiHost.TEST_HOST) 1 else 0
+            if (LocalData.apiHost == ApiHost.TEST_HOST) 1 else 0,
+            deviceTypeId
         ).toJsonString()
-        LogUtils.d("Json:${bindInfoString}")
+        LogUtils.d(":Json${bindInfoString}")
         sendData(bindInfoString.toByteArray())
     }
 

+ 6 - 0
app/src/main/java/com/rdiot/yx485/ui/bind/model/BindViewModel.kt

@@ -34,6 +34,12 @@ class BindViewModel : ViewModel() {
     /** 定位名字(市) */
     var locationName: String? = null
 
+    /** 设备类型id */
+    var deviceTypeId: ObservableField<String> = ObservableField("")
+
+    /** 设备类型code */
+    var code: String = ""
+
     /** 配网倒计时 */
     var countDownTime: MutableLiveData<Int> = MutableLiveData(-1)
     private var countDownJob: Job? = null

+ 75 - 4
app/src/main/java/com/rdiot/yx485/ui/ctrl/RoomCtrlFragment.kt

@@ -2,6 +2,7 @@ package com.rdiot.yx485.ui.ctrl
 
 import android.annotation.SuppressLint
 import android.os.Bundle
+import android.view.Gravity
 import android.view.LayoutInflater
 import android.view.MotionEvent
 import android.view.View
@@ -25,7 +26,9 @@ import com.rdiot.yx485.bean.RoomData
 import com.rdiot.yx485.databinding.FraRoomCtrlBinding
 import com.rdiot.yx485.net.*
 import com.rdiot.yx485.ui.ctrl.model.RoomCtrlViewModel
+import com.rdiot.yx485.ui.web.WebActivity
 import com.rdiot.yx485.util.*
+import com.rdiot.yx485.view.CustomPopupWindow
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.delay
 
@@ -45,6 +48,7 @@ class RoomCtrlFragment : BaseFragment<FraRoomCtrlBinding>(), ClickLimitListener,
 
     /** 延迟[OBSERVE_COUNT]次监听结果回复自动换页 */
     private var resumeScrollingCount = -1
+    private var mRightTopPlusPop: CustomPopupWindow? = null
 
 
     companion object {
@@ -82,8 +86,7 @@ class RoomCtrlFragment : BaseFragment<FraRoomCtrlBinding>(), ClickLimitListener,
         }
 
         binding.nb.setLeftClickListener { act.finish() }
-        binding.nb.setRightClickListener { findNavController().navigate(R.id.action_roomCtrlFragment_to_roomSettingFragment) }
-
+        binding.nb.setRightClickListener { showDialog() }
 
         initCtrlViews()
 
@@ -105,11 +108,16 @@ class RoomCtrlFragment : BaseFragment<FraRoomCtrlBinding>(), ClickLimitListener,
         binding.llSwitch.setClickLimitListener(this)
         binding.ivAdd.setClickAlpha(this)
         binding.ivLess.setClickAlpha(this)
+        binding.tvCo2.setClickLimitListener(this)
+        binding.tvPm25.setClickLimitListener(this)
+        binding.tvHomeHumidity2.setClickLimitListener(this)
+        binding.tvHomeTemp2.setClickLimitListener(this)
         binding.llZhiRe.setClickLimitListener(this)
         binding.llZhiLeng.setClickLimitListener(this)
         binding.llChuShi.setClickLimitListener(this)
         binding.llSongFeng.setClickLimitListener(this)
         binding.llXinFeng.setClickLimitListener(this)
+        binding.llShuiMian.setClickLimitListener(this)
         binding.llJiaShi.setClickLimitListener(this)
         binding.llTimer.setClickLimitListener(this)
 
@@ -161,10 +169,11 @@ class RoomCtrlFragment : BaseFragment<FraRoomCtrlBinding>(), ClickLimitListener,
                         LocalData.familyData.value?.gateway ?: "",
                         data,
                         windSpeed,
-                        viewModel.roomData.value!!.isMaster
+                        RoomUtils.isMaster(viewModel.roomData.value?.code)
+//                        viewModel.roomData.value!!.isMaster
                     ).await()
                 }
-                LogUtils.e("设置风速:$windSpeed")
+                LogUtils.d("设置风速:$windSpeed")
             }
 
         })
@@ -229,6 +238,22 @@ class RoomCtrlFragment : BaseFragment<FraRoomCtrlBinding>(), ClickLimitListener,
 
             }
 
+            binding.tvCo2 -> {
+                goDataChart("二氧化碳","co2")
+            }
+
+            binding.tvPm25 -> {
+                goDataChart("PM2.5","pm25")
+            }
+
+            binding.tvHomeHumidity2 -> {
+                goDataChart("湿度", "humidity")
+            }
+
+            binding.tvHomeTemp2 -> {
+                goDataChart("温度","temp")
+            }
+
             binding.llTimer -> {
                 if (data.timerStatus) {
                     data.timerStatus = false
@@ -254,6 +279,12 @@ class RoomCtrlFragment : BaseFragment<FraRoomCtrlBinding>(), ClickLimitListener,
                 }
             }
 
+            binding.llShuiMian -> {
+                data.sleepMode = !data.sleepMode
+                scopeNetLife {
+                    setSleep(LocalData.familyData.value?.gateway ?: "", data).await()
+                }
+            }
 
             else -> {
                 val modeType = when (view) {
@@ -345,5 +376,45 @@ class RoomCtrlFragment : BaseFragment<FraRoomCtrlBinding>(), ClickLimitListener,
         }
     }
 
+    private fun showDialog() {
+        if (mRightTopPlusPop == null) {
+            mRightTopPlusPop =
+                CustomPopupWindow(act, R.layout.room_ctrl_popup, CustomPopupWindow.TYPE_FULL_SCREEN)
+        }
+        mRightTopPlusPop?.showAtLocation(view, Gravity.END or Gravity.TOP, 0, 0)
+
+        mRightTopPlusPop?.contentView?.findViewById<View>(R.id.tv_device_info)
+            ?.setClickLimitListener {
+                closeRightTopPop()
+                act.clearGoTo(
+                    WebActivity.getNewWebIntent(
+                        act,
+                        "https://app.yongxulvjian.com/#/DeviceInfo/${viewModel.roomData.value?.recordId ?: ""}",
+                        "设备信息"
+                    )
+                )
+            }
+
+        mRightTopPlusPop?.contentView?.findViewById<View>(R.id.tv_edit_name)
+            ?.setClickLimitListener {
+                closeRightTopPop()
+                findNavController().navigate(R.id.action_roomCtrlFragment_to_roomSettingFragment)
+            }
+    }
+
+    private fun closeRightTopPop() {
+        if (mRightTopPlusPop?.isShowing == true) {
+            mRightTopPlusPop?.dismiss()
+        }
+    }
 
+    private fun goDataChart(typeName: String, type: String) {
+        act.clearGoTo(
+            WebActivity.getNewWebIntent(
+                act,
+                "https://app.yongxulvjian.com/#/DataChart/${viewModel.roomData.value?.recordId}/${type}",
+                typeName
+            )
+        )
+    }
 }

+ 3 - 2
app/src/main/java/com/rdiot/yx485/ui/ctrl/RoomCtrlMainActivity.kt

@@ -10,6 +10,7 @@ import com.rdiot.yx485.base.BaseActivity
 import com.rdiot.yx485.bean.RoomData
 import com.rdiot.yx485.databinding.ActRoomCtrlMainBinding
 import com.rdiot.yx485.ui.ctrl.model.RoomCtrlViewModel
+import com.rdiot.yx485.util.RoomUtils
 
 /**
  * 房间控制 容器
@@ -38,9 +39,9 @@ class RoomCtrlMainActivity : BaseActivity<ActRoomCtrlMainBinding>() {
         roomCtrlViewModel = ViewModelProvider(this)[RoomCtrlViewModel::class.java]
         val tempRoomData = intent.getSerializableExtra(ROOM_DATA) ?: finish()
         roomCtrlViewModel.roomData.postValue(tempRoomData as RoomData)
+        val isMaster = RoomUtils
 
-
-        if (!tempRoomData.isMaster) {
+        if (!RoomUtils.isMaster(tempRoomData.code)) {
             navController.navigate(R.id.subRoomCtrlFragment)
         }
 

+ 25 - 4
app/src/main/java/com/rdiot/yx485/ui/ctrl/SubRoomCtrlFragment.kt

@@ -13,6 +13,7 @@ import com.drake.net.utils.scopeNetLife
 import com.jaygoo.widget.OnRangeChangedListener
 import com.jaygoo.widget.RangeSeekBar
 import com.king.zxing.util.LogUtils
+import com.lindroy.iosdialog.IBottomListDialog
 import com.rdiot.yx485.R
 import com.rdiot.yx485.base.BaseFragment
 import com.rdiot.yx485.base.LocalData
@@ -20,6 +21,7 @@ import com.rdiot.yx485.base.RoomCtrlViewModelFactory
 import com.rdiot.yx485.databinding.FraSubRoomCtrlBinding
 import com.rdiot.yx485.net.*
 import com.rdiot.yx485.ui.ctrl.model.RoomCtrlViewModel
+import com.rdiot.yx485.ui.web.WebActivity
 import com.rdiot.yx485.util.*
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.delay
@@ -64,7 +66,9 @@ class SubRoomCtrlFragment : BaseFragment<FraSubRoomCtrlBinding>(), ClickLimitLis
     ) {
 
         binding.nb.setLeftClickListener { act.finish() }
-        binding.nb.setRightClickListener { findNavController().navigate(R.id.action_subRoomCtrlFragment_to_roomSettingFragment) }
+        binding.nb.setRightClickListener {
+            findNavController().navigate(R.id.action_subRoomCtrlFragment_to_roomSettingFragment)
+        }
 
 
         initCtrlViews()
@@ -81,7 +85,8 @@ class SubRoomCtrlFragment : BaseFragment<FraSubRoomCtrlBinding>(), ClickLimitLis
 
     private fun initCtrlViews() {
         binding.llSwitch.setClickLimitListener(this)
-
+        binding.tvHomeHumidity2.setClickLimitListener(this)
+        binding.tvHomeTemp2.setClickLimitListener(this)
 
         //风速
         binding.rangeSeekBar.setOnRangeChangedListener(object : OnRangeChangedListener {
@@ -106,7 +111,7 @@ class SubRoomCtrlFragment : BaseFragment<FraSubRoomCtrlBinding>(), ClickLimitLis
                         LocalData.familyData.value?.gateway ?: "",
                         data,
                         windSpeed,
-                        viewModel.roomData.value!!.isMaster
+                        RoomUtils.isMaster(viewModel.roomData.value?.code)
                     ).await()
                 }
             }
@@ -132,6 +137,13 @@ class SubRoomCtrlFragment : BaseFragment<FraSubRoomCtrlBinding>(), ClickLimitLis
                     setPower(LocalData.familyData.value?.gateway ?: "", data).await()
                 }
             }
+            binding.tvHomeHumidity2 -> {
+                goDataChart("湿度", "humidity")
+            }
+
+            binding.tvHomeTemp2 -> {
+                goDataChart("温度","temp")
+            }
             else -> {}
         }
         viewModel.roomData.postValue(data)
@@ -166,5 +178,14 @@ class SubRoomCtrlFragment : BaseFragment<FraSubRoomCtrlBinding>(), ClickLimitLis
         }
     }
 
-
+    //跳转到数据曲线页面
+    private fun goDataChart(typeName: String, type: String) {
+        act.clearGoTo(
+            WebActivity.getNewWebIntent(
+                act,
+                "https://app.yongxulvjian.com/#/DataChart/${viewModel.roomData.value?.recordId}/${type}",
+                typeName
+            )
+        )
+    }
 }

+ 12 - 4
app/src/main/java/com/rdiot/yx485/ui/home/HomeFragment.kt

@@ -9,6 +9,7 @@ import android.view.View
 import android.view.ViewGroup
 import androidx.annotation.IdRes
 import com.drake.brv.annotaion.DividerOrientation
+import com.drake.brv.utils.bindingAdapter
 import com.drake.brv.utils.divider
 import com.drake.brv.utils.grid
 import com.drake.brv.utils.models
@@ -71,7 +72,9 @@ class HomeFragment : BaseFragment<FraHomeBinding>() {
             }
             binding.weatherData = weatherData
         }
-
+        LocalData.welcomeData.observe(this) { welcomeData ->
+            binding.welcomeData = welcomeData
+        }
 
 
         initScenes()
@@ -116,7 +119,7 @@ class HomeFragment : BaseFragment<FraHomeBinding>() {
 
     /** 初始化房间列表 */
     private fun initRooms() {
-        binding.rv.grid(2).divider {
+        binding.rv.grid(1).divider {
             setDrawable(R.drawable.divider_horizontal)
             orientation = DividerOrientation.GRID
             includeVisible = true
@@ -126,7 +129,6 @@ class HomeFragment : BaseFragment<FraHomeBinding>() {
                 val binding = getBinding<ItemRoomBinding>()
 
                 binding.clItem.setOnClickListener {
-
                     clickHandler(R.id.cl_item, this.modelPosition)
                 }
 
@@ -141,7 +143,10 @@ class HomeFragment : BaseFragment<FraHomeBinding>() {
             if (!it.isNullOrBlank()) {
                 binding.page.onRefresh {
                     scope {
-                        binding.rv.models = getFamilyData().await().room
+//                        binding.rv.models = getFamilyData().await().room
+                        getFamilyData().await().also {
+                            LocalData.familyData.postValue(it)
+                        }
                     }
                 }.autoRefresh()
             }
@@ -163,6 +168,9 @@ class HomeFragment : BaseFragment<FraHomeBinding>() {
                 } else {
                     tempList.clear()
                     tempList.addAll(roomData)
+                    tempList.forEach {
+                        it.isOnline = familyData.isOnline
+                    }
                     binding.rv.models = tempList
 
                     binding.ivNoRoom.visibility = View.GONE

+ 4 - 2
app/src/main/java/com/rdiot/yx485/ui/login/LoginActivity.kt

@@ -147,7 +147,8 @@ class LoginActivity : BaseActivity<ActLoginBinding>() {
                     clearGoTo(
                         WebActivity.getNewWebIntent(
                             this,
-                            "https://app.yongxulvjian.com/ServiceAgreement"
+                            "https://app.yongxulvjian.com/ServiceAgreement",
+                            "用户协议"
                         )
                     )
                 }.toClickSpan(
@@ -157,7 +158,8 @@ class LoginActivity : BaseActivity<ActLoginBinding>() {
                     clearGoTo(
                         WebActivity.getNewWebIntent(
                             this,
-                            "https://app.yongxulvjian.com/PrivacyPolicy"
+                            "https://app.yongxulvjian.com/PrivacyPolicy",
+                            "隐私政策"
                         )
                     )
                 }

+ 4 - 2
app/src/main/java/com/rdiot/yx485/ui/login/LoginPwdFragment.kt

@@ -102,7 +102,8 @@ class LoginPwdFragment : BaseFragment<FraLoginPwdBinding>(), ClickLimitListener
                 act.clearGoTo(
                     WebActivity.getNewWebIntent(
                         act,
-                        "https://app.yongxulvjian.com/ServiceAgreement"
+                        "https://app.yongxulvjian.com/ServiceAgreement",
+                        "用户协议"
                     )
                 )
             }
@@ -111,7 +112,8 @@ class LoginPwdFragment : BaseFragment<FraLoginPwdBinding>(), ClickLimitListener
                 act.clearGoTo(
                     WebActivity.getNewWebIntent(
                         act,
-                        "https://app.yongxulvjian.com/PrivacyPolicy"
+                        "https://app.yongxulvjian.com/PrivacyPolicy",
+                        "隐私政策"
                     )
                 )
             }

+ 4 - 2
app/src/main/java/com/rdiot/yx485/ui/login/LoginSmsFragment.kt

@@ -122,7 +122,8 @@ class LoginSmsFragment : BaseFragment<FraLoginSmsBinding>(), ClickLimitListener
                 act.clearGoTo(
                     WebActivity.getNewWebIntent(
                         act,
-                        "https://app.yongxulvjian.com/ServiceAgreement"
+                        "https://app.yongxulvjian.com/ServiceAgreement",
+                        "用户协议"
                     )
                 )
             }
@@ -131,7 +132,8 @@ class LoginSmsFragment : BaseFragment<FraLoginSmsBinding>(), ClickLimitListener
                 act.clearGoTo(
                     WebActivity.getNewWebIntent(
                         act,
-                        "https://app.yongxulvjian.com/PrivacyPolicy"
+                        "https://app.yongxulvjian.com/PrivacyPolicy",
+                        "隐私政策"
                     )
                 )
             }

+ 4 - 1
app/src/main/java/com/rdiot/yx485/ui/main/MainActivity.kt

@@ -22,6 +22,7 @@ import com.rdiot.yx485.databinding.ItemBottomTabBinding
 import com.rdiot.yx485.net.getCurrentUserData
 import com.rdiot.yx485.net.getFamilyData
 import com.rdiot.yx485.net.getWeather
+import com.rdiot.yx485.net.getWelcome
 import com.rdiot.yx485.ui.bind.BindActivity
 import com.rdiot.yx485.ui.home.HomeFragment
 import com.rdiot.yx485.ui.login.LoginActivity
@@ -148,7 +149,9 @@ class MainActivity : BaseActivity<ActMainBinding>() {
                     getWeather(userData.defaultHomeId).await().also { weatherData ->
                         LocalData.weatherData.postValue(weatherData)
                     }
-
+                    getWelcome().await().also { welcomeData ->
+                        LocalData.welcomeData.postValue(welcomeData)
+                    }
                 }
 
                 startPoll()

+ 6 - 3
app/src/main/java/com/rdiot/yx485/ui/mine/MineFragment.kt

@@ -93,7 +93,8 @@ class MineFragment : BaseFragment<FraMineBinding>() {
                     act.clearGoTo(
                         WebActivity.getNewWebIntent(
                             act,
-                            "https://app.yongxulvjian.com/HelpList"
+                            "https://app.yongxulvjian.com/HelpList",
+                            "帮助列表"
                         )
                     )
                 }
@@ -105,7 +106,8 @@ class MineFragment : BaseFragment<FraMineBinding>() {
                     act.clearGoTo(
                         WebActivity.getNewWebIntent(
                             act,
-                            "https://app.yongxulvjian.com/ServiceAgreement"
+                            "https://app.yongxulvjian.com/ServiceAgreement",
+                            "用户协议"
                         )
                     )
                 }
@@ -114,7 +116,8 @@ class MineFragment : BaseFragment<FraMineBinding>() {
                     act.clearGoTo(
                         WebActivity.getNewWebIntent(
                             act,
-                            "https://app.yongxulvjian.com/PrivacyPolicy"
+                            "https://app.yongxulvjian.com/PrivacyPolicy",
+                            "隐私政策"
                         )
                     )
                 }

+ 6 - 2
app/src/main/java/com/rdiot/yx485/ui/room/RoomFragment.kt

@@ -66,7 +66,7 @@ class RoomFragment : BaseFragment<FraRoomBinding>() {
     }
 
     private fun initRooms() {
-        binding.rv.grid(2).divider {
+        binding.rv.grid(1).divider {
             setDrawable(R.drawable.divider_horizontal)
             orientation = DividerOrientation.GRID
             includeVisible = true
@@ -110,7 +110,10 @@ class RoomFragment : BaseFragment<FraRoomBinding>() {
             if (!it.isNullOrBlank()) {
                 binding.page.onRefresh {
                     scope {
-                        binding.rv.models = getFamilyData().await().room
+                        getFamilyData().await().also {
+                            LocalData.familyData.postValue(it)
+                        }
+//                        binding.rv.models = getFamilyData().await().room
 //                        addData(getFamilyData().await().room) {
 //                            index < 1
 //                        }
@@ -136,6 +139,7 @@ class RoomFragment : BaseFragment<FraRoomBinding>() {
 
                     resourceRoomDataList.forEach {
                         it.isEditMode = binding.rv.bindingAdapter.toggleMode
+                        it.isOnline = familyData.isOnline
                     }
 
                     binding.rv.models = resourceRoomDataList

+ 61 - 9
app/src/main/java/com/rdiot/yx485/ui/web/WebActivity.kt

@@ -4,9 +4,13 @@ import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.view.KeyEvent
+import android.view.View
 import android.webkit.*
+import android.webkit.WebSettings.LOAD_NO_CACHE
+import android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
 import com.gyf.immersionbar.ktx.immersionBar
 import com.king.zxing.util.LogUtils
+import com.rdiot.yx485.BuildConfig
 import com.rdiot.yx485.R
 import com.rdiot.yx485.base.BaseActivity
 import com.rdiot.yx485.databinding.ActWebBinding
@@ -18,15 +22,19 @@ import com.rdiot.yx485.databinding.ActWebBinding
  */
 class WebActivity : BaseActivity<ActWebBinding>() {
     private lateinit var webUrl: String
+    private lateinit var title: String
     override fun getLayoutId() = R.layout.act_web
+    private var isError = false
 
     companion object {
         private const val WEB_URL = "webUrl"
+        private const val TITLE = "title"
 
-        fun getNewWebIntent(context: Context, url: String): Intent {
+        fun getNewWebIntent(context: Context, url: String, title: String): Intent {
             val intent = Intent(context, WebActivity::class.java)
             intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
             intent.putExtra(WEB_URL, url)
+            intent.putExtra(TITLE, title)
             return intent
         }
     }
@@ -41,8 +49,8 @@ class WebActivity : BaseActivity<ActWebBinding>() {
         }
 
         webUrl = intent.getStringExtra(WEB_URL) ?: ""
-
-
+        title = intent.getStringExtra(TITLE) ?: ""
+        binding.nb.setTitle(title)
         binding.nb.setLeftClickListener {
             if (binding.wv.canGoBack()) {
                 binding.wv.goBack()
@@ -50,22 +58,51 @@ class WebActivity : BaseActivity<ActWebBinding>() {
                 finish()
             }
         }
-
         initWebView()
     }
 
     private fun initWebView() {
         binding.wv.apply {
-            webViewClient = WebViewClient()
+            webViewClient = object : WebViewClient() {
+                override fun shouldOverrideUrlLoading(
+                    view: WebView?,
+                    request: WebResourceRequest
+                ): Boolean {
+                    return true
+                }
+
+                override fun onPageFinished(webView: WebView?, s: String?) {
+                    super.onPageFinished(webView, s)
+                    //如果有问题,会先执行error,
+                    if (isError) {
+                        binding.wv.visibility = View.GONE
+                        binding.bridgeLayoutMainGif.visibility = View.GONE
+                    } else {
+                        binding.wv.visibility = View.VISIBLE
+                        binding.bridgeLayoutMainGif.visibility = View.GONE
+                    }
+                }
+
+                override fun onReceivedError(
+                    webView: WebView?,
+                    webResourceRequest: WebResourceRequest,
+                    webResourceError: WebResourceError?
+                ) {
+                    super.onReceivedError(webView, webResourceRequest, webResourceError)
+                    if (webResourceRequest.isForMainFrame) {
+                        //加载失败后,需要设置isLoadSuccess为false
+                        isError = true
+                    }
+                }
+            }
             webChromeClient = object : WebChromeClient() {
                 override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
-                    LogUtils.d("consoleMessage:${consoleMessage?.message()}")
+                    LogUtils.d("consoleMessage:${consoleMessage?.message().toString()}")
                     return super.onConsoleMessage(consoleMessage)
                 }
 
                 override fun onReceivedTitle(view: WebView?, title: String?) {
                     super.onReceivedTitle(view, title)
-                    binding.nb.setTitle(title)
                 }
             }
             val userAgent = settings.userAgentString
@@ -75,11 +112,21 @@ class WebActivity : BaseActivity<ActWebBinding>() {
                 useWideViewPort = true
                 loadWithOverviewMode = false
                 userAgentString = "$userAgent yongxulvjian/1.0.0"
+                javaScriptCanOpenWindowsAutomatically =
+                    true//JavaScript 可以自动打开新窗口,这是通过使用 window.open() 方法实现的
+                allowFileAccess = true //当设置为true,就可以 使用file://加载文件
+                setSupportMultipleWindows(true)
+                allowUniversalAccessFromFileURLs = true//允许跨域
+                mixedContentMode = MIXED_CONTENT_ALWAYS_ALLOW
+                pluginState = WebSettings.PluginState.ON
+                domStorageEnabled = true
+                cacheMode = LOAD_NO_CACHE
+            }
+            if (BuildConfig.DEBUG) {
+                WebView.setWebContentsDebuggingEnabled(true)
             }
         }
         binding.wv.loadUrl(webUrl)
-//        LogUtils.e(binding.wv.settings.userAgentString)
-
     }
 
 
@@ -119,4 +166,9 @@ class WebActivity : BaseActivity<ActWebBinding>() {
         }
     }
 
+    override fun onDestroy() {
+        super.onDestroy()
+        binding.wv.loadUrl("about:blank")
+        binding.wv.destroy()
+    }
 }

+ 14 - 0
app/src/main/java/com/rdiot/yx485/ui/web/util/JsBridge.kt

@@ -0,0 +1,14 @@
+package com.rdiot.yx485.ui.web.util
+
+import android.app.Activity
+import android.webkit.JavascriptInterface
+
+class JsBridge (val act: Activity){
+    val WEB_LOAD_SUCCESS = "WEB_LOAD_SUCCESS"
+    val WEB_LOAD_ERR = "WEB_LOAD_ERR"
+    @JavascriptInterface //要想让js访问该类的方法,在方法上加个这,我也不知道是啥玩意
+    fun closePage() {
+        act.finish()
+    }
+
+}

+ 150 - 0
app/src/main/java/com/rdiot/yx485/util/RoomUtils.kt

@@ -0,0 +1,150 @@
+package com.rdiot.yx485.util
+
+import android.content.Context
+import android.graphics.drawable.GradientDrawable
+import android.widget.ImageView
+import androidx.core.content.ContextCompat
+import androidx.databinding.BindingAdapter
+import com.bumptech.glide.Glide
+import com.king.zxing.util.LogUtils
+import com.rdiot.yx485.R
+import com.rdiot.yx485.base.LocalData
+import com.rdiot.yx485.net.DeviceCode
+
+object RoomUtils {
+    @JvmStatic
+    fun getIcon(code: String?): Int {
+        val result = when (code) {
+            DeviceCode.WATER_MASTER.typeCode -> R.mipmap.water_master
+            DeviceCode.WATER_SUB.typeCode -> R.mipmap.water_sub
+            DeviceCode.WATER_INTELLIGENCE.typeCode -> R.mipmap.water_intelligence
+            DeviceCode.FLUORINE_MASTER.typeCode -> R.mipmap.fluorine_master
+            else -> R.mipmap.fluorine_sub
+        }
+
+        return result
+    }
+
+    @JvmStatic
+    @BindingAdapter("imageResource")
+    fun loadImage(view: ImageView, code: String?) {
+        val context = view.context
+
+        Glide.with(context)
+            .load(getIcon(code))
+            .into(view)
+    }
+
+    @JvmStatic
+    @BindingAdapter("imageUrl")
+    fun loadImageByUrl(view: ImageView, icon: String?) {
+        val context = view.context
+        val imgUrl = "${LocalData.apiHost.avatarHost}${icon}"
+        Glide.with(context)
+            .load(imgUrl).placeholder(R.mipmap.fluorine_sub)
+            .into(view)
+    }
+
+//    @JvmStatic
+//    fun getName(code: String?): Int {
+//        val result = when (code) {
+//            DeviceCode.WATER_MASTER.typeCode -> R.string.master
+//            DeviceCode.WATER_SUB.typeCode -> R.string.sub
+//            DeviceCode.WATER_INTELLIGENCE.typeCode -> R.string.intelligence
+//            DeviceCode.FLUORINE_MASTER.typeCode -> R.string.master
+//            else -> R.string.sub
+//        }
+//        return result
+//    }
+
+    @JvmStatic
+    fun getDesc(code: String?): Int {
+        val result = when (code) {
+            DeviceCode.WATER_MASTER.typeCode -> R.string.master_en
+            DeviceCode.WATER_SUB.typeCode -> R.string.sub_en
+            DeviceCode.WATER_INTELLIGENCE.typeCode -> R.string.intelligence_en
+            DeviceCode.FLUORINE_MASTER.typeCode -> R.string.master_en
+            else -> R.string.sub_en
+        }
+        return result
+    }
+
+    @JvmStatic
+    fun getIconColor(code: String?, context: Context): GradientDrawable {
+        val result = when (code) {
+            DeviceCode.WATER_MASTER.typeCode -> R.color.c_21B191
+            DeviceCode.WATER_SUB.typeCode -> R.color.c_4AB0E4
+            DeviceCode.WATER_INTELLIGENCE.typeCode -> R.color.c_60A736
+            DeviceCode.FLUORINE_MASTER.typeCode -> R.color.c_5198FD
+            else -> R.color.c_F0B756
+        }
+        val shape = GradientDrawable()
+        shape.cornerRadius = 40f // 圆角半径
+        shape.setColor(ContextCompat.getColor(context, result))
+        return shape
+    }
+
+    @JvmStatic
+    fun getTextColor(code: String?, context: Context): Int {
+        val result = when (code) {
+            DeviceCode.WATER_MASTER.typeCode -> R.color.c_558178
+            DeviceCode.WATER_SUB.typeCode -> R.color.c_387084
+            DeviceCode.WATER_INTELLIGENCE.typeCode -> R.color.c_517232
+            DeviceCode.FLUORINE_MASTER.typeCode -> R.color.c_31517D
+            else -> R.color.c_A79365
+        }
+        return ContextCompat.getColor(context, result)
+    }
+
+    @JvmStatic
+    fun getBgColor(code: String?, context: Context): GradientDrawable {
+        val result = when (code) {
+            DeviceCode.WATER_MASTER.typeCode -> R.color.c_8BFAE1
+            DeviceCode.WATER_SUB.typeCode -> R.color.c_55DCDF
+            DeviceCode.WATER_INTELLIGENCE.typeCode -> R.color.c_B1EB5C
+            DeviceCode.FLUORINE_MASTER.typeCode -> R.color.c_97C2FF
+            else -> R.color.c_FAE06A
+        }
+        val shape = GradientDrawable()
+        shape.cornerRadius = 20f // 圆角半径
+        shape.setColor(ContextCompat.getColor(context, result))
+
+        return shape
+    }
+
+    //是否是水机
+    @JvmStatic
+    fun isWater(code: String?): Boolean {
+        val result = when (code) {
+            DeviceCode.WATER_MASTER.typeCode -> true
+            DeviceCode.WATER_SUB.typeCode -> true
+            DeviceCode.WATER_INTELLIGENCE.typeCode -> true
+            DeviceCode.FLUORINE_MASTER.typeCode -> false
+            else -> false
+        }
+        return result
+    }
+
+    //是否是主控
+    @JvmStatic
+    fun isMaster(code: String?): Boolean {
+        val result = when (code) {
+            DeviceCode.WATER_MASTER.typeCode -> true
+            DeviceCode.WATER_SUB.typeCode -> false
+            DeviceCode.WATER_INTELLIGENCE.typeCode -> false
+            DeviceCode.FLUORINE_MASTER.typeCode -> true
+            else -> false
+        }
+        return result
+    }
+
+    //是否显示睡眠
+    @JvmStatic
+    fun isShowSleep(code: String?): Boolean {
+        val result = when (code) {
+            DeviceCode.FLUORINE_MASTER.typeCode -> false
+            else -> true
+        }
+        return result
+    }
+}

+ 57 - 0
app/src/main/java/com/rdiot/yx485/view/CustomPopupWindow.kt

@@ -0,0 +1,57 @@
+package com.rdiot.yx485.view
+
+import android.content.Context
+import android.graphics.drawable.ColorDrawable
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.PopupWindow
+import androidx.annotation.LayoutRes
+import android.view.ViewGroup.LayoutParams
+import com.rdiot.yx485.util.setClickLimitListener
+
+/**
+ * 自定义pop弹框
+ */
+class CustomPopupWindow(context: Context, @LayoutRes layout: Int, type: Int) :
+    PopupWindow(context) {
+    private val mMenuView: View
+
+    init {
+        val inflater = LayoutInflater.from(context)
+        mMenuView = inflater.inflate(layout, null)
+        contentView = mMenuView
+        contentView.setClickLimitListener { (dismiss()) }
+
+        setLayoutParams(type)
+
+        isFocusable = true
+        val dw = ColorDrawable(0)
+        setBackgroundDrawable(dw)
+        isOutsideTouchable = true
+    }
+
+    private fun setLayoutParams(type: Int) {
+        when (type) {
+            TYPE_FULL_SCREEN -> {
+                width = LayoutParams.MATCH_PARENT
+                height = LayoutParams.MATCH_PARENT
+            }
+
+            TYPE_WRAP_CONTENT -> {
+                width = LayoutParams.WRAP_CONTENT
+                height = LayoutParams.WRAP_CONTENT
+            }
+
+            TYPE_MATCH_WIDTH -> {
+                width = LayoutParams.MATCH_PARENT
+                height = LayoutParams.WRAP_CONTENT
+            }
+        }
+    }
+
+    companion object {
+        const val TYPE_FULL_SCREEN = 1
+        const val TYPE_WRAP_CONTENT = 2
+        const val TYPE_MATCH_WIDTH = 3
+    }
+}

+ 22 - 0
app/src/main/java/com/rdiot/yx485/view/CustomScrollView.kt

@@ -0,0 +1,22 @@
+package com.rdiot.yx485.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.MotionEvent
+import android.widget.ScrollView
+
+/**
+ * ScrollView
+ * 嵌套其他滑动组件,导致其他组件无法滑动
+ */
+class CustomScrollView : ScrollView {
+
+    constructor(context: Context) : super(context)
+
+    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
+
+    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
+        return false
+    }
+
+}

+ 5 - 0
app/src/main/res/drawable/arc_seek_bar_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid android:color="@color/white" />
+</shape>

+ 6 - 0
app/src/main/res/drawable/bg_device_ctrl_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <corners android:radius="10dp" />
+</shape>

+ 1 - 1
app/src/main/res/drawable/bg_device_ctrl_btn_sel.xml

@@ -2,5 +2,5 @@
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="rectangle">
     <solid android:color="@color/room_device_on_bg_color" />
-    <corners android:radius="16dp" />
+    <corners android:radius="13dp" />
 </shape>

+ 6 - 0
app/src/main/res/drawable/bg_item_room_disconnect.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/c_FAAD14" />
+    <corners android:radius="20dp" />
+</shape>

+ 6 - 0
app/src/main/res/drawable/bg_item_room_humidity_temperature.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/c_14C9C8" />
+    <corners android:radius="20dp" />
+</shape>

+ 6 - 0
app/src/main/res/drawable/bg_room_device.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/white" />
+    <corners android:radius="20dp" />
+</shape>

+ 5 - 0
app/src/main/res/drawable/corners_5dp.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/white"/>
+    <corners android:radius="5dp" />
+</shape>

+ 6 - 0
app/src/main/res/drawable/room_seekbar_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/c_14D3C0"/>
+    <corners android:bottomRightRadius="10dp"
+        android:topRightRadius="10dp"/>
+</shape>

+ 6 - 0
app/src/main/res/drawable/room_seekbar_default_bg.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/c_EEF8F6"/>
+    <corners android:bottomRightRadius="10dp"
+        android:topRightRadius="10dp"/>
+</shape>

+ 7 - 0
app/src/main/res/drawable/room_seekbar_left_bg.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@color/c_14D3C0" />
+    <corners android:bottomLeftRadius="10dp"
+        android:topLeftRadius="10dp"/>
+</shape>

+ 14 - 0
app/src/main/res/drawable/rsb_thumb_drawable.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:width="33dp"
+        android:gravity="center"
+        android:height="33dp"
+        android:drawable="@drawable/rsb_thumb_shadow" />
+
+    <item
+        android:width="32dp"
+        android:height="32dp"
+        android:gravity="center"
+        android:drawable="@mipmap/range_seek_bar_thumb" />
+</layer-list>

+ 6 - 0
app/src/main/res/drawable/rsb_thumb_shadow.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape android:shape="oval"
+       xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/c_15161A"/>
+</shape>
+

+ 7 - 0
app/src/main/res/drawable/shape_divider_1px.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--该shape多用作分割线来使用-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <size android:width="1px"
+          android:height="1px"/>
+    <solid android:color="@color/c_FFD7D7D7"/>
+</shape>

+ 9 - 0
app/src/main/res/layout/act_web.xml

@@ -27,7 +27,16 @@
             android:id="@+id/wv"
             android:background="@color/white"
             android:layout_width="match_parent"
+            android:visibility="gone"
             android:layout_height="match_parent" />
 
+
+        <ProgressBar
+            android:id="@+id/bridge_layout_main_gif"
+            style="@android:style/Widget.Holo.Light.ProgressBar.Large.Inverse"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="center" />
+
     </LinearLayout>
 </layout>

+ 8 - 4
app/src/main/res/layout/fra_home.xml

@@ -13,6 +13,10 @@
             name="weatherData"
             type="com.rdiot.yx485.bean.WeatherData" />
 
+        <variable
+            name="welcomeData"
+            type="com.rdiot.yx485.bean.WelcomeData" />
+
     </data>
 
     <androidx.coordinatorlayout.widget.CoordinatorLayout
@@ -65,17 +69,17 @@
                             android:layout_width="wrap_content"
                             android:layout_height="wrap_content"
                             android:layout_marginTop="7dp"
-                            android:text="@string/welcome"
+                            android:text="@{welcomeData.value}"
                             android:textColor="@color/main_text_color"
-                            android:textSize="18sp"
+                            android:textSize="14sp"
                             android:textStyle="bold"
                             app:layout_constraintStart_toStartOf="parent"
                             app:layout_constraintTop_toBottomOf="@id/tv_user_name" />
 
                         <androidx.appcompat.widget.AppCompatImageView
                             android:id="@+id/iv_avatar"
-                            android:layout_width="50dp"
-                            android:layout_height="50dp"
+                            android:layout_width="45dp"
+                            android:layout_height="45dp"
                             android:adjustViewBounds="true"
                             app:layout_constraintBottom_toBottomOf="@id/tv_1"
                             app:layout_constraintEnd_toEndOf="parent"

+ 522 - 453
app/src/main/res/layout/fra_room_ctrl.xml

@@ -11,7 +11,9 @@
 
         <import type="android.view.View" />
 
-        <import type="com.rdiot.yx485.net.ModeType"/>
+        <import type="com.rdiot.yx485.util.RoomUtils" />
+
+        <import type="com.rdiot.yx485.net.ModeType" />
     </data>
 
     <LinearLayout
@@ -27,480 +29,547 @@
             app:zRightIcon="@mipmap/icon_more"
             app:zTitle="@string/room" />
 
-
-        <!--模式按钮-->
-
-
-        <HorizontalScrollView
-            android:id="@+id/hsv"
+        <com.rdiot.yx485.view.CustomScrollView
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:scrollbars="none"
-            tools:ignore="SpeakableTextPresentCheck">
-
-            <!--<androidx.constraintlayout.widget.ConstraintLayout-->
-            <!--    android:layout_width="match_parent"-->
-            <!--    android:layout_height="wrap_content"-->
-            <!--    android:layout_marginStart="25dp"-->
-            <!--    android:layout_marginEnd="25dp"-->
-            <!--    tools:context="ui.ctrl.RoomCtrlFragment">-->
-            <LinearLayout
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:orientation="horizontal">
-
-
-                <LinearLayout
-                    android:id="@+id/ll_zhi_leng"
-                    android:layout_width="70dp"
-                    android:layout_height="70dp"
-                    android:layout_marginStart="20dp"
-                    android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.ZHI_LENG.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
-                    android:gravity="center"
-                    app:layout_constraintDimensionRatio="h,1:1"
-                    app:layout_constraintEnd_toStartOf="@id/ll_zhi_re"
-                    app:layout_constraintHorizontal_chainStyle="spread_inside"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:layout_constraintWidth_percent="0.18">
-
-                    <androidx.appcompat.widget.AppCompatImageView
-                        srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.ZHI_LENG.typeCode? `icon_refrigeration_sel` :`icon_refrigeration`}"
-                        android:layout_width="70dp"
-                        android:layout_height="70dp"
-                        tools:srcCompat="@mipmap/icon_refrigeration" />
-
-                </LinearLayout>
-
-                <LinearLayout
-                    android:id="@+id/ll_zhi_re"
-                    android:layout_width="70dp"
-                    android:layout_height="70dp"
-                    android:layout_marginStart="20dp"
-                    android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.ZHI_RE.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
-                    android:gravity="center"
-                    app:layout_constraintDimensionRatio="h,1:1"
-                    app:layout_constraintEnd_toStartOf="@id/ll_chu_shi"
-                    app:layout_constraintStart_toEndOf="@id/ll_zhi_leng"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:layout_constraintWidth_percent="0.18"
-                    tools:background="@drawable/bg_device_ctrl_btn_sel">
-
-                    <androidx.appcompat.widget.AppCompatImageView
-                        srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.ZHI_RE.typeCode? `icon_heating_sel` :`icon_heating`}"
-                        android:layout_width="70dp"
-                        android:layout_height="70dp"
-                        tools:srcCompat="@mipmap/icon_heating_sel" />
-
-                </LinearLayout>
-
-                <LinearLayout
-                    android:id="@+id/ll_chu_shi"
-                    android:layout_width="70dp"
-                    android:layout_height="70dp"
-                    android:layout_marginStart="20dp"
-                    android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.CHU_SHI.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
-                    android:gravity="center"
-                    app:layout_constraintDimensionRatio="h,1:1"
-                    app:layout_constraintEnd_toStartOf="@id/ll_song_feng"
-                    app:layout_constraintStart_toEndOf="@id/ll_zhi_re"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:layout_constraintWidth_percent="0.18">
-
-                    <androidx.appcompat.widget.AppCompatImageView
-                        srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.CHU_SHI.typeCode? `icon_dehumidification_sel` :`icon_dehumidification`}"
-                        android:layout_width="70dp"
-                        android:layout_height="70dp"
-                        tools:srcCompat="@mipmap/icon_dehumidification" />
-
-                </LinearLayout>
-
-                <LinearLayout
-                    android:id="@+id/ll_song_feng"
-                    android:layout_width="70dp"
-                    android:layout_height="70dp"
-                    android:layout_marginStart="20dp"
-                    android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.SONG_FENG.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
-                    android:gravity="center"
-                    app:layout_constraintDimensionRatio="h,1:1"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toEndOf="@id/ll_chu_shi"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:layout_constraintWidth_percent="0.18">
-
-                    <androidx.appcompat.widget.AppCompatImageView
-                        srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.SONG_FENG.typeCode? `icon_wind_sel` :`icon_wind`}"
-                        android:layout_width="70dp"
-                        android:layout_height="70dp"
-                        tools:srcCompat="@mipmap/icon_wind" />
-
-                </LinearLayout>
-
-
-                <LinearLayout
-                    android:id="@+id/ll_jia_shi"
-                    android:layout_width="70dp"
-                    android:layout_height="70dp"
-                    android:layout_marginStart="20dp"
-                    android:layout_marginEnd="20dp"
-                    android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.JIA_SHI.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
-                    android:gravity="center"
-                    app:layout_constraintDimensionRatio="h,1:1"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toEndOf="@id/ll_chu_shi"
-                    app:layout_constraintTop_toTopOf="parent"
-                    app:layout_constraintWidth_percent="0.18">
-
-                    <androidx.appcompat.widget.AppCompatImageView
-                        srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.JIA_SHI.typeCode? `icon_humidify_sel` :`icon_humidify`}"
-                        android:layout_width="70dp"
-                        android:layout_height="70dp"
-                        tools:srcCompat="@mipmap/icon_humidify" />
-
-                </LinearLayout>
-
-
-            </LinearLayout>
-
-
-        </HorizontalScrollView>
-
-
-        <!--控制-->
-        <androidx.constraintlayout.widget.ConstraintLayout
-            android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1">
-
-            <com.king.view.arcseekbar.ArcSeekBar
-                android:id="@+id/arc_seek_bar"
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                android:layout_marginTop="40dp"
-                android:padding="10dp"
-                app:arcMax="14"
-                app:arcNormalColor="@color/device_ctrl_panel_bg_color"
-                app:arcProgressColor="@color/device_ctrl_panel_progress_color"
-                app:arcShowLabel="false"
-                app:arcStartAngle="140"
-                app:arcStrokeWidth="20dp"
-                app:arcSweepAngle="260"
-                app:arcThumbColor="@color/white"
-                app:arcThumbInnerDotWidth="10dp"
-                app:arcThumbShadowColor="#20000000"
-                app:arcThumbShadowRadius="5dp"
-                app:arcThumbWidth="18dp"
-                app:layout_constraintDimensionRatio="h,1:1"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                app:layout_constraintWidth_percent="0.7" />
-
-            <TextView
-                android:id="@+id/tv_temp"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="30dp"
-                android:includeFontPadding="false"
-                android:text="@{String.format(`%d`,roomData.setTemp)}"
-                android:textColor="@color/main_text_color"
-                android:textSize="72sp"
-                android:textStyle="bold"
-                app:layout_constraintBottom_toBottomOf="@id/arc_seek_bar"
-                app:layout_constraintEnd_toEndOf="@id/arc_seek_bar"
-                app:layout_constraintStart_toStartOf="@id/arc_seek_bar"
-                app:layout_constraintTop_toTopOf="@id/arc_seek_bar"
-                tools:text="28" />
-
-            <TextView
-                android:id="@+id/tv_mark"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="12sp"
-                android:includeFontPadding="false"
-                android:text="℃"
-                android:textColor="@color/main_text_color"
-                android:textSize="25sp"
-                android:textStyle="bold"
-                app:layout_constraintStart_toEndOf="@id/tv_temp"
-                app:layout_constraintTop_toTopOf="@id/tv_temp" />
-
-            <androidx.appcompat.widget.AppCompatImageView
-                android:id="@+id/iv_less"
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                app:layout_constraintBottom_toBottomOf="@id/arc_seek_bar"
-                app:layout_constraintDimensionRatio="h,1:1"
-                app:layout_constraintStart_toStartOf="@id/arc_seek_bar"
-                app:layout_constraintWidth_percent="0.1"
-                app:srcCompat="@mipmap/icon_reduce" />
-
-
-            <androidx.appcompat.widget.AppCompatImageView
-                android:id="@+id/iv_add"
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                app:layout_constraintBottom_toBottomOf="@id/arc_seek_bar"
-                app:layout_constraintDimensionRatio="h,1:1"
-                app:layout_constraintEnd_toEndOf="@id/arc_seek_bar"
-                app:layout_constraintWidth_percent="0.1"
-                app:srcCompat="@mipmap/icon_add_1" />
-
-            <TextView
-                android:id="@+id/tv_mode_lv"
-                lv="@{roomData.fanSpeed}"
-                mode="@{roomData.mode}"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textColor="@color/main_text_color"
-                android:textSize="13sp"
-                android:textStyle="bold"
-                android:visibility="@{roomData.power?View.VISIBLE:View.GONE}"
-                app:layout_constraintEnd_toEndOf="@id/tv_temp"
-                app:layout_constraintStart_toStartOf="@id/tv_temp"
-                app:layout_constraintTop_toBottomOf="@id/tv_temp"
-                tools:text="制冷&#8195;一档" />
-
-            <TextView
-                android:id="@+id/tv_timer"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@{@string/timer_status(roomData.timerStatus?@string/on:@string/off)}"
-                android:textColor="@color/main_text_color"
-                android:textSize="13sp"
-                tools:text="定时:关"
-                android:textStyle="bold"
-                app:layout_constraintEnd_toEndOf="@id/tv_temp"
-                app:layout_constraintStart_toStartOf="@id/tv_temp"
-                app:layout_constraintTop_toBottomOf="@id/tv_mode_lv" />
-
-            <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/cl_air_info"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                app:layout_constraintBottom_toTopOf="@id/ll_fan_speed"
-                app:layout_constraintTop_toBottomOf="@id/arc_seek_bar">
-
-                <TextView
-                    android:id="@+id/tv_home_temp2"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="12dp"
-                    android:text="@{String.format(`%d℃`,roomData.temperature)}"
-                    android:textAlignment="center"
-                    android:textColor="@color/main_text_color"
-                    android:textSize="16sp"
-                    android:textStyle="bold"
-                    app:drawableTopCompat="@mipmap/icon_temperature_room"
-                    app:layout_constraintEnd_toStartOf="@id/tv_home_humidity2"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toTopOf="parent"
-                    tools:text="13℃" />
-
-                <TextView
-                    android:id="@+id/tv_home_humidity2"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@{String.format(`%d%%`,roomData.humidity)}"
-                    android:textAlignment="center"
-                    android:textColor="@color/main_text_color"
-                    android:textSize="16sp"
-                    android:textStyle="bold"
-                    app:drawableTopCompat="@mipmap/icon_humidity_room"
-                    app:layout_constraintEnd_toStartOf="@id/tv_pm_2_5"
-                    app:layout_constraintStart_toEndOf="@id/tv_home_temp2"
-                    app:layout_constraintTop_toTopOf="@id/tv_home_temp2"
-                    tools:text="55%" />
-
-                <TextView
-                    android:id="@+id/tv_pm_2_5"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@{String.format(`%d`,roomData.pm25)}"
-                    android:textAlignment="center"
-                    android:textColor="@color/main_text_color"
-                    android:textSize="16sp"
-                    android:textStyle="bold"
-                    app:drawableTopCompat="@mipmap/icon_pm2_5_room"
-                    app:layout_constraintEnd_toStartOf="@id/tv_co2"
-                    app:layout_constraintStart_toEndOf="@id/tv_home_humidity2"
-                    app:layout_constraintTop_toTopOf="@id/tv_home_humidity2"
-                    tools:text="400" />
-
-                <TextView
-                    android:id="@+id/tv_co2"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@{String.format(`%d`,roomData.co2)}"
-                    android:textAlignment="center"
-                    android:textColor="@color/main_text_color"
-                    android:textSize="16sp"
-                    android:textStyle="bold"
-                    app:drawableTopCompat="@mipmap/icon_co2_room"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toEndOf="@id/tv_pm_2_5"
-                    app:layout_constraintTop_toTopOf="@id/tv_pm_2_5"
-                    tools:text="400" />
-            </androidx.constraintlayout.widget.ConstraintLayout>
-
+            android:layout_height="match_parent"
+            android:background="@color/c_FBFBFB"
+            android:id="@+id/fra_room_ctrl_sl"
+            >
 
             <LinearLayout
-                android:id="@+id/ll_fan_speed"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginStart="25dp"
-                android:layout_marginTop="20dp"
-                android:layout_marginEnd="25dp"
-                android:background="@drawable/bg_device_ctrl_btn"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintHorizontal_chainStyle="spread_inside"
-                app:layout_constraintTop_toBottomOf="@id/cl_air_info">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    android:layout_width="30dp"
-                    android:layout_height="30dp"
-                    android:layout_marginStart="10dp"
-                    android:layout_marginTop="25dp"
-                    android:layout_marginBottom="25dp"
-                    app:srcCompat="@mipmap/icon_fan" />
-
-                <com.jaygoo.widget.RangeSeekBar
-                    android:id="@+id/range_seek_bar"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:layout_marginStart="3dp"
-                    android:layout_marginEnd="6dp"
-                    app:rsb_gravity="center"
-                    app:rsb_max="4"
-                    app:rsb_min="0"
-                    app:rsb_mode="single"
-                    app:rsb_progress_color="@color/device_ctrl_seek_bar_progress_color"
-                    app:rsb_progress_default_color="@color/device_ctrl_seek_bar_progress_default_color"
-                    app:rsb_progress_height="12dp"
-                    app:rsb_progress_radius="10dp"
-                    app:rsb_step_auto_bonding="true"
-                    app:rsb_step_color="@color/white"
-                    app:rsb_step_height="8dp"
-                    app:rsb_step_radius="4dp"
-                    app:rsb_step_width="1dp"
-                    app:rsb_steps="4"
-                    app:rsb_thumb_height="18dp"
-                    app:rsb_thumb_scale_ratio="1.2"
-                    app:rsb_thumb_width="18dp"
-                    app:rsb_tick_mark_gravity="center"
-                    app:rsb_tick_mark_mode="other"
-                    app:rsb_tick_mark_number="6" />
+                android:orientation="vertical"
+                tools:context=".ui.ctrl.RoomCtrlFragment">
 
 
-            </LinearLayout>
-
+                <!--模式按钮-->
 
-        </androidx.constraintlayout.widget.ConstraintLayout>
 
-        <!--新风、开关、定时-->
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="26dp"
-            android:layout_marginEnd="26dp"
-            android:layout_marginBottom="30dp"
-            android:orientation="horizontal">
+                <HorizontalScrollView
+                    android:id="@+id/hsv"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:scrollbars="none"
+                    android:layout_marginTop="10dp"
+                    tools:ignore="SpeakableTextPresentCheck">
+
+                    <!--<androidx.constraintlayout.widget.ConstraintLayout-->
+                    <!--    android:layout_width="match_parent"-->
+                    <!--    android:layout_height="wrap_content"-->
+                    <!--    android:layout_marginStart="25dp"-->
+                    <!--    android:layout_marginEnd="25dp"-->
+                    <!--    tools:context="ui.ctrl.RoomCtrlFragment">-->
+                    <LinearLayout
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:orientation="horizontal">
+
+
+                        <LinearLayout
+                            android:id="@+id/ll_zhi_leng"
+                            android:layout_width="70dp"
+                            android:layout_height="70dp"
+                            android:layout_marginStart="20dp"
+                            android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.ZHI_LENG.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                            android:gravity="center"
+                            app:layout_constraintDimensionRatio="h,1:1"
+                            app:layout_constraintEnd_toStartOf="@id/ll_zhi_re"
+                            app:layout_constraintHorizontal_chainStyle="spread_inside"
+                            app:layout_constraintStart_toStartOf="parent"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:layout_constraintWidth_percent="0.18">
+
+                            <androidx.appcompat.widget.AppCompatImageView
+                                srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.ZHI_LENG.typeCode? `icon_refrigeration_sel` :`icon_refrigeration`}"
+                                android:layout_width="70dp"
+                                android:layout_height="70dp"
+                                tools:srcCompat="@mipmap/icon_refrigeration" />
+
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:id="@+id/ll_zhi_re"
+                            android:layout_width="70dp"
+                            android:layout_height="70dp"
+                            android:layout_marginStart="20dp"
+                            android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.ZHI_RE.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                            android:gravity="center"
+                            app:layout_constraintDimensionRatio="h,1:1"
+                            app:layout_constraintEnd_toStartOf="@id/ll_chu_shi"
+                            app:layout_constraintStart_toEndOf="@id/ll_zhi_leng"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:layout_constraintWidth_percent="0.18"
+                            tools:background="@drawable/bg_device_ctrl_btn_sel">
+
+                            <androidx.appcompat.widget.AppCompatImageView
+                                srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.ZHI_RE.typeCode? `icon_heating_sel` :`icon_heating`}"
+                                android:layout_width="70dp"
+                                android:layout_height="70dp"
+                                tools:srcCompat="@mipmap/icon_heating_sel" />
+
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:id="@+id/ll_chu_shi"
+                            android:layout_width="70dp"
+                            android:layout_height="70dp"
+                            android:layout_marginStart="20dp"
+                            android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.CHU_SHI.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                            android:gravity="center"
+                            app:layout_constraintDimensionRatio="h,1:1"
+                            app:layout_constraintEnd_toStartOf="@id/ll_song_feng"
+                            app:layout_constraintStart_toEndOf="@id/ll_zhi_re"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:layout_constraintWidth_percent="0.18">
+
+                            <androidx.appcompat.widget.AppCompatImageView
+                                srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.CHU_SHI.typeCode? `icon_dehumidification_sel` :`icon_dehumidification`}"
+                                android:layout_width="70dp"
+                                android:layout_height="70dp"
+                                tools:srcCompat="@mipmap/icon_dehumidification" />
+
+                        </LinearLayout>
+
+                        <LinearLayout
+                            android:id="@+id/ll_song_feng"
+                            android:layout_width="70dp"
+                            android:layout_height="70dp"
+                            android:layout_marginStart="20dp"
+                            android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.SONG_FENG.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                            android:gravity="center"
+                            app:layout_constraintDimensionRatio="h,1:1"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@id/ll_chu_shi"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:layout_constraintWidth_percent="0.18">
+
+                            <androidx.appcompat.widget.AppCompatImageView
+                                srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.SONG_FENG.typeCode? `icon_wind_sel` :`icon_wind`}"
+                                android:layout_width="70dp"
+                                android:layout_height="70dp"
+                                tools:srcCompat="@mipmap/icon_wind" />
+
+                        </LinearLayout>
+
+
+                        <LinearLayout
+                            android:id="@+id/ll_jia_shi"
+                            android:layout_width="70dp"
+                            android:layout_height="70dp"
+                            android:layout_marginStart="20dp"
+                            android:layout_marginEnd="20dp"
+                            android:background="@{roomData.power &amp;&amp; roomData.mode == ModeType.JIA_SHI.typeCode? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                            android:gravity="center"
+                            app:layout_constraintDimensionRatio="h,1:1"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@id/ll_chu_shi"
+                            app:layout_constraintTop_toTopOf="parent"
+                            app:layout_constraintWidth_percent="0.18">
+
+                            <androidx.appcompat.widget.AppCompatImageView
+                                srcString="@{roomData.power &amp;&amp; roomData.mode == ModeType.JIA_SHI.typeCode? `icon_humidify_sel` :`icon_humidify`}"
+                                android:layout_width="70dp"
+                                android:layout_height="70dp"
+                                tools:srcCompat="@mipmap/icon_humidify" />
+
+                        </LinearLayout>
+
+
+                    </LinearLayout>
+
+
+                </HorizontalScrollView>
+
+
+                <!--控制-->
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1">
+
+                    <com.king.view.arcseekbar.ArcSeekBar
+                        android:id="@+id/arc_seek_bar"
+                        android:layout_width="0dp"
+                        android:layout_height="0dp"
+                        android:layout_marginTop="40dp"
+                        android:padding="10dp"
+                        app:arcMax="14"
+                        app:arcNormalColor="@color/device_ctrl_panel_bg_color"
+                        app:arcProgressColor="@color/device_ctrl_panel_progress_color"
+                        app:arcShowLabel="false"
+                        app:arcStartAngle="130"
+                        app:arcStrokeWidth="20dp"
+                        app:arcSweepAngle="280"
+                        app:arcThumbColor="@color/white"
+                        app:arcThumbInnerDotWidth="16dp"
+                        app:arcThumbShadowColor="#20000000"
+                        app:arcThumbShadowRadius="5dp"
+                        app:arcThumbWidth="20dp"
+                        app:layout_constraintDimensionRatio="h,1:1"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        app:layout_constraintWidth_percent="0.66" />
 
-            <!--新风-->
-            <LinearLayout
-                android:id="@+id/ll_xin_feng"
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_marginEnd="9dp"
-                android:layout_weight="1"
-                android:background="@{roomData.freshAir &amp;&amp; roomData.power? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
-                android:gravity="center"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                tools:background="@drawable/bg_device_ctrl_btn_sel">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    srcString="@{roomData.freshAir &amp;&amp; roomData.power ? `icon_air_sel` :`icon_air`}"
-                    android:layout_width="40dp"
-                    android:layout_height="40dp"
-                    android:layout_marginTop="22dp"
-                    android:layout_marginBottom="22dp"
-                    tools:srcCompat="@mipmap/icon_air_sel" />
-            </LinearLayout>
+                    <TextView
+                        android:id="@+id/tv_temp"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginBottom="30dp"
+                        android:includeFontPadding="false"
+                        android:text="@{String.format(`%d`,roomData.setTemp)}"
+                        android:textColor="@color/main_text_color"
+                        android:textSize="46sp"
+                        android:textStyle="bold"
+                        app:layout_constraintBottom_toBottomOf="@id/arc_seek_bar"
+                        app:layout_constraintEnd_toEndOf="@id/arc_seek_bar"
+                        app:layout_constraintStart_toStartOf="@id/arc_seek_bar"
+                        app:layout_constraintTop_toTopOf="@id/arc_seek_bar"
+                        tools:text="28" />
 
-            <LinearLayout
-                android:id="@+id/ll_switch"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_marginHorizontal="9dp"
-                android:layout_weight="1"
-                android:background="@{roomData.power? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
-                android:gravity="center"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                tools:background="@drawable/bg_device_ctrl_btn_sel">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    srcString="@{roomData.power ? `icon_on_sel` :`icon_on_sel_1`}"
-                    android:layout_width="46dp"
-                    android:layout_height="46dp"
-                    android:layout_marginTop="22dp"
-                    android:layout_marginBottom="22dp"
-                    tools:srcCompat="@mipmap/icon_on_sel" />
-            </LinearLayout>
+                    <TextView
+                        android:id="@+id/tv_mark"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="12sp"
+                        android:includeFontPadding="false"
+                        android:text="℃"
+                        android:textColor="@color/main_text_color"
+                        android:textSize="25sp"
+                        android:textStyle="bold"
+                        app:layout_constraintStart_toEndOf="@id/tv_temp"
+                        app:layout_constraintTop_toTopOf="@id/tv_temp" />
 
-            <LinearLayout
-                android:id="@+id/ll_timer"
-                android:layout_width="0dp"
-                android:layout_height="match_parent"
-                android:layout_marginStart="9dp"
-                android:layout_weight="1"
-                android:background="@{roomData.timerStatus?@drawable/bg_device_ctrl_btn_sel:@drawable/bg_device_ctrl_btn}"
-                android:gravity="center"
-                app:layout_constraintBottom_toBottomOf="@id/ll_switch"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toEndOf="@id/ll_switch"
-                app:layout_constraintTop_toTopOf="@id/ll_switch"
-                tools:background="@drawable/bg_device_ctrl_btn_sel">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    android:layout_width="46dp"
-                    android:layout_height="46dp"
-                    android:visibility="@{roomData.timerStatus?View.GONE:View.VISIBLE}"
-                    app:srcCompat="@mipmap/icon_time"
-                    tools:visibility="gone" />
+                    <androidx.appcompat.widget.AppCompatImageView
+                        android:id="@+id/iv_less"
+                        android:layout_width="38dp"
+                        android:layout_height="45dp"
+                        android:paddingStart="10dp"
+                        android:paddingEnd="10dp"
+                        app:layout_constraintBottom_toBottomOf="@id/arc_seek_bar"
+                        app:layout_constraintDimensionRatio="h,1:1"
+                        app:layout_constraintStart_toStartOf="@id/arc_seek_bar"
+                        app:layout_constraintWidth_percent="0.1"
+                        app:srcCompat="@mipmap/icon_reduce" />
 
-                <LinearLayout
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:gravity="center"
-                    android:orientation="vertical"
-                    android:visibility="@{roomData.timerStatus?View.VISIBLE:View.GONE}">
 
                     <androidx.appcompat.widget.AppCompatImageView
-                        android:layout_width="40dp"
-                        android:layout_height="40dp"
-                        app:srcCompat="@mipmap/icon_time_sel" />
+                        android:id="@+id/iv_add"
+                        android:layout_width="38dp"
+                        android:layout_height="45dp"
+                        android:paddingStart="10dp"
+                        android:paddingEnd="10dp"
+                        app:layout_constraintBottom_toBottomOf="@id/arc_seek_bar"
+                        app:layout_constraintDimensionRatio="h,1:1"
+                        app:layout_constraintEnd_toEndOf="@id/arc_seek_bar"
+                        app:layout_constraintWidth_percent="0.1"
+                        app:srcCompat="@mipmap/icon_add_1" />
 
                     <TextView
+                        android:id="@+id/tv_mode_lv"
+                        lv="@{roomData.fanSpeed}"
+                        mode="@{roomData.mode}"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        android:text="@{@string/timing_off(String.format(`%.1f`,roomData.duration).replace(`.0`,``))}"
-                        android:textColor="@color/white"
-                        android:textSize="14sp"
-                        tools:text="OFF\u0020\u00201 h" />
-
-                </LinearLayout>
+                        android:textColor="@color/main_text_color"
+                        android:textSize="13sp"
+                        android:textStyle="bold"
+                        android:visibility="@{roomData.power?View.VISIBLE:View.GONE}"
+                        app:layout_constraintEnd_toEndOf="@id/tv_temp"
+                        app:layout_constraintStart_toStartOf="@id/tv_temp"
+                        app:layout_constraintTop_toBottomOf="@id/tv_temp"
+                        tools:text="制冷&#8195;一档" />
 
-
-            </LinearLayout>
+                    <TextView
+                        android:id="@+id/tv_timer"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@{@string/timer_status(roomData.timerStatus?@string/on:@string/off)}"
+                        android:textColor="@color/main_text_color"
+                        android:textSize="13sp"
+                        android:textStyle="bold"
+                        app:layout_constraintEnd_toEndOf="@id/tv_temp"
+                        app:layout_constraintStart_toStartOf="@id/tv_temp"
+                        app:layout_constraintTop_toBottomOf="@id/tv_mode_lv"
+                        tools:text="定时:关" />
+
+                    <androidx.constraintlayout.widget.ConstraintLayout
+                        android:id="@+id/cl_air_info"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="25dp"
+                        android:layout_marginTop="60dp"
+                        android:layout_marginEnd="25dp"
+                        android:background="@drawable/bg_device_ctrl_bg"
+                        android:paddingStart="20dp"
+                        android:paddingEnd="20dp"
+                        android:paddingBottom="12dp"
+                        app:layout_constraintBottom_toTopOf="@id/ll_fan_speed"
+                        app:layout_constraintHorizontal_chainStyle="packed"
+                        app:layout_constraintTop_toBottomOf="@id/arc_seek_bar">
+
+                        <TextView
+                            android:id="@+id/tv_home_temp2"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_marginTop="12dp"
+                            android:drawablePadding="5dp"
+                            android:text="@{String.format(`%d℃`,roomData.temperature)}"
+                            android:textAlignment="center"
+                            android:textColor="@color/main_text_color"
+                            android:textSize="16sp"
+                            android:textStyle="bold"
+                            app:drawableTopCompat="@mipmap/icon_temperature_room"
+                            app:layout_constraintEnd_toStartOf="@id/tv_home_humidity2"
+                            app:layout_constraintHorizontal_chainStyle="spread_inside"
+                            app:layout_constraintStart_toStartOf="parent"
+                            app:layout_constraintTop_toTopOf="parent"
+
+                            tools:text="13℃" />
+
+                        <TextView
+                            android:id="@+id/tv_home_humidity2"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="5dp"
+                            android:text="@{String.format(`%d%%`,roomData.humidity)}"
+                            android:textAlignment="center"
+                            android:textColor="@color/main_text_color"
+                            android:textSize="16sp"
+                            android:textStyle="bold"
+                            app:drawableTopCompat="@mipmap/icon_humidity_room"
+                            app:layout_constraintEnd_toStartOf="@id/tv_pm_2_5"
+                            app:layout_constraintStart_toEndOf="@id/tv_home_temp2"
+                            app:layout_constraintTop_toTopOf="@id/tv_home_temp2"
+                            tools:text="55%" />
+
+                        <TextView
+                            android:id="@+id/tv_pm_2_5"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="5dp"
+                            android:text="@{String.format(`%d`,roomData.pm25)}"
+                            android:textAlignment="center"
+                            android:textColor="@color/main_text_color"
+                            android:textSize="16sp"
+                            android:textStyle="bold"
+                            app:drawableTopCompat="@mipmap/icon_pm2_5_room"
+                            app:layout_constraintEnd_toStartOf="@id/tv_co2"
+                            app:layout_constraintStart_toEndOf="@id/tv_home_humidity2"
+                            app:layout_constraintTop_toTopOf="@id/tv_home_humidity2"
+                            tools:text="400" />
+
+                        <TextView
+                            android:id="@+id/tv_co2"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:drawablePadding="5dp"
+                            android:text="@{String.format(`%d`,roomData.co2)}"
+                            android:textAlignment="center"
+                            android:textColor="@color/main_text_color"
+                            android:textSize="16sp"
+                            android:textStyle="bold"
+                            app:drawableTopCompat="@mipmap/icon_co2_room"
+                            app:layout_constraintEnd_toEndOf="parent"
+                            app:layout_constraintStart_toEndOf="@id/tv_pm_2_5"
+                            app:layout_constraintTop_toTopOf="@id/tv_pm_2_5"
+                            tools:text="400" />
+                    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+                    <LinearLayout
+                        android:id="@+id/ll_fan_speed"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginStart="25dp"
+                        android:layout_marginTop="20dp"
+                        android:layout_marginEnd="25dp"
+                        android:background="@drawable/bg_device_ctrl_bg"
+                        android:gravity="center_vertical"
+                        android:orientation="horizontal"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintHorizontal_chainStyle="spread_inside"
+                        app:layout_constraintTop_toBottomOf="@id/cl_air_info">
+
+                        <androidx.appcompat.widget.AppCompatImageView
+                            android:layout_width="22dp"
+                            android:layout_height="22dp"
+                            android:layout_marginStart="15dp"
+                            android:layout_marginTop="25dp"
+                            android:layout_marginBottom="25dp"
+                            app:srcCompat="@mipmap/icon_fan" />
+
+                        <ImageView
+                            android:layout_width="50dp"
+                            android:layout_height="12dp"
+                            android:layout_marginStart="6dp"
+                            android:background="@drawable/room_seekbar_left_bg"
+                            android:contentDescription="@string/room_seekbar_left_bg" />
+
+                        <com.jaygoo.widget.RangeSeekBar
+                            android:id="@+id/range_seek_bar"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginEnd="5dp"
+                            android:paddingEnd="5dp"
+                            android:paddingStart="0dp"
+                            app:rsb_gravity="center"
+                            app:rsb_max="4"
+                            app:rsb_min="0"
+                            app:rsb_mode="single"
+                            app:rsb_progress_drawable_default="@drawable/room_seekbar_default_bg"
+                            app:rsb_progress_drawable="@drawable/room_seekbar_bg"
+                            app:rsb_progress_height="12dp"
+                            android:layout_marginStart="-18dp"
+                            app:rsb_step_auto_bonding="true"
+                            app:rsb_step_color="@color/white"
+                            app:rsb_step_height="8dp"
+                            app:rsb_step_radius="4dp"
+                            app:rsb_step_width="1dp"
+                            app:rsb_steps="4"
+                            app:rsb_thumb_height="33dp"
+                            app:rsb_thumb_scale_ratio="1"
+                            app:rsb_thumb_width="33dp"
+                            app:rsb_thumb_drawable="@drawable/rsb_thumb_drawable"
+                            app:rsb_tick_mark_gravity="center"
+                            app:rsb_tick_mark_mode="other"
+                            app:rsb_tick_mark_number="6" />
+
+                    </LinearLayout>
+
+
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+                <!--新风、开关、定时-->
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="70dp"
+                    android:layout_marginStart="26dp"
+                    android:layout_marginTop="60dp"
+                    android:layout_marginEnd="26dp"
+                    android:layout_marginBottom="30dp"
+                    android:orientation="horizontal">
+
+                    <!--新风-->
+                    <LinearLayout
+                        android:id="@+id/ll_xin_feng"
+                        android:layout_width="0dp"
+                        android:layout_height="match_parent"
+                        android:layout_marginEnd="9dp"
+                        android:layout_weight="1"
+                        android:background="@{roomData.freshAir &amp;&amp; roomData.power? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                        android:gravity="center"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        tools:background="@drawable/bg_device_ctrl_btn_sel">
+
+                        <androidx.appcompat.widget.AppCompatImageView
+                            srcString="@{roomData.freshAir &amp;&amp; roomData.power ? `icon_air_sel` :`icon_air`}"
+                            android:layout_width="35dp"
+                            android:layout_height="35dp"
+                            android:layout_marginTop="18dp"
+                            android:layout_marginBottom="18dp"
+                            tools:srcCompat="@mipmap/icon_air_sel" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/ll_switch"
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_marginHorizontal="9dp"
+                        android:layout_weight="1"
+                        android:background="@{roomData.power? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                        android:gravity="center"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        tools:background="@drawable/bg_device_ctrl_btn_sel">
+
+                        <androidx.appcompat.widget.AppCompatImageView
+                            srcString="@{roomData.power ? `icon_on_sel` :`icon_on_sel_1`}"
+                            android:layout_width="35dp"
+                            android:layout_height="35dp"
+                            android:layout_marginTop="22dp"
+                            android:layout_marginBottom="22dp"
+                            tools:srcCompat="@mipmap/icon_on_sel" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/ll_shui_mian"
+                        android:layout_width="0dp"
+                        android:layout_height="match_parent"
+                        android:layout_marginEnd="9dp"
+                        android:layout_weight="1"
+                        android:visibility="@{RoomUtils.isShowSleep(roomData.code)?View.VISIBLE:View.GONE}"
+                        android:background="@{roomData.sleepMode &amp;&amp; roomData.power? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                        android:gravity="center"
+                        app:layout_constraintBottom_toBottomOf="parent"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        tools:background="@drawable/bg_device_ctrl_btn_sel">
+
+                        <androidx.appcompat.widget.AppCompatImageView
+                            srcString="@{roomData.sleepMode &amp;&amp; roomData.power ? `icon_sleep` :`icon_sleep_1`}"
+                            android:layout_width="35dp"
+                            android:layout_height="35dp"
+                            android:layout_marginTop="22dp"
+                            android:layout_marginBottom="22dp"
+                            tools:srcCompat="@mipmap/icon_sleep" />
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:id="@+id/ll_timer"
+                        android:layout_width="0dp"
+                        android:layout_height="match_parent"
+                        android:layout_marginStart="9dp"
+                        android:layout_weight="1"
+                        android:background="@{roomData.timerStatus?@drawable/bg_device_ctrl_btn_sel:@drawable/bg_device_ctrl_btn}"
+                        android:gravity="center"
+                        app:layout_constraintBottom_toBottomOf="@id/ll_switch"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toEndOf="@id/ll_switch"
+                        app:layout_constraintTop_toTopOf="@id/ll_switch"
+                        tools:background="@drawable/bg_device_ctrl_btn_sel">
+
+                        <androidx.appcompat.widget.AppCompatImageView
+                            android:layout_width="35dp"
+                            android:layout_height="35dp"
+                            android:visibility="@{roomData.timerStatus?View.GONE:View.VISIBLE}"
+                            app:srcCompat="@mipmap/icon_time"
+                            tools:visibility="gone" />
+
+                        <LinearLayout
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:gravity="center"
+                            android:orientation="vertical"
+                            android:visibility="@{roomData.timerStatus?View.VISIBLE:View.GONE}">
+
+                            <androidx.appcompat.widget.AppCompatImageView
+                                android:layout_width="25dp"
+                                android:layout_height="25dp"
+                                app:srcCompat="@mipmap/icon_time_sel" />
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_marginTop="5dp"
+                                android:text="@{@string/timing_off(String.format(`%.1f`,roomData.duration).replace(`.0`,``))}"
+                                android:textColor="@color/white"
+                                android:textSize="14sp"
+                                tools:text="OFF\u0020\u00201 h" />
+
+                        </LinearLayout>
+
+
+                    </LinearLayout>
 
 
-        </LinearLayout>
+                </LinearLayout>
 
+            </LinearLayout>
+        </com.rdiot.yx485.view.CustomScrollView>
     </LinearLayout>
 </layout>

+ 58 - 0
app/src/main/res/layout/fra_select_device_type.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <data>
+
+        <variable
+            name="vm"
+            type="com.rdiot.yx485.ui.bind.model.BindViewModel" />
+
+        <import type="android.view.View" />
+    </data>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <com.google.android.material.tabs.TabLayout
+            android:id="@+id/tab_layout"
+            android:layout_width="match_parent"
+            android:layout_height="48dp"
+            app:layout_constraintTop_toTopOf="parent"
+            app:tabBackground="@android:color/transparent"
+            app:tabIndicatorColor="@color/c_14C9C8"
+            app:tabIndicatorFullWidth="false"
+            app:tabMode="scrollable"
+            android:paddingStart="15dp"
+            android:paddingEnd="15dp"
+            app:tabTextAppearance="@style/DeviceTypeTabText"
+            app:tabRippleColor="@android:color/transparent"
+            app:tabSelectedTextColor="@color/c_14C9C8"
+            app:tabTextColor="@color/tab_text"/>
+
+        <com.rdiot.yx485.view.MyViewPager
+            android:id="@+id/viewPager"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tab_layout" />
+
+        <!--        <androidx.appcompat.widget.AppCompatButton-->
+        <!--            android:id="@+id/btn_next"-->
+        <!--            android:layout_width="match_parent"-->
+        <!--            android:layout_height="wrap_content"-->
+        <!--            android:layout_marginStart="30dp"-->
+        <!--            android:layout_marginTop="55dp"-->
+        <!--            android:layout_marginEnd="30dp"-->
+        <!--            android:layout_marginBottom="55dp"-->
+        <!--            android:background="@drawable/bg_login_btn"-->
+        <!--            android:outlineProvider="none"-->
+        <!--            android:text="@string/next_step"-->
+        <!--            android:textColor="@color/white"-->
+        <!--            android:textSize="16sp"-->
+        <!--            android:textStyle="bold"-->
+        <!--            app:layout_constraintBottom_toBottomOf="parent" />-->
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 220 - 198
app/src/main/res/layout/fra_sub_room_ctrl.xml

@@ -17,6 +17,7 @@
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
+        android:background="@color/c_FBFBFB"
         android:orientation="vertical"
         tools:context=".ui.ctrl.SubRoomCtrlFragment">
 
@@ -27,233 +28,254 @@
             app:zRightIcon="@mipmap/icon_more"
             app:zTitle="@string/room" />
 
-
-
-        <!--控制-->
-        <androidx.constraintlayout.widget.ConstraintLayout
+        <com.rdiot.yx485.view.CustomScrollView
             android:layout_width="match_parent"
-            android:layout_height="0dp"
-            android:layout_weight="1">
-
-            <com.king.view.arcseekbar.ArcSeekBar
-                android:id="@+id/arc_seek_bar"
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                android:layout_marginTop="40dp"
-                android:padding="10dp"
-                app:arcMax="14"
-                app:arcNormalColor="@color/device_ctrl_panel_bg_color"
-                app:arcProgressColor="@color/device_ctrl_panel_progress_color"
-                app:arcShowLabel="false"
-                app:arcStartAngle="140"
-                app:arcStrokeWidth="20dp"
-                app:arcSweepAngle="260"
-                app:arcThumbColor="@color/white"
-                app:arcEnabledDrag="false"
-                app:arcEnabledSingle="false"
-                app:arcThumbInnerDotWidth="10dp"
-                app:arcThumbShadowColor="#20000000"
-                app:arcThumbShadowRadius="5dp"
-                app:arcThumbWidth="18dp"
-                app:layout_constraintDimensionRatio="h,1:1"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                app:layout_constraintTop_toTopOf="parent"
-                app:layout_constraintWidth_percent="0.7" />
-
-            <TextView
-                android:id="@+id/tv_temp"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="30dp"
-                android:includeFontPadding="false"
-                android:text="@{String.format(`%d`,roomData.setTemp)}"
-                android:textColor="@color/main_text_color"
-                android:textSize="72sp"
-                android:textStyle="bold"
-                app:layout_constraintBottom_toBottomOf="@id/arc_seek_bar"
-                app:layout_constraintEnd_toEndOf="@id/arc_seek_bar"
-                app:layout_constraintStart_toStartOf="@id/arc_seek_bar"
-                app:layout_constraintTop_toTopOf="@id/arc_seek_bar"
-                tools:text="28" />
-
-            <TextView
-                android:id="@+id/tv_mark"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="12sp"
-                android:includeFontPadding="false"
-                android:text="℃"
-                android:textColor="@color/main_text_color"
-                android:textSize="25sp"
-                android:textStyle="bold"
-                app:layout_constraintStart_toEndOf="@id/tv_temp"
-                app:layout_constraintTop_toTopOf="@id/tv_temp" />
-
-
-
-
-            <TextView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:textColor="@color/main_text_color"
-                android:textSize="16sp"
-                android:textStyle="bold"
-                android:text="@string/master_settings"
-                app:layout_constraintEnd_toEndOf="@id/tv_temp"
-                app:layout_constraintStart_toStartOf="@id/tv_temp"
-                app:layout_constraintTop_toBottomOf="@id/tv_temp"
-                tools:text="主控设定" />
-
+            android:layout_height="match_parent">
 
+            <!--控制-->
             <androidx.constraintlayout.widget.ConstraintLayout
-                android:id="@+id/cl_air_info"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                app:layout_constraintBottom_toTopOf="@id/ll_fan_speed"
-                app:layout_constraintTop_toBottomOf="@id/arc_seek_bar">
-
-                <TextView
-                    android:id="@+id/tv_home_temp2"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginTop="12dp"
-                    android:text="@{String.format(`%d℃`,roomData.temperature)}"
-                    android:textAlignment="center"
-                    android:textColor="@color/main_text_color"
-                    android:textSize="16sp"
-                    android:textStyle="bold"
-                    app:drawableTopCompat="@mipmap/icon_temperature_room"
-                    app:layout_constraintEnd_toStartOf="@id/tv_home_humidity2"
+                android:layout_height="0dp"
+                android:layout_weight="1">
+
+                <com.king.view.arcseekbar.ArcSeekBar
+                    android:id="@+id/arc_seek_bar"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:layout_marginTop="40dp"
+                    android:padding="10dp"
+                    app:arcMax="14"
+                    app:arcNormalColor="@color/device_ctrl_panel_bg_color"
+                    app:arcProgressColor="@color/device_ctrl_panel_progress_color"
+                    app:arcShowLabel="false"
+                    app:arcStartAngle="130"
+                    app:arcStrokeWidth="20dp"
+                    app:arcSweepAngle="280"
+                    app:arcThumbColor="@color/white"
+                    app:arcThumbInnerDotWidth="16dp"
+                    app:arcThumbShadowColor="#20000000"
+                    app:arcThumbShadowRadius="5dp"
+                    app:arcThumbWidth="20dp"
+                    app:layout_constraintDimensionRatio="h,1:1"
+                    app:layout_constraintEnd_toEndOf="parent"
                     app:layout_constraintStart_toStartOf="parent"
                     app:layout_constraintTop_toTopOf="parent"
-                    tools:text="13℃" />
+                    app:layout_constraintWidth_percent="0.66" />
 
                 <TextView
-                    android:id="@+id/tv_home_humidity2"
+                    android:id="@+id/tv_temp"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@{String.format(`%d%%`,roomData.humidity)}"
-                    android:textAlignment="center"
+                    android:layout_marginBottom="30dp"
+                    android:includeFontPadding="false"
+                    android:text="@{String.format(`%d`,roomData.setTemp)}"
                     android:textColor="@color/main_text_color"
-                    android:textSize="16sp"
+                    android:textSize="46sp"
                     android:textStyle="bold"
-                    app:drawableTopCompat="@mipmap/icon_humidity_room"
-                    app:layout_constraintEnd_toStartOf="@id/tv_pm_2_5"
-                    app:layout_constraintStart_toEndOf="@id/tv_home_temp2"
-                    app:layout_constraintTop_toTopOf="@id/tv_home_temp2"
-                    tools:text="55%" />
+                    app:layout_constraintBottom_toBottomOf="@id/arc_seek_bar"
+                    app:layout_constraintEnd_toEndOf="@id/arc_seek_bar"
+                    app:layout_constraintStart_toStartOf="@id/arc_seek_bar"
+                    app:layout_constraintTop_toTopOf="@id/arc_seek_bar"
+                    tools:text="28" />
 
                 <TextView
-                    android:id="@+id/tv_pm_2_5"
+                    android:id="@+id/tv_mark"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@{String.format(`%d`,roomData.pm25)}"
-                    android:textAlignment="center"
+                    android:layout_marginTop="12sp"
+                    android:includeFontPadding="false"
+                    android:text="℃"
                     android:textColor="@color/main_text_color"
-                    android:textSize="16sp"
+                    android:textSize="25sp"
                     android:textStyle="bold"
-                    android:visibility="gone"
-                    app:drawableTopCompat="@mipmap/icon_pm2_5_room"
-                    app:layout_constraintEnd_toStartOf="@id/tv_co2"
-                    app:layout_constraintStart_toEndOf="@id/tv_home_humidity2"
-                    app:layout_constraintTop_toTopOf="@id/tv_home_humidity2"
-                    tools:text="400" />
+                    app:layout_constraintStart_toEndOf="@id/tv_temp"
+                    app:layout_constraintTop_toTopOf="@id/tv_temp" />
+
 
                 <TextView
-                    android:id="@+id/tv_co2"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:text="@{String.format(`%d`,roomData.co2)}"
-                    android:textAlignment="center"
+                    android:text="@string/master_settings"
                     android:textColor="@color/main_text_color"
                     android:textSize="16sp"
                     android:textStyle="bold"
-                    android:visibility="gone"
-                    app:drawableTopCompat="@mipmap/icon_co2_room"
-                    app:layout_constraintEnd_toEndOf="parent"
-                    app:layout_constraintStart_toEndOf="@id/tv_pm_2_5"
-                    app:layout_constraintTop_toTopOf="@id/tv_pm_2_5"
-                    tools:text="400" />
-            </androidx.constraintlayout.widget.ConstraintLayout>
+                    app:layout_constraintEnd_toEndOf="@id/tv_temp"
+                    app:layout_constraintStart_toStartOf="@id/tv_temp"
+                    app:layout_constraintTop_toBottomOf="@id/tv_temp"
+                    tools:text="主控设定" />
 
 
-            <LinearLayout
-                android:id="@+id/ll_fan_speed"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="25dp"
-                android:layout_marginTop="20dp"
-                android:layout_marginEnd="25dp"
-                android:background="@drawable/bg_device_ctrl_btn"
-                android:gravity="center_vertical"
-                android:orientation="horizontal"
-                app:layout_constraintBottom_toTopOf="@id/ll_switch"
-                app:layout_constraintHorizontal_chainStyle="spread_inside"
-                app:layout_constraintTop_toBottomOf="@id/cl_air_info">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    android:layout_width="30dp"
-                    android:layout_height="30dp"
-                    android:layout_marginStart="10dp"
-                    android:layout_marginTop="25dp"
-                    android:layout_marginBottom="25dp"
-                    app:srcCompat="@mipmap/icon_fan" />
-
-                <com.jaygoo.widget.RangeSeekBar
-                    android:id="@+id/range_seek_bar"
+                <androidx.constraintlayout.widget.ConstraintLayout
+                    android:id="@+id/cl_air_info"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="25dp"
+                    android:layout_marginTop="30dp"
+                    android:layout_marginEnd="25dp"
+                    android:background="@drawable/bg_device_ctrl_bg"
+                    android:paddingStart="20dp"
+                    android:paddingEnd="20dp"
+                    android:paddingBottom="12dp"
+                    app:layout_constraintBottom_toTopOf="@id/ll_fan_speed"
+                    app:layout_constraintHorizontal_chainStyle="packed"
+                    app:layout_constraintTop_toBottomOf="@id/arc_seek_bar">
+
+                    <TextView
+                        android:id="@+id/tv_home_temp2"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="12dp"
+                        android:drawablePadding="5dp"
+                        android:text="@{String.format(`%d℃`,roomData.temperature)}"
+                        android:textAlignment="center"
+                        android:textColor="@color/main_text_color"
+                        android:textSize="16sp"
+                        android:textStyle="bold"
+                        app:drawableTopCompat="@mipmap/icon_temperature_room"
+                        app:layout_constraintEnd_toStartOf="@id/tv_home_humidity2"
+                        app:layout_constraintHorizontal_chainStyle="spread"
+                        app:layout_constraintStart_toStartOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+
+                        tools:text="13℃" />
+
+                    <TextView
+                        android:id="@+id/tv_home_humidity2"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:drawablePadding="5dp"
+                        android:text="@{String.format(`%d%%`,roomData.humidity)}"
+                        android:textAlignment="center"
+                        android:textColor="@color/main_text_color"
+                        android:textSize="16sp"
+                        android:textStyle="bold"
+                        app:drawableTopCompat="@mipmap/icon_humidity_room"
+                        app:layout_constraintEnd_toStartOf="@id/tv_pm_2_5"
+                        app:layout_constraintStart_toEndOf="@id/tv_home_temp2"
+                        app:layout_constraintTop_toTopOf="@id/tv_home_temp2"
+                        tools:text="55%" />
+
+                    <TextView
+                        android:id="@+id/tv_pm_2_5"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:drawablePadding="5dp"
+                        android:text="@{String.format(`%d`,roomData.pm25)}"
+                        android:textAlignment="center"
+                        android:textColor="@color/main_text_color"
+                        android:textSize="16sp"
+                        android:textStyle="bold"
+                        android:visibility="gone"
+                        app:drawableTopCompat="@mipmap/icon_pm2_5_room"
+                        app:layout_constraintEnd_toStartOf="@id/tv_co2"
+                        app:layout_constraintStart_toEndOf="@id/tv_home_humidity2"
+                        app:layout_constraintTop_toTopOf="@id/tv_home_humidity2"
+                        tools:text="400" />
+
+                    <TextView
+                        android:id="@+id/tv_co2"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:drawablePadding="5dp"
+                        android:text="@{String.format(`%d`,roomData.co2)}"
+                        android:textAlignment="center"
+                        android:textColor="@color/main_text_color"
+                        android:textSize="16sp"
+                        android:textStyle="bold"
+                        android:visibility="gone"
+                        app:drawableTopCompat="@mipmap/icon_co2_room"
+                        app:layout_constraintEnd_toEndOf="parent"
+                        app:layout_constraintStart_toEndOf="@id/tv_pm_2_5"
+                        app:layout_constraintTop_toTopOf="@id/tv_pm_2_5"
+                        tools:text="400" />
+                </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+                <LinearLayout
+                    android:id="@+id/ll_fan_speed"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginStart="3dp"
-                    android:layout_marginEnd="6dp"
-                    app:rsb_gravity="center"
-                    app:rsb_max="4"
-                    app:rsb_min="0"
-                    app:rsb_mode="single"
-                    app:rsb_progress_color="@color/device_ctrl_seek_bar_progress_color"
-                    app:rsb_progress_default_color="@color/device_ctrl_seek_bar_progress_default_color"
-                    app:rsb_progress_height="12dp"
-                    app:rsb_progress_radius="10dp"
-                    app:rsb_step_auto_bonding="true"
-                    app:rsb_step_color="@color/white"
-                    app:rsb_step_height="8dp"
-                    app:rsb_step_radius="4dp"
-                    app:rsb_step_width="1dp"
-                    app:rsb_steps="4"
-                    app:rsb_thumb_height="18dp"
-                    app:rsb_thumb_scale_ratio="1.2"
-                    app:rsb_thumb_width="18dp"
-                    app:rsb_tick_mark_gravity="center"
-                    app:rsb_tick_mark_mode="other"
-                    app:rsb_tick_mark_number="5" />
-
-
-            </LinearLayout>
-
-            <LinearLayout
-                android:id="@+id/ll_switch"
-                android:layout_width="0dp"
-                app:layout_constraintDimensionRatio="w,2.5:1"
-                android:layout_height="wrap_content"
-                android:layout_marginHorizontal="9dp"
-                android:layout_marginBottom="30dp"
-                android:background="@{roomData.power? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
-                android:gravity="center"
-                app:layout_constraintBottom_toBottomOf="parent"
-                app:layout_constraintEnd_toEndOf="parent"
-                app:layout_constraintStart_toStartOf="parent"
-                tools:background="@drawable/bg_device_ctrl_btn_sel">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    srcString="@{roomData.power ? `icon_on_sel` :`icon_on_sel_1`}"
-                    android:layout_width="46dp"
-                    android:layout_height="46dp"
-                    android:layout_marginTop="22dp"
-                    android:layout_marginBottom="22dp"
-                    tools:srcCompat="@mipmap/icon_on_sel" />
-            </LinearLayout>
-
-        </androidx.constraintlayout.widget.ConstraintLayout>
+                    android:layout_marginStart="25dp"
+                    android:layout_marginTop="20dp"
+                    android:layout_marginEnd="25dp"
+                    android:background="@drawable/bg_device_ctrl_bg"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    app:layout_constraintHorizontal_chainStyle="spread_inside"
+                    app:layout_constraintTop_toBottomOf="@id/cl_air_info">
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        android:layout_width="22dp"
+                        android:layout_height="22dp"
+                        android:layout_marginStart="15dp"
+                        android:layout_marginTop="25dp"
+                        android:layout_marginBottom="25dp"
+                        app:srcCompat="@mipmap/icon_fan" />
+
+                    <ImageView
+                        android:layout_width="50dp"
+                        android:layout_height="12dp"
+                        android:layout_marginStart="6dp"
+                        android:background="@drawable/room_seekbar_left_bg"
+                        android:contentDescription="@string/room_seekbar_left_bg" />
+
+                    <com.jaygoo.widget.RangeSeekBar
+                        android:id="@+id/range_seek_bar"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:layout_marginEnd="5dp"
+                        android:paddingEnd="5dp"
+                        android:paddingStart="0dp"
+                        app:rsb_gravity="center"
+                        app:rsb_max="4"
+                        app:rsb_min="0"
+                        app:rsb_mode="single"
+                        app:rsb_progress_drawable_default="@drawable/room_seekbar_default_bg"
+                        app:rsb_progress_drawable="@drawable/room_seekbar_bg"
+                        app:rsb_progress_height="12dp"
+                        android:layout_marginStart="-18dp"
+                        app:rsb_step_auto_bonding="true"
+                        app:rsb_step_color="@color/white"
+                        app:rsb_step_height="8dp"
+                        app:rsb_step_radius="4dp"
+                        app:rsb_step_width="1dp"
+                        app:rsb_steps="4"
+                        app:rsb_thumb_height="33dp"
+                        app:rsb_thumb_scale_ratio="1"
+                        app:rsb_thumb_width="33dp"
+                        app:rsb_thumb_drawable="@drawable/rsb_thumb_drawable"
+                        app:rsb_tick_mark_gravity="center"
+                        app:rsb_tick_mark_mode="other"
+                        app:rsb_tick_mark_number="6" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/ll_switch"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginHorizontal="9dp"
+                    android:layout_marginTop="20dp"
+                    android:background="@{roomData.power? @drawable/bg_device_ctrl_btn_sel :@drawable/bg_device_ctrl_btn}"
+                    android:gravity="center"
+                    app:layout_constraintTop_toBottomOf="@id/ll_fan_speed"
+                    app:layout_constraintDimensionRatio="w,2.5:1"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    tools:background="@drawable/bg_device_ctrl_btn_sel">
+
+                    <androidx.appcompat.widget.AppCompatImageView
+                        srcString="@{roomData.power ? `icon_on_sel` :`icon_on_sel_1`}"
+                        android:layout_width="46dp"
+                        android:layout_height="46dp"
+                        android:layout_marginTop="22dp"
+                        android:layout_marginBottom="22dp"
+                        tools:srcCompat="@mipmap/icon_on_sel" />
+                </LinearLayout>
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
+
+        </com.rdiot.yx485.view.CustomScrollView>
 
 
     </LinearLayout>

+ 1 - 1
app/src/main/res/layout/item_bottom_tab.xml

@@ -27,7 +27,7 @@
             android:id="@+id/tv_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:textSize="11sp"
+            android:textSize="12sp"
             app:layout_constraintEnd_toEndOf="@id/tab_image"
             app:layout_constraintStart_toStartOf="@id/tab_image"
             app:layout_constraintTop_toBottomOf="@id/tab_image"

+ 96 - 0
app/src/main/res/layout/item_device_type.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <data>
+
+        <variable
+            name="editMode"
+            type="boolean" />
+
+        <variable
+            name="vm"
+            type="com.rdiot.yx485.bean.DeviceTypeData" />
+
+        <import type="android.view.View" />
+
+        <variable
+            name="context"
+            type="android.content.Context" />
+
+        <import type="com.rdiot.yx485.util.RoomUtils" />
+
+    </data>
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/item_device_type"
+        android:layout_width="match_parent"
+        android:layout_height="110dp"
+        android:background="@{RoomUtils.getBgColor(vm.code, context)}"
+        tools:background="@drawable/bg_room_device">
+
+
+        <ImageView
+            android:id="@+id/item_device_type_icon"
+            android:layout_width="45dp"
+            android:layout_height="45dp"
+            android:layout_marginStart="20dp"
+            android:contentDescription="@string/item_room_icon"
+            app:imageUrl="@{vm.icon}"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <ImageView
+            android:layout_width="30dp"
+            android:layout_height="30dp"
+            android:elevation="-1dp"
+            android:background="@{RoomUtils.getIconColor(vm.code, context)}"
+            app:layout_constraintTop_toBottomOf="@id/item_device_type_icon"
+            app:layout_constraintStart_toEndOf="@id/item_device_type_icon"
+            android:layout_marginTop="-20dp"
+            android:layout_marginStart="-20dp"
+            android:contentDescription="@string/item_room_icon_s" />
+
+        <!--名称-->
+        <TextView
+            android:id="@+id/tv_device_type_name"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="40dp"
+            android:layout_marginEnd="15dp"
+            android:ellipsize="end"
+            android:maxLines="1"
+            android:text="@{vm.name}"
+            android:textColor="@{RoomUtils.getTextColor(vm.code, context)}"
+            android:textSize="18sp"
+            android:textStyle="bold"
+            app:layout_constraintBottom_toTopOf="@id/desc"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/item_device_type_icon"
+            app:layout_constraintTop_toTopOf="@id/item_device_type_icon"
+            tools:text="客厅"
+            tools:textColor="@color/tab_text" />
+
+        <TextView
+            android:id="@+id/desc"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="40dp"
+            android:layout_marginTop="5dp"
+            android:layout_marginEnd="15dp"
+            android:text="@{RoomUtils.getDesc(vm.code)}"
+            android:textColor="@{RoomUtils.getTextColor(vm.code, context)}"
+            android:textSize="13sp"
+            app:layout_constraintBottom_toBottomOf="@id/item_device_type_icon"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@id/item_device_type_icon"
+            app:layout_constraintTop_toBottomOf="@id/tv_device_type_name"
+            tools:text="主控制器"
+            tools:textColor="@color/c_999999" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</layout>

+ 12 - 0
app/src/main/res/layout/item_device_type_vp.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/item_device_type_vp_rv"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    </androidx.recyclerview.widget.RecyclerView>
+
+
+</layout>

+ 89 - 169
app/src/main/res/layout/item_room.xml

@@ -15,212 +15,132 @@
 
         <import type="android.view.View" />
 
+        <import type="com.rdiot.yx485.util.RoomUtils"/>
+
     </data>
 
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/cl_item"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@{vm.power ?@drawable/bg_room_device_on:@drawable/bg_room_device_off}"
-        app:layout_constraintDimensionRatio="H,1:1"
-        tools:background="@drawable/bg_room_device_on">
+        android:layout_height="80dp"
+        android:background="@drawable/bg_room_device"
+        tools:background="@drawable/bg_room_device">
+        <ImageView
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:id="@+id/item_room_icon"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toBottomOf="parent"
+            android:layout_marginStart="20dp"
+            app:layout_constraintStart_toStartOf="parent"
+            app:imageUrl="@{vm.icon}"
+            android:contentDescription="@string/item_room_icon" />
 
         <!--名称-->
         <TextView
             android:id="@+id/tv_room_name"
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:layout_marginStart="26dp"
-            android:layout_marginTop="26dp"
+            android:layout_marginStart="12dp"
+            android:layout_marginTop="18dp"
             android:layout_marginEnd="5dp"
             android:ellipsize="end"
             android:maxLines="1"
             android:text="@{vm.name}"
-            android:textColor="@{vm.power ? @color/white:@color/main_text_color}"
-            android:textSize="18sp"
+            android:textColor="@color/tab_text"
+            android:textSize="16sp"
             android:textStyle="bold"
-            app:layout_constraintEnd_toStartOf="@+id/iv_switch"
-            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/iv_switch"
+            app:layout_constraintStart_toEndOf="@id/item_room_icon"
             app:layout_constraintTop_toTopOf="parent"
             tools:text="客厅"
-            tools:textColor="@color/white" />
+            tools:textColor="@color/tab_text" />
+
+
+        <!--温度-->
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:layout_marginTop="2dp"
+            android:layout_marginStart="12dp"
+            android:layout_marginEnd="5dp"
+            app:layout_constraintTop_toBottomOf="@id/tv_room_name"
+            app:layout_constraintStart_toEndOf="@id/item_room_icon"
+            android:gravity="center_horizontal"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@{vm.name}"
+                android:textColor="@color/c_999999"
+                android:textSize="12sp"
+                tools:text="主控制器"
+                tools:textColor="@color/c_999999" />
+
+            <TextView
+                android:layout_width="1dp"
+                android:layout_height="10dp"
+                android:layout_marginTop="5dp"
+                android:background="@color/c_999999"
+                android:layout_marginStart="8dp"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@{@string/humidity_temperature(vm.humidity, vm.temperature)}"
+                tools:text="湿度:55%"
+                android:textSize="12sp"
+                app:drawableStartCompat="@drawable/bg_item_room_humidity_temperature"
+                android:visibility="@{vm.isOnline?View.VISIBLE:View.GONE}"
+                tools:textColor="@color/c_14C9C8"
+                android:textColor="@color/c_14C9C8"
+                android:layout_marginStart="8dp"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/disconnect"
+                android:textColor="@color/c_FAAD14"
+                tools:text="已离线"
+                android:textSize="12sp"
+                android:visibility="@{vm.isOnline?View.GONE:View.VISIBLE}"
+                tools:textColor="@color/c_FAAD14"
+                android:layout_marginStart="8dp"
+                app:drawableStartCompat="@drawable/bg_item_room_disconnect" />
+
+        </LinearLayout>
 
         <!--开关-->
         <androidx.appcompat.widget.AppCompatImageView
             android:id="@+id/iv_switch"
             srcString="@{vm.power?`icon_on`:`icon_off`}"
-            android:layout_width="50dp"
-            android:layout_height="50dp"
-            android:layout_marginEnd="12dp"
+            android:layout_width="48dp"
+            android:layout_height="24dp"
+            android:layout_marginEnd="16dp"
             android:visibility="@{vm.editMode?View.GONE:View.VISIBLE}"
-            app:layout_constraintBottom_toBottomOf="@id/tv_room_name"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="@id/tv_room_name"
+            app:layout_constraintTop_toTopOf="parent"
             tools:srcCompat="@mipmap/icon_on" />
 
 
         <!--删除-->
         <androidx.appcompat.widget.AppCompatImageView
             android:id="@+id/iv_del"
-            android:layout_width="50dp"
-            android:layout_height="50dp"
-            android:layout_marginEnd="12dp"
+            android:layout_width="44dp"
+            android:layout_height="44dp"
+            android:layout_marginEnd="16dp"
+            android:padding="10dp"
             android:visibility="@{vm.editMode?View.VISIBLE:View.GONE}"
-            app:layout_constraintBottom_toBottomOf="@id/tv_room_name"
+            app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintTop_toTopOf="@id/tv_room_name"
+            app:layout_constraintTop_toTopOf="parent"
             app:srcCompat="@mipmap/icon_delete"
             tools:visibility="gone" />
 
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/gl1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            app:layout_constraintGuide_percent="0.1" />
-
-
-        <androidx.constraintlayout.widget.Guideline
-            android:id="@+id/gl2"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="vertical"
-            app:layout_constraintGuide_percent="0.55" />
-
-        <LinearLayout
-            android:id="@+id/ll_1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="28dp"
-            android:layout_marginBottom="34dp"
-            android:orientation="vertical"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="@+id/gl1"
-            app:layout_constraintTop_toBottomOf="@+id/tv_room_name">
-
-            <!--温度-->
-            <LinearLayout
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:gravity="center_horizontal"
-                android:orientation="horizontal">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    srcString="@{vm.power?`icon_temperature_on`:`icon_temperature_off`}"
-                    android:layout_width="22dp"
-                    android:layout_height="22dp"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/tv_room_name"
-                    app:srcCompat="@mipmap/icon_temperature_w" />
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginStart="3dp"
-                    android:text="@{@string/temp_title(vm.temperature)}"
-                    android:textColor="@{vm.power? @color/white:@color/main_text_color}"
-                    android:textSize="16sp"
-                    tools:text="25℃"
-                    tools:textColor="@color/white" />
-            </LinearLayout>
-
-
-            <!--湿度-->
-            <LinearLayout
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:layout_weight="1"
-                android:gravity="center_vertical"
-                android:orientation="horizontal">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    srcString="@{vm.power?`icon_humidity_on`:`icon_humidity_off`}"
-                    android:layout_width="22dp"
-                    android:layout_height="22dp"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/tv_room_name"
-                    app:srcCompat="@mipmap/icon_humidity_on" />
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginStart="3dp"
-                    android:text="@{@string/humidity_title(vm.humidity)}"
-                    android:textColor="@{vm.power? @color/white:@color/main_text_color}"
-                    android:textSize="16sp"
-                    tools:text="49%"
-                    tools:textColor="@color/white" />
-            </LinearLayout>
-
-        </LinearLayout>
-
-        <LinearLayout
-            android:layout_width="wrap_content"
-            android:layout_height="0dp"
-            android:orientation="vertical"
-            app:layout_constraintBottom_toBottomOf="@+id/ll_1"
-            app:layout_constraintStart_toStartOf="@+id/gl2"
-            app:layout_constraintTop_toTopOf="@+id/ll_1">
-
-            <!--pm2.5-->
-            <LinearLayout
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:gravity="center_vertical"
-                android:orientation="horizontal">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    srcString="@{vm.power?`icon_pm25_on`:`icon_pm25_off`}"
-                    android:layout_width="22dp"
-                    android:layout_height="22dp"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/tv_room_name"
-                    app:srcCompat="@mipmap/icon_pm25_on" />
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginStart="3dp"
-                    android:text="@{String.format(`%d`,vm.pm25)}"
-                    android:textColor="@{vm.power? @color/white:@color/main_text_color}"
-                    android:textSize="16sp"
-                    tools:text="400"
-                    tools:textColor="@color/white" />
-            </LinearLayout>
-
-            <!--co2-->
-            <LinearLayout
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:gravity="center_vertical"
-                android:orientation="horizontal">
-
-                <androidx.appcompat.widget.AppCompatImageView
-                    srcString="@{vm.power?`icon_co2_on`:`icon_co2_off`}"
-                    android:layout_width="22dp"
-                    android:layout_height="22dp"
-                    app:layout_constraintStart_toStartOf="parent"
-                    app:layout_constraintTop_toBottomOf="@id/tv_room_name"
-                    app:srcCompat="@mipmap/icon_co2_on" />
-
-                <TextView
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_marginStart="3dp"
-                    android:text="@{String.format(`%d`,vm.co2)}"
-                    android:textColor="@{vm.power? @color/white:@color/main_text_color}"
-                    android:textSize="16sp"
-                    tools:text="423"
-                    tools:textColor="@color/white" />
-            </LinearLayout>
-
-        </LinearLayout>
-
-
     </androidx.constraintlayout.widget.ConstraintLayout>
 
 

+ 58 - 0
app/src/main/res/layout/room_ctrl_popup.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/c_4bacacac"
+    android:gravity="right"
+    android:orientation="vertical"
+    tools:ignore="RtlHardcoded">
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="18dp"
+        android:layout_marginTop="50dp"
+        android:src="@mipmap/sanjiao" />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@drawable/corners_5dp"
+        android:divider="@drawable/shape_divider_1px"
+        android:layout_marginEnd="5dp"
+        android:orientation="vertical"
+        android:showDividers="middle">
+
+        <TextView
+            android:id="@+id/tv_edit_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:drawablePadding="10dp"
+            android:paddingTop="10dp"
+            android:paddingBottom="10dp"
+            android:paddingLeft="20dp"
+            android:paddingRight="20dp"
+            android:text="@string/edit_name"
+            android:layout_gravity="center"
+            android:textColor="@color/tab_text"
+            android:textSize="14sp"/>
+
+        <TextView
+            android:id="@+id/tv_device_info"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:drawablePadding="10dp"
+            android:paddingLeft="20dp"
+            android:paddingTop="10dp"
+            android:paddingRight="20dp"
+            android:paddingBottom="10dp"
+            android:text="@string/device_info"
+            android:layout_gravity="center"
+            android:textColor="@color/tab_text"
+            android:textSize="14sp" />
+
+
+    </LinearLayout>
+</LinearLayout>

BIN
app/src/main/res/mipmap-xxhdpi/fluorine_master.png


BIN
app/src/main/res/mipmap-xxhdpi/fluorine_sub.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_add_1.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_air.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_air_sel.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_co2_room.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_fan.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_humidity_room.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_item_room_meeting.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_off.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_on.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_on_sel.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_on_sel_1.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_pm2_5_room.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_reduce.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_sleep.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_sleep_1.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_tab_home.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_tab_home_sel.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_tab_me.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_tab_me_sel.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_tab_room.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_tab_room_sel.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_temperature_room.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_time.png


BIN
app/src/main/res/mipmap-xxhdpi/icon_time_sel.png


BIN
app/src/main/res/mipmap-xxhdpi/range_seek_bar_thumb.png


BIN
app/src/main/res/mipmap-xxhdpi/sanjiao.png


BIN
app/src/main/res/mipmap-xxhdpi/water_intelligence.png


BIN
app/src/main/res/mipmap-xxhdpi/water_master.png


BIN
app/src/main/res/mipmap-xxhdpi/water_sub.png


+ 14 - 2
app/src/main/res/navigation/nav_bind.xml

@@ -3,8 +3,20 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/nav_bind"
-    app:startDestination="@id/resetFragment">
-
+    app:startDestination="@id/selectDeviceTypeFragment">
+    <fragment
+        android:id="@+id/selectDeviceTypeFragment"
+        android:name="com.rdiot.yx485.ui.bind.SelectDeviceTypeFragment"
+        android:label="SelectDeviceTypeFragment"
+        tools:layout="@layout/fra_select_device_type">
+        <action
+            android:id="@+id/action_selectDeviceTypeFragment_to_resetFragment"
+            app:destination="@id/resetFragment"
+            app:enterAnim="@anim/slide_in_right"
+            app:exitAnim="@anim/slide_out_left"
+            app:popEnterAnim="@anim/slide_in_left"
+            app:popExitAnim="@anim/slide_out_right" />
+    </fragment>
     <fragment
         android:id="@+id/resetFragment"
         android:name="com.rdiot.yx485.ui.bind.ResetFragment"

+ 30 - 0
app/src/main/res/values/colors.xml

@@ -33,6 +33,36 @@
     <color name="btn_blue">#007AFF</color>
     <color name="warning">#EA0000</color>
 
+    <color name="c_999999">#999999</color>
+    <color name="c_14C9C8">#14C9C8</color>
+    <color name="c_FAAD14">#FAAD14</color>
+
+    <color name="c_5198FD">#225198FD</color>
+    <color name="c_F0B756">#22F0B756</color>
+    <color name="c_21B191">#2221B191</color>
+    <color name="c_4AB0E4">#224AB0E4</color>
+    <color name="c_60A736">#2260A736</color>
+
+    <color name="c_97C2FF">#2297C2FF</color>
+    <color name="c_FAE06A">#22FAE06A</color>
+    <color name="c_8BFAE1">#228BFAE1</color>
+    <color name="c_55DCDF">#2255DCDF</color>
+    <color name="c_B1EB5C">#22B1EB5C</color>
+
+    <color name="c_31517D">#31517D</color>
+    <color name="c_A79365">#A79365</color>
+    <color name="c_558178">#558178</color>
+    <color name="c_387084">#387084</color>
+    <color name="c_517232">#517232</color>
+    <color name="c_FBFBFB">#FBFBFB</color>
+
+    <color name="c_EEF8F6">#EEF8F6</color>
+    <color name="c_14D3C0">#14D3C0</color>
+    <color name="c_fffffa">#fffff5</color>
+    <color name="c_FFD7D7D7">#FFD7D7D7</color>
+    <color name="c_4bacacac">#4bacacac</color>
+    <color name="c_15161A">#afacacac</color>
+
     <array name="arc_colors">
         <item>@color/device_ctrl_panel_progress_color</item>
         <item>@color/device_ctrl_panel_progress_color</item>

+ 25 - 0
app/src/main/res/values/strings.xml

@@ -13,7 +13,27 @@
     <string name="my_room">我的房间</string>
     <string name="no_room">您还没有添加房间</string>
     <string name="add_room">添加房间</string>
+    <string name="select_device_type">选择设备类型</string>
     <string name="add">添加</string>
+    <string name="master">主控制器</string>
+    <string name="sub">分控制器</string>
+    <string name="intelligence">智能分集水器</string>
+
+    <string name="no_net_notice">加载失败,点击刷新重试!</string>
+    <string name="no_net_refresh">立即刷新</string>
+
+    <string name="master_en">main controller</string>
+    <string name="sub_en">Sub controller</string>
+    <string name="intelligence_en">Intelligent water collector</string>
+
+    <string name="fluorine_system">氟系统</string>
+    <string name="water_system">水系统</string>
+    <string name="item_device_type_icon">item_device_type_icon</string>
+    <string name="notice">提示</string>
+    <string name="coding">该功能正在开发中,敬请期待</string>
+    <string name="setting">设置</string>
+    <string name="edit_name">编辑名称</string>
+    <string name="device_info">设备信息</string>
 
     <string name="password_login">密码登录</string>
     <string name="mobile_number_quick_login">手机号码快捷登录</string>
@@ -175,6 +195,11 @@
     <string name="master_settings">主控设定</string>
     <string name="no_info">- -℃</string>
     <string name="weather_humidity">湿度: %d%%</string>
+    <string name="item_room_icon">item_room_icon</string>
+    <string name="item_room_icon_s">item_room_icon_s</string>
+    <string name="disconnect">已离线</string>
+    <string name="humidity_temperature">湿度:%d%% 温度:%d℃</string>
+    <string name="room_seekbar_left_bg">room_seekbar_left_bg</string>
 
 
     <array name="modes">

+ 5 - 0
app/src/main/res/values/style.xml

@@ -0,0 +1,5 @@
+<resources>
+    <style name="DeviceTypeTabText">
+        <item name="android:textSize">16sp</item>
+    </style>
+</resources>

Some files were not shown because too many files changed in this diff