@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,358 @@
1
+ package com.rentlytuya.dashboard
2
+
3
+ import android.app.Activity
4
+ import android.content.res.Configuration
5
+ import android.os.Build
6
+ import android.util.Log
7
+ import androidx.compose.animation.EnterTransition
8
+ import androidx.compose.animation.ExitTransition
9
+ import androidx.compose.foundation.Image
10
+ import androidx.compose.foundation.background
11
+ import androidx.compose.foundation.layout.Box
12
+ import androidx.compose.foundation.layout.Column
13
+ import androidx.compose.foundation.layout.fillMaxHeight
14
+ import androidx.compose.foundation.layout.fillMaxSize
15
+ import androidx.compose.foundation.layout.fillMaxWidth
16
+ import androidx.compose.foundation.layout.padding
17
+ import androidx.compose.foundation.layout.size
18
+ import androidx.compose.material3.IconButton
19
+ import androidx.compose.runtime.Composable
20
+ import androidx.compose.runtime.LaunchedEffect
21
+ import androidx.compose.runtime.MutableState
22
+ import androidx.compose.runtime.mutableIntStateOf
23
+ import androidx.compose.runtime.mutableStateOf
24
+ import androidx.compose.runtime.remember
25
+ import androidx.compose.runtime.rememberCoroutineScope
26
+ import androidx.compose.ui.Alignment
27
+ import androidx.compose.ui.Modifier
28
+ import androidx.compose.ui.graphics.ColorFilter
29
+ import androidx.compose.ui.platform.LocalConfiguration
30
+ import androidx.compose.ui.platform.LocalContext
31
+ import androidx.compose.ui.res.painterResource
32
+ import androidx.compose.ui.unit.dp
33
+ import androidx.navigation.NavController
34
+ import androidx.navigation.NavHostController
35
+ import androidx.navigation.compose.NavHost
36
+ import androidx.navigation.compose.composable
37
+ import com.facebook.react.ReactApplication
38
+ import com.rentlytuya.R
39
+ import com.rentlytuya.components.Label
40
+ import com.rentlytuya.components.LoadingIndicator
41
+ import com.rentlytuya.tuya.DefaultSettings
42
+ import com.rentlytuya.tuya.Playback
43
+ import com.rentlytuya.tuya.Settings
44
+ import com.rentlytuya.tuya.Tuya
45
+ import com.rentlytuya.tuya.Tuya.TAG
46
+ import com.rentlytuya.tuya.Tuya.isDefaultSettingsUpdated
47
+ import com.rentlytuya.tuya.Tuya.isResident
48
+ import com.rentlytuya.ui.theme.LocalColor
49
+ import com.rentlytuya.util.DateUtil.isNotNull
50
+ import com.rentlytuya.util.Heap
51
+ import com.rentlytuya.util.Util.strings
52
+ import kotlinx.coroutines.CoroutineScope
53
+ import kotlinx.coroutines.launch
54
+
55
+ @Composable
56
+ fun NavController(
57
+ navController: NavHostController
58
+ ) {
59
+ val scope = rememberCoroutineScope()
60
+ val activity = LocalContext.current as Activity
61
+
62
+ val reactContext = (LocalContext.current.applicationContext as ReactApplication)
63
+ .reactNativeHost.reactInstanceManager.currentReactContext
64
+
65
+ val currentDestination = remember { mutableStateOf("Dashboard") }
66
+ val deviceName = remember { mutableStateOf("Doorbell") }
67
+
68
+ val isOnline = remember { mutableStateOf(false) }
69
+ val isMuted = remember { mutableStateOf(true) }
70
+ val isRecording = remember { mutableStateOf(false) }
71
+ val isSettings = remember { mutableStateOf(false) }
72
+ val isAdvancedSettings = remember { mutableStateOf(false) }
73
+ val isStorageSettings = remember { mutableStateOf(false) }
74
+ val isDatePickerVisible = remember { mutableStateOf(false) }
75
+ val isMessagesDatePickerVisible = remember { mutableStateOf(false) }
76
+ val isLoading = remember { mutableStateOf(false) }
77
+
78
+ // Settings
79
+ val isWaterMarkEnabled = remember { mutableStateOf(false) }
80
+ val isFlipEnabled = remember { mutableStateOf(false) }
81
+ val isAntiDismantlingAlarmEnabled = remember { mutableStateOf(false) }
82
+ val nightVisionLevel = remember { mutableStateOf("0") }
83
+ val isMotionDetectionEnabled = remember { mutableStateOf(false) }
84
+ val motionSensitivityLevel = remember { mutableStateOf("0") }
85
+ val aosuMotionSensitivityLevel = remember { mutableStateOf("1") }
86
+ val isPIRDetectionEnabled = remember { mutableStateOf(false) }
87
+ val pirSensitivityLevel = remember { mutableIntStateOf(0) }
88
+ val storageFunctionType = remember { mutableIntStateOf(1) }
89
+ val isSDCardRecordingEnabled = remember { mutableStateOf(false) }
90
+ val sdCardRecordingType = remember { mutableStateOf("1") }
91
+ val chimeType = remember { mutableStateOf("0") }
92
+ val powerSource = remember { mutableStateOf("0") }
93
+ val batteryPercentage = remember { mutableIntStateOf(0) }
94
+ val totalStorageCapacity = remember { mutableStateOf("0.0") }
95
+ val usedStorage = remember { mutableStateOf("0.0") }
96
+ val remainingStorageCapacity = remember { mutableStateOf("0.0") }
97
+
98
+ val configuration = LocalConfiguration.current
99
+
100
+ LaunchedEffect(Unit) {
101
+ Tuya.getDeviceName(
102
+ setDeviceName = { value ->
103
+ deviceName.value = value
104
+ })
105
+ }
106
+
107
+ LaunchedEffect(isOnline.value) {
108
+ if (isOnline.value) {
109
+ if (!isDefaultSettingsUpdated && isResident && reactContext.isNotNull()) {
110
+ DefaultSettings.updateDoorbellSettings(reactContext)
111
+ }
112
+ }
113
+ }
114
+
115
+ Column(modifier = Modifier.fillMaxSize()) {
116
+
117
+ if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT ||
118
+ (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&
119
+ currentDestination.value != "Dashboard" && currentDestination.value != "Playback" && currentDestination.value != "Messages")
120
+ ) {
121
+ TopBar(
122
+ title = when {
123
+ isAdvancedSettings.value -> strings(id = R.string.advancedSettings)
124
+ isStorageSettings.value -> strings(id = R.string.sdCard)
125
+ currentDestination.value == "Dashboard" -> deviceName.value
126
+ else -> currentDestination.value
127
+ },
128
+ onTrailingIconClick = {
129
+ when (currentDestination.value) {
130
+ "Playback" -> isDatePickerVisible.value = true
131
+ "Messages" -> isMessagesDatePickerVisible.value = true
132
+ else -> {
133
+ isSettings.value = true
134
+ navController.navigate("Settings")
135
+ }
136
+ }
137
+ },
138
+ onBack = {
139
+ handleBackNavigation(
140
+ navController = navController,
141
+ isAdvancedSettings = isAdvancedSettings,
142
+ isStorageSettings = isStorageSettings,
143
+ isSettings = isSettings,
144
+ currentDestination = currentDestination,
145
+ activity = activity,
146
+ scope = scope,
147
+ isLoading = isLoading
148
+ )
149
+ }
150
+ )
151
+ }
152
+
153
+ LaunchedEffect(Unit) {
154
+ val listener =
155
+ NavController.OnDestinationChangedListener { _, destination, _ ->
156
+ currentDestination.value = destination.route ?: "Dashboard"
157
+ }
158
+ navController.addOnDestinationChangedListener(listener)
159
+ }
160
+
161
+ LaunchedEffect(Unit) {
162
+ Settings.initializeSettings(
163
+ isWaterMarkEnabled = isWaterMarkEnabled,
164
+ isFlipEnabled = isFlipEnabled,
165
+ isAntiDismantlingAlarmEnabled = isAntiDismantlingAlarmEnabled,
166
+ nightVisionLevel = nightVisionLevel,
167
+ isMotionDetectionEnabled = isMotionDetectionEnabled,
168
+ motionSensitivityLevel = motionSensitivityLevel,
169
+ aosuMotionSensitivityLevel = aosuMotionSensitivityLevel,
170
+ isPIRDetectionEnabled = isPIRDetectionEnabled,
171
+ pirSensitivityLevel = pirSensitivityLevel,
172
+ storageFunctionType = storageFunctionType,
173
+ isSDCardRecordingEnabled = isSDCardRecordingEnabled,
174
+ sdCardRecordingType = sdCardRecordingType,
175
+ chimeType = chimeType,
176
+ powerSource = powerSource,
177
+ batteryPercentage = batteryPercentage,
178
+ totalStorageCapacity = totalStorageCapacity,
179
+ usedStorage = usedStorage,
180
+ remainingStorageCapacity = remainingStorageCapacity
181
+ )
182
+ }
183
+
184
+ NavHost(
185
+ navController = navController,
186
+ startDestination = "Dashboard",
187
+ modifier = Modifier.fillMaxSize(),
188
+ enterTransition = { EnterTransition.None },
189
+ exitTransition = { ExitTransition.None }
190
+ ) {
191
+ composable("Dashboard") {
192
+ if (isLoading.value) {
193
+ LoadingIndicator(title = strings(id = R.string.closingConnection))
194
+ }
195
+ Heap.trackEvent(eventName = "Dashboard Screen")
196
+ Dashboard(
197
+ modifier = Modifier.weight(if (!isSettings.value) 0.7f else 1f),
198
+ navController = navController,
199
+ isMuted = isMuted,
200
+ isOnline = isOnline,
201
+ isRecording = isRecording,
202
+ powerSource = powerSource,
203
+ batteryPercentage = batteryPercentage
204
+ )
205
+ }
206
+ composable("Playback") {
207
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
208
+ Heap.trackEvent(eventName = "Playback Screen")
209
+ Playback(
210
+ isMuted = isMuted,
211
+ isSettings = isSettings,
212
+ isDatePickerVisible = isDatePickerVisible,
213
+ navController = navController
214
+ )
215
+ }
216
+ }
217
+ composable("Messages") {
218
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
219
+ Heap.trackEvent(eventName = "Messages Screen")
220
+ Messages(
221
+ isSettings = isSettings,
222
+ isDatePickerVisible = isMessagesDatePickerVisible,
223
+ navController = navController
224
+ )
225
+ }
226
+ }
227
+ composable("Settings") {
228
+ Heap.trackEvent(eventName = "Settings Screen")
229
+ DoorbellSettings(
230
+ isSettings = isSettings,
231
+ isStorageSettings = isStorageSettings,
232
+ isAdvancedSettings = isAdvancedSettings,
233
+ navController = navController,
234
+ isWaterMarkEnabled = isWaterMarkEnabled,
235
+ isFlipEnabled = isFlipEnabled,
236
+ isAntiDismantlingAlarmEnabled = isAntiDismantlingAlarmEnabled,
237
+ nightVisionLevel = nightVisionLevel,
238
+ isMotionDetectionEnabled = isMotionDetectionEnabled,
239
+ motionSensitivityLevel = motionSensitivityLevel,
240
+ aosuMotionSensitivityLevel = aosuMotionSensitivityLevel,
241
+ isPIRDetectionEnabled = isPIRDetectionEnabled,
242
+ pirSensitivityLevel = pirSensitivityLevel,
243
+ storageFunctionType = storageFunctionType,
244
+ isSDCardRecordingEnabled = isSDCardRecordingEnabled,
245
+ sdCardRecordingType = sdCardRecordingType,
246
+ chimeType = chimeType,
247
+ powerSource = powerSource,
248
+ batteryPercentage = batteryPercentage,
249
+ totalStorageCapacity = totalStorageCapacity,
250
+ usedStorage = usedStorage,
251
+ remainingStorageCapacity = remainingStorageCapacity
252
+ )
253
+ }
254
+ }
255
+ }
256
+ }
257
+
258
+ @Composable
259
+ fun TopBar(
260
+ title: String,
261
+ onBack: () -> Unit = {},
262
+ onTrailingIconClick: () -> Unit = {}
263
+ ) {
264
+
265
+ val isSpecialTitle = title in listOf("Settings", "Messages", "Advanced Settings", "SD Card")
266
+
267
+ Box(
268
+ modifier = Modifier
269
+ .fillMaxWidth()
270
+ .fillMaxHeight(0.075f)
271
+ .background(if (isSpecialTitle) LocalColor.Main.Light else LocalColor.Monochrome.Grey)
272
+ ) {
273
+ IconButton(
274
+ modifier = Modifier
275
+ .align(Alignment.CenterStart)
276
+ .padding(start = 5.dp),
277
+ onClick = {
278
+ if (title == "Playback") {
279
+ Playback.stopSDCardPlayback()
280
+ }
281
+ onBack()
282
+ }
283
+ ) {
284
+ Image(
285
+ modifier = Modifier.size(35.dp),
286
+ painter = painterResource(
287
+ id = if (isSpecialTitle) R.drawable.ic_action_arrow_backward else R.drawable.ic_arrow_backward_white
288
+ ),
289
+ contentDescription = "back"
290
+ )
291
+ }
292
+
293
+ Box(
294
+ modifier = Modifier
295
+ .fillMaxWidth()
296
+ .align(Alignment.Center),
297
+ contentAlignment = Alignment.Center
298
+ ) {
299
+ Label(
300
+ id = "$title Id",
301
+ title = title,
302
+ semiBold = true,
303
+ xl20 = true,
304
+ white = !isSpecialTitle,
305
+ black = isSpecialTitle
306
+ )
307
+ }
308
+ if (!isSpecialTitle || title == "Playback" || title == "Messages") {
309
+ IconButton(
310
+ modifier = Modifier
311
+ .align(Alignment.CenterEnd)
312
+ .padding(end = 10.dp),
313
+ onClick = onTrailingIconClick
314
+ ) {
315
+ Image(
316
+ modifier = Modifier.size(30.dp),
317
+ painter = painterResource(
318
+ id = if (title == "Playback" || title == "Messages") R.drawable.ic_calendar else R.drawable.ic_setting
319
+ ),
320
+ contentDescription = "trailingIcon",
321
+ colorFilter = if (title == "Messages") {
322
+ ColorFilter.tint(color = LocalColor.Monochrome.Grey)
323
+ } else {
324
+ null
325
+ }
326
+ )
327
+ }
328
+ }
329
+ }
330
+ }
331
+
332
+ private fun handleBackNavigation(
333
+ navController: NavController,
334
+ isAdvancedSettings: MutableState<Boolean>,
335
+ isStorageSettings: MutableState<Boolean>,
336
+ isSettings: MutableState<Boolean>,
337
+ currentDestination: MutableState<String>,
338
+ activity: Activity,
339
+ scope: CoroutineScope,
340
+ isLoading: MutableState<Boolean>
341
+ ) {
342
+ if (isAdvancedSettings.value || isStorageSettings.value) {
343
+ isAdvancedSettings.value = false
344
+ isStorageSettings.value = false
345
+ navController.navigate("Settings")
346
+ } else if (currentDestination.value == "Dashboard") {
347
+ scope.launch {
348
+ val success = Tuya.disconnect { value -> isLoading.value = value }
349
+ if (!success) {
350
+ Log.i(TAG, "Not Disconnected but still navigating the user to React Native")
351
+ }
352
+ activity.finish()
353
+ }
354
+ } else {
355
+ isSettings.value = false
356
+ navController.navigate("Dashboard")
357
+ }
358
+ }
@@ -0,0 +1,160 @@
1
+ package com.rentlytuya.dashboard
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.app.Activity
5
+ import android.content.pm.ActivityInfo
6
+ import android.util.Log
7
+ import androidx.compose.foundation.layout.Arrangement
8
+ import androidx.compose.foundation.layout.Column
9
+ import androidx.compose.foundation.layout.Row
10
+ import androidx.compose.foundation.layout.fillMaxSize
11
+ import androidx.compose.foundation.layout.height
12
+ import androidx.compose.foundation.layout.padding
13
+ import androidx.compose.foundation.layout.width
14
+ import androidx.compose.foundation.rememberScrollState
15
+ import androidx.compose.foundation.verticalScroll
16
+ import androidx.compose.runtime.Composable
17
+ import androidx.compose.runtime.DisposableEffect
18
+ import androidx.compose.ui.Alignment
19
+ import androidx.compose.ui.Modifier
20
+ import androidx.compose.ui.platform.LocalContext
21
+ import androidx.compose.ui.unit.dp
22
+ import com.facebook.react.ReactApplication
23
+ import com.rentlytuya.R
24
+ import com.rentlytuya.components.AnchorButton
25
+ import com.rentlytuya.components.Button
26
+ import com.rentlytuya.components.Label
27
+ import com.rentlytuya.tuya.Settings
28
+ import com.rentlytuya.tuya.Tuya
29
+ import com.rentlytuya.tuya.Tuya.TAG
30
+ import com.rentlytuya.ui.theme.LocalColor
31
+ import com.rentlytuya.util.KeylessModule
32
+ import com.rentlytuya.util.Util.strings
33
+
34
+ @SuppressLint("SourceLockedOrientationActivity")
35
+ @Composable
36
+ fun OfflineScreen(
37
+ onReConnect: () -> Unit
38
+ ) {
39
+
40
+ val context = LocalContext.current
41
+ val activity = context as Activity
42
+ val scrollState = rememberScrollState()
43
+ val reactContext = (LocalContext.current.applicationContext as ReactApplication)
44
+ .reactNativeHost.reactInstanceManager.currentReactContext
45
+
46
+ DisposableEffect(Unit) {
47
+ activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
48
+ onDispose {
49
+ activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
50
+ }
51
+ }
52
+
53
+ Row(
54
+ modifier = Modifier
55
+ .fillMaxSize()
56
+ .padding(horizontal = 30.dp)
57
+ .verticalScroll(scrollState),
58
+ horizontalArrangement = Arrangement.Center,
59
+ verticalAlignment = Alignment.CenterVertically
60
+ ) {
61
+ Column(
62
+ horizontalAlignment = Alignment.CenterHorizontally
63
+ ) {
64
+ Label(
65
+ modifier = Modifier
66
+ .padding(bottom = 15.dp),
67
+ title = strings(id = R.string.connectionFailed),
68
+ white = true,
69
+ xl20 = true,
70
+ bold = true,
71
+ center = true
72
+ )
73
+
74
+ Label(
75
+ modifier = Modifier
76
+ .padding(bottom = 10.dp),
77
+ title = strings(id = R.string.pleaseCheckTheFollowing),
78
+ white = true,
79
+ maxLines = 2
80
+ )
81
+
82
+ Label(
83
+ modifier = Modifier
84
+ .padding(start = 10.dp, bottom = 10.dp),
85
+ title = strings(id = R.string.moveYourWiFi),
86
+ white = true,
87
+ maxLines = 2
88
+ )
89
+
90
+ Label(
91
+ modifier = Modifier
92
+ .padding(start = 10.dp, bottom = 25.dp),
93
+ title = if (Settings.is8s()) {
94
+ strings(id = R.string.checkPowerSourceFor8s)
95
+ } else {
96
+ strings(id = R.string.checkPowerSourceFor15s)
97
+ },
98
+ white = true,
99
+ maxLines = 6
100
+ )
101
+
102
+ Label(
103
+ title = strings(id = R.string.firstTimeUsingDoorbell),
104
+ white = true
105
+ )
106
+
107
+ AnchorButton(
108
+ modifier = Modifier
109
+ .padding(bottom = 20.dp),
110
+ id = "Connect_Doorbell_To_WiFi",
111
+ title = strings(id = R.string.connectDoorbellToWiFi),
112
+ primary = true,
113
+ underLine = true,
114
+ onClick = {
115
+ reactContext?.let { context ->
116
+ val keylessModule = context.getNativeModule(KeylessModule::class.java)
117
+ Tuya.deviceId?.let {
118
+ keylessModule?.sendDataToJS(
119
+ eventName = "navigateToAddDoorbell",
120
+ deviceId = it,
121
+ onSuccess = {
122
+ Log.i(TAG, "Navigate to Add Doorbell Success")
123
+ activity.finish()
124
+ },
125
+ onFailure = {
126
+ Log.i(TAG, "Navigate to Add Doorbell Failed")
127
+ }
128
+ )
129
+ } ?: Log.i(TAG, "Device ID is null")
130
+ }
131
+ }
132
+ )
133
+
134
+ Button(
135
+ modifier = Modifier
136
+ .width(175.dp)
137
+ .height(75.dp)
138
+ .padding(bottom = 20.dp),
139
+ id = "Tap_To_Retry",
140
+ title = strings(id = R.string.tapToRetry),
141
+ xl20 = true,
142
+ black = true,
143
+ iconId = R.drawable.ic_retry,
144
+ textColor = LocalColor.Primary.Light,
145
+ borderColor = LocalColor.Primary.Light
146
+ ) {
147
+ onReConnect()
148
+ }
149
+
150
+ Label(
151
+ modifier = Modifier
152
+ .padding(bottom = 5.dp),
153
+ title = strings(id = R.string.contactSupport),
154
+ white = true,
155
+ center = true,
156
+ maxLines = 2
157
+ )
158
+ }
159
+ }
160
+ }