@rentlydev/rently-tuya 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +281 -0
  3. package/android/build.gradle +182 -0
  4. package/android/gradle.properties +7 -0
  5. package/android/libs/airbrake-android-1.4.0.jar +0 -0
  6. package/android/src/main/AndroidManifest.xml +1 -0
  7. package/android/src/main/AndroidManifestNew.xml +25 -0
  8. package/android/src/main/java/com/rentlytuya/RentlyTuyaModule.kt +503 -0
  9. package/android/src/main/java/com/rentlytuya/RentlyTuyaPackage.kt +18 -0
  10. package/android/src/main/java/com/rentlytuya/TuyaActivity.kt +45 -0
  11. package/android/src/main/java/com/rentlytuya/alerts/FormatSDCardAlert.kt +83 -0
  12. package/android/src/main/java/com/rentlytuya/alerts/PermissionAlert.kt +91 -0
  13. package/android/src/main/java/com/rentlytuya/alerts/RemoveDoorbellAlert.kt +83 -0
  14. package/android/src/main/java/com/rentlytuya/alerts/RemoveDoorbellFailureAlert.kt +71 -0
  15. package/android/src/main/java/com/rentlytuya/alerts/ResetWifiAlert.kt +83 -0
  16. package/android/src/main/java/com/rentlytuya/alerts/SuccessAlert.kt +74 -0
  17. package/android/src/main/java/com/rentlytuya/components/Alert.kt +47 -0
  18. package/android/src/main/java/com/rentlytuya/components/AnchorButton.kt +125 -0
  19. package/android/src/main/java/com/rentlytuya/components/Button.kt +147 -0
  20. package/android/src/main/java/com/rentlytuya/components/CustomDatePicker.kt +275 -0
  21. package/android/src/main/java/com/rentlytuya/components/Divider.kt +53 -0
  22. package/android/src/main/java/com/rentlytuya/components/EncryptedImageView.kt +59 -0
  23. package/android/src/main/java/com/rentlytuya/components/Label.kt +155 -0
  24. package/android/src/main/java/com/rentlytuya/components/LoadingIndicator.kt +75 -0
  25. package/android/src/main/java/com/rentlytuya/components/Slider.kt +66 -0
  26. package/android/src/main/java/com/rentlytuya/components/Switch.kt +51 -0
  27. package/android/src/main/java/com/rentlytuya/components/VideoView.kt +45 -0
  28. package/android/src/main/java/com/rentlytuya/dashboard/AdvancedSettings.kt +259 -0
  29. package/android/src/main/java/com/rentlytuya/dashboard/Dashboard.kt +551 -0
  30. package/android/src/main/java/com/rentlytuya/dashboard/DoorbellSettings.kt +874 -0
  31. package/android/src/main/java/com/rentlytuya/dashboard/Messages.kt +463 -0
  32. package/android/src/main/java/com/rentlytuya/dashboard/NavController.kt +358 -0
  33. package/android/src/main/java/com/rentlytuya/dashboard/OfflineScreen.kt +160 -0
  34. package/android/src/main/java/com/rentlytuya/dashboard/Playback.kt +685 -0
  35. package/android/src/main/java/com/rentlytuya/tuya/Messages.kt +234 -0
  36. package/android/src/main/java/com/rentlytuya/tuya/Playback.kt +385 -0
  37. package/android/src/main/java/com/rentlytuya/tuya/ScreenCapture.kt +244 -0
  38. package/android/src/main/java/com/rentlytuya/tuya/Settings.kt +809 -0
  39. package/android/src/main/java/com/rentlytuya/tuya/Tuya.kt +497 -0
  40. package/android/src/main/java/com/rentlytuya/ui/theme/LocalColor.kt +80 -0
  41. package/android/src/main/java/com/rentlytuya/ui/theme/LocalFont.kt +35 -0
  42. package/android/src/main/java/com/rentlytuya/ui/theme/Theme.kt +34 -0
  43. package/android/src/main/java/com/rentlytuya/ui/theme/Type.kt +34 -0
  44. package/android/src/main/java/com/rentlytuya/util/Airbrake.kt +40 -0
  45. package/android/src/main/java/com/rentlytuya/util/DpConstants.kt +53 -0
  46. package/android/src/main/java/com/rentlytuya/util/FrescoManager.kt +86 -0
  47. package/android/src/main/java/com/rentlytuya/util/HeapAnalytics.kt +16 -0
  48. package/android/src/main/java/com/rentlytuya/util/KeylessModule.kt +81 -0
  49. package/android/src/main/java/com/rentlytuya/util/PermissionHandler.kt +75 -0
  50. package/android/src/main/java/com/rentlytuya/util/ReactParamsCheck.kt +152 -0
  51. package/android/src/main/java/com/rentlytuya/util/Util.kt +128 -0
  52. package/android/src/main/res/drawable/ic_close.xml +12 -0
  53. package/android/src/main/res/drawable/ic_launcher_background.xml +170 -0
  54. package/android/src/main/res/drawable/ic_launcher_foreground.xml +30 -0
  55. package/android/src/main/res/drawable/img_place_holder.png +0 -0
  56. package/android/src/main/res/drawable-hdpi/ic_action_arrow_backward.png +0 -0
  57. package/android/src/main/res/drawable-hdpi/ic_arrow_backward_white.png +0 -0
  58. package/android/src/main/res/drawable-hdpi/ic_arrow_blue_right.png +0 -0
  59. package/android/src/main/res/drawable-hdpi/ic_calendar.png +0 -0
  60. package/android/src/main/res/drawable-hdpi/ic_camera.png +0 -0
  61. package/android/src/main/res/drawable-hdpi/ic_message.png +0 -0
  62. package/android/src/main/res/drawable-hdpi/ic_pause.png +0 -0
  63. package/android/src/main/res/drawable-hdpi/ic_play.png +0 -0
  64. package/android/src/main/res/drawable-hdpi/ic_play_back.png +0 -0
  65. package/android/src/main/res/drawable-hdpi/ic_record.png +0 -0
  66. package/android/src/main/res/drawable-hdpi/ic_retry.png +0 -0
  67. package/android/src/main/res/drawable-hdpi/ic_setting.png +0 -0
  68. package/android/src/main/res/drawable-hdpi/ic_sound_off.png +0 -0
  69. package/android/src/main/res/drawable-hdpi/ic_sound_on.png +0 -0
  70. package/android/src/main/res/drawable-mdpi/ic_action_arrow_backward.png +0 -0
  71. package/android/src/main/res/drawable-mdpi/ic_arrow_backward_white.png +0 -0
  72. package/android/src/main/res/drawable-mdpi/ic_arrow_blue_right.png +0 -0
  73. package/android/src/main/res/drawable-mdpi/ic_battery_average.png +0 -0
  74. package/android/src/main/res/drawable-mdpi/ic_battery_charging.png +0 -0
  75. package/android/src/main/res/drawable-mdpi/ic_battery_full.png +0 -0
  76. package/android/src/main/res/drawable-mdpi/ic_battery_good.png +0 -0
  77. package/android/src/main/res/drawable-mdpi/ic_battery_low.png +0 -0
  78. package/android/src/main/res/drawable-mdpi/ic_calendar.png +0 -0
  79. package/android/src/main/res/drawable-mdpi/ic_camera.png +0 -0
  80. package/android/src/main/res/drawable-mdpi/ic_message.png +0 -0
  81. package/android/src/main/res/drawable-mdpi/ic_pause.png +0 -0
  82. package/android/src/main/res/drawable-mdpi/ic_play.png +0 -0
  83. package/android/src/main/res/drawable-mdpi/ic_play_back.png +0 -0
  84. package/android/src/main/res/drawable-mdpi/ic_record.png +0 -0
  85. package/android/src/main/res/drawable-mdpi/ic_retry.png +0 -0
  86. package/android/src/main/res/drawable-mdpi/ic_setting.png +0 -0
  87. package/android/src/main/res/drawable-mdpi/ic_sound_off.png +0 -0
  88. package/android/src/main/res/drawable-mdpi/ic_sound_on.png +0 -0
  89. package/android/src/main/res/drawable-xhdpi/ic_action_arrow_backward.png +0 -0
  90. package/android/src/main/res/drawable-xhdpi/ic_arrow_backward_white.png +0 -0
  91. package/android/src/main/res/drawable-xhdpi/ic_arrow_blue_right.png +0 -0
  92. package/android/src/main/res/drawable-xhdpi/ic_battery_average.png +0 -0
  93. package/android/src/main/res/drawable-xhdpi/ic_battery_charging.png +0 -0
  94. package/android/src/main/res/drawable-xhdpi/ic_battery_full.png +0 -0
  95. package/android/src/main/res/drawable-xhdpi/ic_battery_good.png +0 -0
  96. package/android/src/main/res/drawable-xhdpi/ic_battery_low.png +0 -0
  97. package/android/src/main/res/drawable-xhdpi/ic_calendar.png +0 -0
  98. package/android/src/main/res/drawable-xhdpi/ic_camera.png +0 -0
  99. package/android/src/main/res/drawable-xhdpi/ic_message.png +0 -0
  100. package/android/src/main/res/drawable-xhdpi/ic_pause.png +0 -0
  101. package/android/src/main/res/drawable-xhdpi/ic_play.png +0 -0
  102. package/android/src/main/res/drawable-xhdpi/ic_play_back.png +0 -0
  103. package/android/src/main/res/drawable-xhdpi/ic_record.png +0 -0
  104. package/android/src/main/res/drawable-xhdpi/ic_retry.png +0 -0
  105. package/android/src/main/res/drawable-xhdpi/ic_setting.png +0 -0
  106. package/android/src/main/res/drawable-xhdpi/ic_sound_off.png +0 -0
  107. package/android/src/main/res/drawable-xhdpi/ic_sound_on.png +0 -0
  108. package/android/src/main/res/drawable-xxhdpi/ic_action_arrow_backward.png +0 -0
  109. package/android/src/main/res/drawable-xxhdpi/ic_arrow_backward_white.png +0 -0
  110. package/android/src/main/res/drawable-xxhdpi/ic_arrow_blue_right.png +0 -0
  111. package/android/src/main/res/drawable-xxhdpi/ic_battery_average.png +0 -0
  112. package/android/src/main/res/drawable-xxhdpi/ic_battery_charging.png +0 -0
  113. package/android/src/main/res/drawable-xxhdpi/ic_battery_full.png +0 -0
  114. package/android/src/main/res/drawable-xxhdpi/ic_battery_good.png +0 -0
  115. package/android/src/main/res/drawable-xxhdpi/ic_battery_low.png +0 -0
  116. package/android/src/main/res/drawable-xxhdpi/ic_calendar.png +0 -0
  117. package/android/src/main/res/drawable-xxhdpi/ic_camera.png +0 -0
  118. package/android/src/main/res/drawable-xxhdpi/ic_message.png +0 -0
  119. package/android/src/main/res/drawable-xxhdpi/ic_pause.png +0 -0
  120. package/android/src/main/res/drawable-xxhdpi/ic_play.png +0 -0
  121. package/android/src/main/res/drawable-xxhdpi/ic_play_back.png +0 -0
  122. package/android/src/main/res/drawable-xxhdpi/ic_record.png +0 -0
  123. package/android/src/main/res/drawable-xxhdpi/ic_retry.png +0 -0
  124. package/android/src/main/res/drawable-xxhdpi/ic_setting.png +0 -0
  125. package/android/src/main/res/drawable-xxhdpi/ic_sound_off.png +0 -0
  126. package/android/src/main/res/drawable-xxhdpi/ic_sound_on.png +0 -0
  127. package/android/src/main/res/drawable-xxxhdpi/ic_action_arrow_backward.png +0 -0
  128. package/android/src/main/res/drawable-xxxhdpi/ic_arrow_backward_white.png +0 -0
  129. package/android/src/main/res/drawable-xxxhdpi/ic_arrow_blue_right.png +0 -0
  130. package/android/src/main/res/drawable-xxxhdpi/ic_calendar.png +0 -0
  131. package/android/src/main/res/drawable-xxxhdpi/ic_camera.png +0 -0
  132. package/android/src/main/res/drawable-xxxhdpi/ic_message.png +0 -0
  133. package/android/src/main/res/drawable-xxxhdpi/ic_pause.png +0 -0
  134. package/android/src/main/res/drawable-xxxhdpi/ic_play.png +0 -0
  135. package/android/src/main/res/drawable-xxxhdpi/ic_play_back.png +0 -0
  136. package/android/src/main/res/drawable-xxxhdpi/ic_record.png +0 -0
  137. package/android/src/main/res/drawable-xxxhdpi/ic_retry.png +0 -0
  138. package/android/src/main/res/drawable-xxxhdpi/ic_setting.png +0 -0
  139. package/android/src/main/res/drawable-xxxhdpi/ic_sound_off.png +0 -0
  140. package/android/src/main/res/drawable-xxxhdpi/ic_sound_on.png +0 -0
  141. package/android/src/main/res/font/quicksand_bold.ttf +0 -0
  142. package/android/src/main/res/font/quicksand_light.ttf +0 -0
  143. package/android/src/main/res/font/quicksand_medium.ttf +0 -0
  144. package/android/src/main/res/font/quicksand_regular.ttf +0 -0
  145. package/android/src/main/res/font/quicksand_semi_bold.ttf +0 -0
  146. package/android/src/main/res/values/strings.xml +121 -0
  147. package/android/thingMapping.gradle +200 -0
  148. package/android/thingMapping.json +2014 -0
  149. package/ios/components/Alert.swift +54 -0
  150. package/ios/components/AnchorButton.swift +100 -0
  151. package/ios/components/Button.swift +118 -0
  152. package/ios/components/CustomDatePicker.swift +275 -0
  153. package/ios/components/Divider.swift +28 -0
  154. package/ios/components/Image.swift +72 -0
  155. package/ios/components/Label.swift +105 -0
  156. package/ios/components/Switch.swift +61 -0
  157. package/ios/dashboard/AdvanceSettings.swift +127 -0
  158. package/ios/dashboard/Dashboard.swift +354 -0
  159. package/ios/dashboard/Messages.swift +361 -0
  160. package/ios/dashboard/NavigationController.swift +173 -0
  161. package/ios/dashboard/OfflineScreen.swift +109 -0
  162. package/ios/dashboard/Playback.swift +543 -0
  163. package/ios/dashboard/PreviewManager.swift +117 -0
  164. package/ios/dashboard/Settings.swift +672 -0
  165. package/ios/icons/Charging.png +0 -0
  166. package/ios/icons/Charging@2x.png +0 -0
  167. package/ios/icons/Charging@3x.png +0 -0
  168. package/ios/icons/back_arraow.png +0 -0
  169. package/ios/icons/back_arraow@2x.png +0 -0
  170. package/ios/icons/back_arraow@3x.png +0 -0
  171. package/ios/icons/battery_average.png +0 -0
  172. package/ios/icons/battery_average@2x.png +0 -0
  173. package/ios/icons/battery_average@3x.png +0 -0
  174. package/ios/icons/battery_full.png +0 -0
  175. package/ios/icons/battery_full@2x.png +0 -0
  176. package/ios/icons/battery_full@3x.png +0 -0
  177. package/ios/icons/battery_good.png +0 -0
  178. package/ios/icons/battery_good@2x.png +0 -0
  179. package/ios/icons/battery_good@3x.png +0 -0
  180. package/ios/icons/battery_low.png +0 -0
  181. package/ios/icons/battery_low@2x.png +0 -0
  182. package/ios/icons/battery_low@3x.png +0 -0
  183. package/ios/icons/calendar.png +0 -0
  184. package/ios/icons/calendar@2x.png +0 -0
  185. package/ios/icons/calendar@3x.png +0 -0
  186. package/ios/icons/cloud.png +0 -0
  187. package/ios/icons/cloud@2x.png +0 -0
  188. package/ios/icons/cloud@3x.png +0 -0
  189. package/ios/icons/down_update.png +0 -0
  190. package/ios/icons/down_update@2x.png +0 -0
  191. package/ios/icons/down_update@3x.png +0 -0
  192. package/ios/icons/exit_fullscreen.png +0 -0
  193. package/ios/icons/exit_fullscreen@2x.png +0 -0
  194. package/ios/icons/exit_fullscreen@3x.png +0 -0
  195. package/ios/icons/expand.png +0 -0
  196. package/ios/icons/fullscreen.png +0 -0
  197. package/ios/icons/fullscreen@2x.png +0 -0
  198. package/ios/icons/fullscreen@3x.png +0 -0
  199. package/ios/icons/image_placeholder.png +0 -0
  200. package/ios/icons/information.png +0 -0
  201. package/ios/icons/information@2x.png +0 -0
  202. package/ios/icons/information@3x.png +0 -0
  203. package/ios/icons/keyless_Setting.png +0 -0
  204. package/ios/icons/keyless_Setting@2x.png +0 -0
  205. package/ios/icons/keyless_Setting@3x.png +0 -0
  206. package/ios/icons/keyless_back@1x.png +0 -0
  207. package/ios/icons/keyless_back@2x.png +0 -0
  208. package/ios/icons/keyless_back@3x.png +0 -0
  209. package/ios/icons/keyless_filter.png +0 -0
  210. package/ios/icons/keyless_filter@2x.png +0 -0
  211. package/ios/icons/keyless_filter@3x.png +0 -0
  212. package/ios/icons/keyless_message.png +0 -0
  213. package/ios/icons/keyless_message@2x.png +0 -0
  214. package/ios/icons/keyless_message@3x.png +0 -0
  215. package/ios/icons/keyless_pause.png +0 -0
  216. package/ios/icons/keyless_pause@2x.png +0 -0
  217. package/ios/icons/keyless_pause@3x.png +0 -0
  218. package/ios/icons/keyless_photo.png +0 -0
  219. package/ios/icons/keyless_photo@2x.png +0 -0
  220. package/ios/icons/keyless_photo@3x.png +0 -0
  221. package/ios/icons/keyless_play.png +0 -0
  222. package/ios/icons/keyless_play@2x.png +0 -0
  223. package/ios/icons/keyless_play@3x.png +0 -0
  224. package/ios/icons/keyless_play_list.png +0 -0
  225. package/ios/icons/keyless_play_list@2x.png +0 -0
  226. package/ios/icons/keyless_play_list@3x.png +0 -0
  227. package/ios/icons/keyless_play_playback.png +0 -0
  228. package/ios/icons/keyless_play_playback@2x.png +0 -0
  229. package/ios/icons/keyless_play_playback@3x.png +0 -0
  230. package/ios/icons/keyless_record.png +0 -0
  231. package/ios/icons/keyless_record@2x.png +0 -0
  232. package/ios/icons/keyless_record@3x.png +0 -0
  233. package/ios/icons/keyless_record_on.png +0 -0
  234. package/ios/icons/keyless_record_on@2x.png +0 -0
  235. package/ios/icons/keyless_record_on@3x.png +0 -0
  236. package/ios/icons/keyless_sound_off.png +0 -0
  237. package/ios/icons/keyless_sound_off@2x.png +0 -0
  238. package/ios/icons/keyless_sound_off@3x.png +0 -0
  239. package/ios/icons/keyless_sound_on.png +0 -0
  240. package/ios/icons/keyless_sound_on@2x.png +0 -0
  241. package/ios/icons/keyless_sound_on@3x.png +0 -0
  242. package/ios/icons/keyless_speak_off.png +0 -0
  243. package/ios/icons/keyless_speak_off@2x.png +0 -0
  244. package/ios/icons/keyless_speak_on.png +0 -0
  245. package/ios/icons/keyless_speak_on@2x.png +0 -0
  246. package/ios/icons/keyless_speak_on@3x.png +0 -0
  247. package/ios/icons/refresh.png +0 -0
  248. package/ios/icons/refresh@2x.png +0 -0
  249. package/ios/icons/refresh@3x.png +0 -0
  250. package/ios/icons/ty_camera_control_hd_normal@2x.png +0 -0
  251. package/ios/icons/ty_camera_control_hd_normal@3x.png +0 -0
  252. package/ios/icons/ty_camera_control_sd_normal@2x.png +0 -0
  253. package/ios/icons/ty_camera_control_sd_normal@3x.png +0 -0
  254. package/ios/icons/upgrade_success.png +0 -0
  255. package/ios/icons/upgrade_success@2x.png +0 -0
  256. package/ios/icons/upgrade_success@3x.png +0 -0
  257. package/ios/listener/KeylessListener.m +8 -0
  258. package/ios/listener/KeylessListener.swift +56 -0
  259. package/ios/listener/RentlyTuya-Bridging-Header.h +5 -0
  260. package/ios/listener/RentlyTuya.mm +56 -0
  261. package/ios/listener/RentlyTuya.swift +544 -0
  262. package/ios/theme/LocalColor.swift +33 -0
  263. package/ios/theme/LocalFont.swift +32 -0
  264. package/ios/theme/Theme.swift +71 -0
  265. package/ios/tuya/CameraManager.swift +296 -0
  266. package/ios/tuya/SettingsManager.swift +475 -0
  267. package/ios/tuya/Tuya.swift +570 -0
  268. package/ios/tuya/TuyaMessages.swift +98 -0
  269. package/ios/utils/Airbrake.swift +31 -0
  270. package/ios/utils/AppUtility.swift +76 -0
  271. package/ios/utils/HeapAnalytics.swift +8 -0
  272. package/ios/utils/OrientationManager.swift +60 -0
  273. package/ios/utils/PromiseHandler.swift +36 -0
  274. package/lib/commonjs/index.js +90 -0
  275. package/lib/commonjs/index.js.map +1 -0
  276. package/lib/commonjs/package.json +1 -0
  277. package/lib/module/index.js +83 -0
  278. package/lib/module/index.js.map +1 -0
  279. package/lib/module/package.json +1 -0
  280. package/lib/typescript/commonjs/package.json +1 -0
  281. package/lib/typescript/commonjs/src/index.d.ts +75 -0
  282. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  283. package/lib/typescript/module/package.json +1 -0
  284. package/lib/typescript/module/src/index.d.ts +75 -0
  285. package/lib/typescript/module/src/index.d.ts.map +1 -0
  286. package/package.json +188 -0
  287. package/rently-tuya.podspec +52 -0
  288. package/src/index.tsx +158 -0
@@ -0,0 +1,75 @@
1
+ package com.rentlytuya.components
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.layout.Box
5
+ import androidx.compose.foundation.layout.Row
6
+ import androidx.compose.foundation.layout.fillMaxHeight
7
+ import androidx.compose.foundation.layout.fillMaxSize
8
+ import androidx.compose.foundation.layout.fillMaxWidth
9
+ import androidx.compose.foundation.layout.padding
10
+ import androidx.compose.material3.CircularProgressIndicator
11
+ import androidx.compose.runtime.Composable
12
+ import androidx.compose.ui.Alignment
13
+ import androidx.compose.ui.ExperimentalComposeUiApi
14
+ import androidx.compose.ui.Modifier
15
+ import androidx.compose.ui.draw.alpha
16
+ import androidx.compose.ui.graphics.Color
17
+ import androidx.compose.ui.input.pointer.pointerInteropFilter
18
+ import androidx.compose.ui.platform.LocalConfiguration
19
+ import androidx.compose.ui.unit.Dp
20
+ import androidx.compose.ui.unit.dp
21
+ import androidx.compose.ui.window.Dialog
22
+ import androidx.compose.ui.window.DialogProperties
23
+ import androidx.compose.ui.zIndex
24
+ import com.rentlytuya.ui.theme.LocalColor
25
+ import com.rentlytuya.util.Util.isLandscape
26
+
27
+ @OptIn(ExperimentalComposeUiApi::class)
28
+ @Composable
29
+ fun LoadingIndicator(
30
+ modifier: Modifier = Modifier,
31
+ title: String = "Loading…",
32
+ color: Color = LocalColor.Main.Dark,
33
+ size: Dp = 4.dp
34
+ ) {
35
+ val configuration = LocalConfiguration.current
36
+
37
+ Dialog(
38
+ onDismissRequest = {
39
+
40
+ },
41
+ properties = DialogProperties(
42
+ usePlatformDefaultWidth = false
43
+ )
44
+ ) {
45
+ Box(
46
+ modifier = Modifier
47
+ .fillMaxSize()
48
+ .zIndex(1F)
49
+ .alpha(1f)
50
+ .background(Color.Transparent)
51
+ .pointerInteropFilter { true },
52
+ contentAlignment = Alignment.Center
53
+ ) {
54
+ Row(
55
+ modifier = Modifier
56
+ .fillMaxWidth(if (isLandscape(configuration)) 0.5f else 0.9f)
57
+ .fillMaxHeight(if (isLandscape(configuration)) 0.2f else 0.1f)
58
+ .background(LocalColor.Monochrome.White),
59
+ verticalAlignment = Alignment.CenterVertically
60
+ ) {
61
+ CircularProgressIndicator(
62
+ modifier = Modifier
63
+ .padding(horizontal = 20.dp),
64
+ color = color,
65
+ strokeWidth = size
66
+ )
67
+ Label(
68
+ title = title,
69
+ semiBold = true,
70
+ black = true
71
+ )
72
+ }
73
+ }
74
+ }
75
+ }
@@ -0,0 +1,66 @@
1
+ package com.rentlytuya.components
2
+
3
+ import androidx.compose.foundation.interaction.MutableInteractionSource
4
+ import androidx.compose.foundation.layout.height
5
+ import androidx.compose.material3.ExperimentalMaterial3Api
6
+ import androidx.compose.material3.Slider
7
+ import androidx.compose.material3.SliderDefaults
8
+ import androidx.compose.runtime.Composable
9
+ import androidx.compose.runtime.remember
10
+ import androidx.compose.ui.Modifier
11
+ import androidx.compose.ui.semantics.contentDescription
12
+ import androidx.compose.ui.semantics.semantics
13
+ import androidx.compose.ui.unit.DpSize
14
+ import androidx.compose.ui.unit.dp
15
+ import com.rentlytuya.ui.theme.LocalColor
16
+
17
+ @OptIn(ExperimentalMaterial3Api::class)
18
+ @Composable
19
+ fun Slider(
20
+ modifier: Modifier = Modifier,
21
+ id: String,
22
+ sliderValue: Float,
23
+ enabled: Boolean = true,
24
+ minimumValue: Float = 1f,
25
+ maximumValue: Float = 100f,
26
+ step: Int = 0,
27
+ onValueChange: (value: Float) -> Unit,
28
+ onSlidingComplete: () -> Unit = {}
29
+ ) {
30
+
31
+ val interactionSource = remember { MutableInteractionSource() }
32
+ val sliderColors = SliderDefaults.colors(
33
+ thumbColor = LocalColor.Primary.Dark,
34
+ activeTrackColor = LocalColor.Primary.Dark,
35
+ inactiveTrackColor = LocalColor.Monochrome.White
36
+ )
37
+
38
+ Slider(
39
+ value = sliderValue,
40
+ modifier = Modifier
41
+ .semantics { contentDescription = id }
42
+ .then(modifier),
43
+ enabled = enabled,
44
+ onValueChange = onValueChange,
45
+ onValueChangeFinished = onSlidingComplete,
46
+ valueRange = minimumValue..maximumValue,
47
+ steps = step,
48
+ colors = sliderColors,
49
+ thumb = { _ ->
50
+ SliderDefaults.Thumb(
51
+ thumbSize = DpSize(20.dp, 20.dp),
52
+ colors = sliderColors,
53
+ interactionSource = interactionSource
54
+ )
55
+ },
56
+ track = { sliderState ->
57
+ SliderDefaults.Track(
58
+ modifier = Modifier
59
+ .height(5.dp),
60
+ colors = sliderColors,
61
+ sliderState = sliderState,
62
+ thumbTrackGapSize = 0.dp
63
+ )
64
+ }
65
+ )
66
+ }
@@ -0,0 +1,51 @@
1
+ package com.rentlytuya.components
2
+
3
+ import androidx.compose.material3.SwitchDefaults
4
+ import androidx.compose.runtime.Composable
5
+ import androidx.compose.ui.Modifier
6
+ import androidx.compose.ui.semantics.contentDescription
7
+ import androidx.compose.ui.semantics.semantics
8
+ import com.rentlytuya.ui.theme.LocalColor
9
+ import com.rentlytuya.util.Heap
10
+ import androidx.compose.material3.Switch as MaterialSwitch
11
+
12
+ @Composable
13
+ fun Switch(
14
+ modifier: Modifier = Modifier,
15
+ id: String,
16
+ disabled: Boolean = false,
17
+ checked: Boolean,
18
+ // Color
19
+ primary: Boolean = false,
20
+ onChange: (state: Boolean) -> Unit,
21
+ ) {
22
+ val color = when {
23
+ primary -> LocalColor.Main.Dark
24
+ else -> LocalColor.Main.Dark
25
+ }
26
+
27
+ MaterialSwitch(
28
+ modifier = Modifier
29
+ .semantics { contentDescription = id }
30
+ .then(modifier),
31
+ enabled = !disabled,
32
+ checked = checked,
33
+ onCheckedChange = {
34
+ Heap.trackEvent(eventName = id)
35
+ onChange(it)
36
+ },
37
+ // interactionSource = remember { NoRippleInteractionSource() },
38
+ colors = SwitchDefaults.colors(
39
+ checkedThumbColor = LocalColor.Monochrome.White,
40
+ disabledCheckedThumbColor = LocalColor.Monochrome.White,
41
+ checkedTrackColor = color,
42
+ disabledCheckedTrackColor = color.copy(alpha = 0.5f),
43
+
44
+ uncheckedThumbColor = LocalColor.Monochrome.White,
45
+ disabledUncheckedThumbColor = LocalColor.Monochrome.White,
46
+ uncheckedTrackColor = LocalColor.Monochrome.Regular,
47
+ disabledUncheckedTrackColor = LocalColor.Monochrome.White.copy(alpha = 0.5f),
48
+ uncheckedBorderColor = LocalColor.Monochrome.Regular
49
+ )
50
+ )
51
+ }
@@ -0,0 +1,45 @@
1
+ package com.rentlytuya.components
2
+
3
+ import android.view.ViewTreeObserver
4
+ import androidx.compose.runtime.Composable
5
+ import androidx.compose.ui.Modifier
6
+ import androidx.compose.ui.viewinterop.AndroidView
7
+ import com.rentlytuya.tuya.Tuya
8
+ import com.thingclips.smart.camera.middleware.widget.AbsVideoViewCallback
9
+ import com.thingclips.smart.camera.middleware.widget.ThingCameraView
10
+
11
+ @Composable
12
+ fun VideoView(
13
+ modifier: Modifier = Modifier,
14
+ onClick: () -> Unit = {}
15
+ ) {
16
+ AndroidView(
17
+ factory = { context ->
18
+ val cameraView = ThingCameraView(context).apply {
19
+ setViewCallback(object : AbsVideoViewCallback() {
20
+ override fun onCreated(view: Any?) {
21
+ super.onCreated(view)
22
+ Tuya.mCameraP2P?.generateCameraView(view)
23
+ }
24
+
25
+ override fun videoViewClick() {
26
+ super.videoViewClick()
27
+ onClick()
28
+ }
29
+ })
30
+ }
31
+
32
+ cameraView.viewTreeObserver.addOnGlobalLayoutListener(object :
33
+ ViewTreeObserver.OnGlobalLayoutListener {
34
+ override fun onGlobalLayout() {
35
+ cameraView.viewTreeObserver.removeOnGlobalLayoutListener(this)
36
+ Tuya.deviceId?.let { cameraView.createVideoView(it) }
37
+ }
38
+ })
39
+
40
+ cameraView
41
+ },
42
+ modifier = Modifier
43
+ .then(modifier)
44
+ )
45
+ }
@@ -0,0 +1,259 @@
1
+ package com.rentlytuya.dashboard
2
+
3
+ import android.content.ClipData
4
+ import android.content.ClipboardManager
5
+ import android.content.Context
6
+ import android.widget.Toast
7
+ import androidx.compose.foundation.ExperimentalFoundationApi
8
+ import androidx.compose.foundation.background
9
+ import androidx.compose.foundation.combinedClickable
10
+ import androidx.compose.foundation.interaction.MutableInteractionSource
11
+ import androidx.compose.foundation.layout.Arrangement
12
+ import androidx.compose.foundation.layout.Column
13
+ import androidx.compose.foundation.layout.Row
14
+ import androidx.compose.foundation.layout.fillMaxSize
15
+ import androidx.compose.foundation.layout.fillMaxWidth
16
+ import androidx.compose.foundation.layout.height
17
+ import androidx.compose.foundation.layout.padding
18
+ import androidx.compose.foundation.layout.width
19
+ import androidx.compose.material3.ripple
20
+ import androidx.compose.runtime.Composable
21
+ import androidx.compose.runtime.LaunchedEffect
22
+ import androidx.compose.runtime.MutableIntState
23
+ import androidx.compose.runtime.MutableState
24
+ import androidx.compose.runtime.mutableStateOf
25
+ import androidx.compose.runtime.remember
26
+ import androidx.compose.ui.Alignment
27
+ import androidx.compose.ui.Modifier
28
+ import androidx.compose.ui.graphics.Color
29
+ import androidx.compose.ui.platform.LocalContext
30
+ import androidx.compose.ui.unit.dp
31
+ import com.rentlytuya.R
32
+ import com.rentlytuya.alerts.FormatSDCardAlert
33
+ import com.rentlytuya.components.Button
34
+ import com.rentlytuya.components.Divider
35
+ import com.rentlytuya.components.Label
36
+ import com.rentlytuya.components.LoadingIndicator
37
+ import com.rentlytuya.tuya.Settings
38
+ import com.rentlytuya.tuya.Tuya
39
+ import com.rentlytuya.ui.theme.LocalColor
40
+ import com.rentlytuya.util.DateUtil.isNotNull
41
+ import com.rentlytuya.util.Util.strings
42
+
43
+ @Composable
44
+ fun AdvancedSettings() {
45
+
46
+ val isLoading = remember { mutableStateOf(false) }
47
+ val firmwareVersion = remember { mutableStateOf<String?>(null) }
48
+
49
+ LaunchedEffect(Unit) {
50
+ Settings.getFirmwareVersion(
51
+ isLoading = isLoading,
52
+ firmwareVersion = firmwareVersion
53
+ )
54
+ }
55
+
56
+ if (isLoading.value) {
57
+ LoadingIndicator()
58
+ }
59
+
60
+ Column(
61
+ modifier = Modifier
62
+ .fillMaxSize()
63
+ .background(LocalColor.Main.Light)
64
+ .padding(top = 15.dp)
65
+ ) {
66
+ Column(
67
+ modifier = Modifier
68
+ .background(LocalColor.Monochrome.White)
69
+ .padding(horizontal = 10.dp)
70
+ ) {
71
+ Item(
72
+ title = strings(id = R.string.productName),
73
+ value = Tuya.tuyaProductName,
74
+ isAdvancedSetting = true
75
+ )
76
+
77
+ Item(
78
+ title = strings(id = R.string.productID),
79
+ value = Tuya.tuyaProductID,
80
+ isAdvancedSetting = true
81
+ )
82
+
83
+ Item(title = strings(id = R.string.deviceId), value = Tuya.deviceId, isAdvancedSetting = true)
84
+
85
+ Item(title = strings(id = R.string.deviceUUID), value = Tuya.uuid, isAdvancedSetting = true)
86
+
87
+ Item(
88
+ title = strings(id = R.string.serialNumber),
89
+ value = Tuya.serialNumber,
90
+ isAdvancedSetting = true
91
+ )
92
+
93
+ Item(
94
+ title = strings(id = R.string.firmwareVersion),
95
+ value = firmwareVersion.value,
96
+ isAdvancedSetting = true
97
+ )
98
+ }
99
+ }
100
+ }
101
+
102
+ @Composable
103
+ fun StorageSettings(
104
+ totalStorageCapacity: MutableState<String>,
105
+ usedStorage: MutableState<String>,
106
+ remainingStorageCapacity: MutableState<String>,
107
+ storageFunctionType: MutableIntState
108
+ ) {
109
+
110
+ val isLoading = remember { mutableStateOf(false) }
111
+ val isFormatSDCardVisible = remember { mutableStateOf(false) }
112
+
113
+ LaunchedEffect(storageFunctionType.intValue) {
114
+ Settings.getMemoryCardCapacity(
115
+ totalStorageCapacity = totalStorageCapacity,
116
+ remainingStorageCapacity = remainingStorageCapacity,
117
+ usedStorage = usedStorage
118
+ )
119
+ }
120
+
121
+ if (isLoading.value) {
122
+ LoadingIndicator()
123
+ }
124
+
125
+ FormatSDCardAlert(
126
+ isFormatSDCardVisible = isFormatSDCardVisible.value,
127
+ onDismiss = { isFormatSDCardVisible.value = false },
128
+ onFormat = {
129
+ isFormatSDCardVisible.value = false
130
+ Settings.formatSDCard(
131
+ isLoading = isLoading
132
+ )
133
+ }
134
+ )
135
+
136
+ Column(
137
+ modifier = Modifier
138
+ .fillMaxSize()
139
+ .background(LocalColor.Main.Light)
140
+ ) {
141
+ Column(
142
+ modifier = Modifier
143
+ .background(LocalColor.Monochrome.White)
144
+ ) {
145
+
146
+ Heading(title = strings(id = R.string.storageCapacity).uppercase())
147
+
148
+ Item(
149
+ title = strings(id = R.string.totalCapacity),
150
+ value = totalStorageCapacity.value,
151
+ background = LocalColor.Main.Light
152
+ )
153
+
154
+ Item(
155
+ title = strings(id = R.string.used),
156
+ value = usedStorage.value,
157
+ background = LocalColor.Main.Light
158
+ )
159
+
160
+ Item(
161
+ title = strings(id = R.string.remainingCapacity),
162
+ value = remainingStorageCapacity.value,
163
+ background = LocalColor.Main.Light
164
+ )
165
+
166
+ Row(
167
+ modifier = Modifier
168
+ .fillMaxWidth()
169
+ .background(LocalColor.Main.Light)
170
+ .padding(vertical = 15.dp),
171
+ verticalAlignment = Alignment.CenterVertically,
172
+ horizontalArrangement = Arrangement.Center
173
+ ) {
174
+ Button(
175
+ modifier = Modifier
176
+ .width(125.dp)
177
+ .height(50.dp),
178
+ id = "FormatSDCard",
179
+ title = strings(id = R.string.format),
180
+ textColor = LocalColor.Monochrome.White,
181
+ secondary = true,
182
+ semiBold = true,
183
+ disabled = storageFunctionType.intValue == 4
184
+ ) {
185
+ isFormatSDCardVisible.value = true
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ @OptIn(ExperimentalFoundationApi::class)
193
+ @Composable
194
+ fun Item(
195
+ title: String,
196
+ value: String?,
197
+ isAdvancedSetting: Boolean = false,
198
+ background: Color = LocalColor.Monochrome.White
199
+ ) {
200
+
201
+ val context = LocalContext.current
202
+
203
+ if (value.isNotNull()) {
204
+ Column(
205
+ modifier = Modifier
206
+ .background(background)
207
+ .combinedClickable(
208
+ indication = if (isAdvancedSetting) ripple() else null,
209
+ interactionSource = remember { MutableInteractionSource() },
210
+ onClick = {},
211
+ onLongClick = {
212
+ if (isAdvancedSetting) {
213
+ copyToClipboard(context, title, value)
214
+ }
215
+ }
216
+ )
217
+ ) {
218
+ Row(
219
+ modifier = Modifier
220
+ .fillMaxWidth()
221
+ .padding(15.dp),
222
+ horizontalArrangement = Arrangement.SpaceBetween
223
+ ) {
224
+ Label(
225
+ modifier = Modifier
226
+ .padding(end = 10.dp),
227
+ id = title.lowercase() + "Title",
228
+ title = title,
229
+ l = true,
230
+ black = true,
231
+ medium = true,
232
+ )
233
+
234
+ Label(
235
+ modifier = Modifier
236
+ .padding(start = 10.dp),
237
+ id = value.lowercase() + "Value",
238
+ title = value,
239
+ l = true,
240
+ black = true,
241
+ medium = true,
242
+ maxLines = 3
243
+ )
244
+ }
245
+
246
+ Divider(
247
+ thickness = 1.dp
248
+ )
249
+ }
250
+ }
251
+ }
252
+
253
+ fun copyToClipboard(context: Context, label: String, text: String) {
254
+ val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
255
+ val clip = ClipData.newPlainText(label, text)
256
+ clipboard.setPrimaryClip(clip)
257
+ Toast.makeText(context, "Copied $label to clipboard", Toast.LENGTH_SHORT).show()
258
+ }
259
+