@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,475 @@
1
+ import ThingSmartCameraKit
2
+
3
+ class SettingsManager: NSObject, ThingSmartCameraDPObserver {
4
+
5
+ static let shared = SettingsManager()
6
+
7
+ private override init() {}
8
+
9
+ private func withDPManager<T>(execute: (ThingSmartCameraDPManager) -> T?) -> T? {
10
+ guard let dpManager = Tuya.shared.dpManager else {
11
+ print("Tuya: Settings, DP Manager is not initialized")
12
+ return nil
13
+ }
14
+ return execute(dpManager)
15
+
16
+ }
17
+
18
+ func is8s() -> Bool {
19
+ return !(isSupportedDP(dpKey: ThingSmartCameraDPKey.wirelessElectricityDPName) ||
20
+ isSupportedDP(dpKey: ThingSmartCameraDPKey.wirelessPowerModeDPName))
21
+ }
22
+
23
+ func isAosu() -> Bool {
24
+ return isSupportedDP(dpKey: ThingSmartCameraDPKey.init(rawValue: "231"))
25
+ }
26
+
27
+ func cameraDPDidUpdate(_ manager: ThingSmartCameraDPManager, dps: [AnyHashable: Any]) {
28
+ for (dpName, dpValue) in dps {
29
+ if let dpKey = dpName as? String {
30
+ switch dpKey {
31
+ case ThingSmartCameraDPKey.basicOSDDPName.rawValue:
32
+ if let value = dpValue as? Bool {
33
+ Tuya.shared.isWaterMarkEnabled = value
34
+ print("Tuya: DP Update - Watermark updated to \(value)")
35
+ }
36
+
37
+ case ThingSmartCameraDPKey.basicFlipDPName.rawValue:
38
+ if let value = dpValue as? Bool {
39
+ Tuya.shared.isFlipEnabled = value
40
+ print("Tuya: DP Update - Flip Mode updated to \(value)")
41
+ }
42
+
43
+ case ThingSmartCameraDPKey.basicNightvisionDPName.rawValue:
44
+ if let value = dpValue as? String {
45
+ Tuya.shared.nightVisionLevel = value
46
+ print("Tuya: DP Update - Night Vision Level updated to \(value)")
47
+ }
48
+
49
+ case ThingSmartCameraDPKey.init(rawValue: "231").rawValue:
50
+ if let value = dpValue as? Bool {
51
+ Tuya.shared.isAntiDismantlingAlarmEnabled = value
52
+ print("Tuya: DP Update - Anti Dismantling Alarm updated to \(value)")
53
+ }
54
+
55
+ case ThingSmartCameraDPKey.motionDetectDPName.rawValue:
56
+ if let value = dpValue as? Bool {
57
+ Tuya.shared.isMotionDetectionEnabled = value
58
+ print("Tuya: DP Update - Motion Detection updated to \(value)")
59
+ }
60
+
61
+ case ThingSmartCameraDPKey.motionSensitivityDPName.rawValue:
62
+ if let value = dpValue as? String {
63
+ Tuya.shared.motionSensitivityLevel = value
64
+ print("Tuya: DP Update - Motion Sensitivity updated to \(value)")
65
+ }
66
+
67
+ case ThingSmartCameraDPKey.basicPIRDPName.rawValue:
68
+ if let value = dpValue as? String {
69
+ Tuya.shared.basicPIRSensitivityLevel = value
70
+ print("Tuya: DP Update - Motion Sensitivity for Aosu updated to \(value)")
71
+ }
72
+
73
+ case ThingSmartCameraDPKey.init(rawValue: "240").rawValue:
74
+ if let value = dpValue as? Bool {
75
+ Tuya.shared.isPIRDetectionEnabled = value
76
+ print("Tuya: DP Update - PIR Detection updated to \(value)")
77
+ }
78
+
79
+ case ThingSmartCameraDPKey.init(rawValue: "241").rawValue:
80
+ if let value = dpValue as? Int {
81
+ Tuya.shared.pirSensitivityLevel = value
82
+ print("Tuya: DP Update - PIR Sensitivity updated to \(value)")
83
+ }
84
+
85
+ case ThingSmartCameraDPKey.sdCardStatusDPName.rawValue:
86
+ if let value = dpValue as? Int {
87
+ Tuya.shared.sdCardStatus = value
88
+ print("Tuya: DP Update - SD Card Status updated to \(value)")
89
+ }
90
+
91
+ case ThingSmartCameraDPKey.sdCardRecordDPName.rawValue:
92
+ if let value = dpValue as? Bool {
93
+ Tuya.shared.isSDCardStorageEnabled = value
94
+ print("Tuya: DP Update - SD Card Recording updated to \(value)")
95
+ }
96
+
97
+ case ThingSmartCameraDPKey.recordModeDPName.rawValue:
98
+ if let value = dpValue as? String {
99
+ Tuya.shared.sdCardRecordingType = value
100
+ print("Tuya: DP Update - Recording Mode updated to \(value)")
101
+ }
102
+
103
+ case ThingSmartCameraDPKey.init(rawValue: "165").rawValue:
104
+ if let value = dpValue as? String {
105
+ Tuya.shared.chimeType = value
106
+ print("Tuya: DP Update - Chime Type updated to \(value)")
107
+ }
108
+
109
+ case ThingSmartCameraDPKey.wirelessElectricityDPName.rawValue:
110
+ if let value = dpValue as? Int {
111
+ Tuya.shared.remainingBattery = value
112
+ print("Tuya: DP Update - Battery Level updated to \(value)%")
113
+ }
114
+
115
+ case ThingSmartCameraDPKey.wirelessPowerModeDPName.rawValue:
116
+ if let value = dpValue as? String {
117
+ Tuya.shared.powerMode = value
118
+ print("Tuya: DP Update - Power Mode updated to \(value)")
119
+ }
120
+
121
+ default:
122
+ print("Tuya: Unknown DP Name in auto update: DP Name: \(dpKey), Value: \(dpValue)")
123
+ }
124
+ } else {
125
+ print("Tuya: Invalid DP Name type in auto update: \(dpName), Value: \(dpValue)")
126
+ }
127
+ }
128
+ }
129
+
130
+ func removeObserver() {
131
+ withDPManager { dpManager in
132
+ dpManager.removeObserver(self)
133
+ print("Tuya: Settings, DP Observer removed")
134
+ }
135
+ }
136
+
137
+ // Check if DP is supported
138
+ func isSupportedDP(dpKey: ThingSmartCameraDPKey) -> Bool {
139
+ return withDPManager { dpManager in
140
+ let isSupported = dpManager.isSupportDP(dpKey)
141
+
142
+ return isSupported
143
+ } ?? false
144
+ }
145
+
146
+ // Set DP value for a specific key
147
+ func setDPValue(
148
+ dpKey: ThingSmartCameraDPKey,
149
+ value: Any,
150
+ onSuccess: (() -> Void)? = nil,
151
+ onFailure: (() -> Void)? = nil
152
+ ) {
153
+ withDPManager { dpManager in
154
+ guard self.isSupportedDP(dpKey: dpKey) else {
155
+ return
156
+ }
157
+
158
+ Tuya.shared.settingsLoader = true
159
+ dpManager.setValue(
160
+ value,
161
+ forDP: dpKey,
162
+ success: { result in
163
+ Tuya.shared.settingsLoader = false
164
+ onSuccess?()
165
+ print("Tuya: Settings, DP settings Success for \(dpKey), Result: \(String(describing: result))")
166
+ },
167
+ failure: { error in
168
+ Tuya.shared.settingsLoader = false
169
+ onFailure?()
170
+ Airbrake.logMessage(
171
+ title: "DP setting failed",
172
+ message: "\(error?.localizedDescription ?? "nil")",
173
+ additionalInfo: ["dpKey" : "\(dpKey)"]
174
+ )
175
+ }
176
+ )
177
+ }
178
+ }
179
+
180
+ // Format SD Card
181
+ func formatSDCard() {
182
+ withDPManager { dpManager in
183
+ guard self.isSupportedDP(dpKey: ThingSmartCameraDPKey.sdCardFormatDPName) else {
184
+ return
185
+ }
186
+
187
+ Tuya.shared.settingsLoader = true
188
+ dpManager.setValue(
189
+ true,
190
+ forDP: ThingSmartCameraDPKey.sdCardFormatDPName,
191
+ success: { result in
192
+ print("Tuya: Formatting started")
193
+ Tuya.shared.settingsLoader = false
194
+ },
195
+ failure: { error in
196
+ print("Tuya: Format failed")
197
+ Tuya.shared.settingsLoader = false
198
+ }
199
+ )
200
+ }
201
+ }
202
+
203
+ // Get Memory card Capaciry
204
+ func getMemoryCardCapacity() {
205
+ guard self.isSupportedDP(dpKey: ThingSmartCameraDPKey.sdCardStorageDPName) else {
206
+ print("Tuya: Get SD card capacity is not supported.")
207
+ return
208
+ }
209
+
210
+ Tuya.shared.settingsLoader = true
211
+
212
+ if let result = getDPValue(dpKey: .sdCardStorageDPName) as? String {
213
+ print("Tuya: Retrieve memory card status successfully. Result: \(result)")
214
+ let components = result.split(separator: "|")
215
+
216
+ guard components.count == 3 else {
217
+ Tuya.shared.settingsLoader = false
218
+ return
219
+ }
220
+
221
+ if let totalBytes = Double(components[0]) {
222
+ Tuya.shared.totalCapacity = totalBytes / 1024 / 1024
223
+ }
224
+
225
+ if let usedBytes = Double(components[1]) {
226
+ Tuya.shared.used = usedBytes / 1024 / 1024
227
+ }
228
+
229
+ if let remainingBytes = Double(components[2]) {
230
+ Tuya.shared.remainingCapacity = remainingBytes / 1024 / 1024
231
+ }
232
+
233
+ Tuya.shared.settingsLoader = false
234
+ } else {
235
+ print("Tuya: No details available for the SD card.")
236
+ Tuya.shared.settingsLoader = false
237
+ }
238
+ }
239
+
240
+ func getFirmwareVersion() {
241
+ guard Tuya.shared.device.isSupportCheckFirmware() else {
242
+ print("Tuya: Firmware upgrade check is not supported for this device.")
243
+ return
244
+ }
245
+
246
+ Tuya.shared.settingsLoader = true
247
+ Tuya.shared.device.checkFirmwareUpgrade { firmwares in
248
+ if firmwares.isEmpty {
249
+ print("Tuya: No firmware information available.")
250
+ Tuya.shared.settingsLoader = false
251
+ return
252
+ }
253
+
254
+ for model in firmwares {
255
+ if model.upgradeStatus.rawValue == 0 && model.type == 0 {
256
+ // No upgrade available
257
+ print("Tuya: Firmware is up to date. Current version: v\(model.currentVersion ?? "unknown").")
258
+ Tuya.shared.firwareVersion = model.currentVersion != nil ? "v\(model.currentVersion!)" : nil
259
+ break
260
+ } else if model.upgradeStatus.rawValue == 1 && model.type == 0 {
261
+ // Upgrade available
262
+ print("Tuya: Firmware upgrade available. New version: v\(model.version ?? "unknown").")
263
+ break
264
+ }
265
+ }
266
+ Tuya.shared.settingsLoader = false
267
+ } failure: { error in
268
+ Tuya.shared.settingsLoader = false
269
+ let errorMessage = error?.localizedDescription ?? "Unknown error"
270
+ Airbrake.logMessage(
271
+ title: "Failed to retrieve firmware information",
272
+ message: errorMessage
273
+ )
274
+ }
275
+ }
276
+
277
+ // Get DP value if supported
278
+ func getDPValue(dpKey: ThingSmartCameraDPKey) -> Any? {
279
+ return withDPManager { dpManager in
280
+ guard isSupportedDP(dpKey: dpKey) else {
281
+ return nil
282
+ }
283
+
284
+ return dpManager.value(forDP: dpKey)
285
+ }
286
+ }
287
+ }
288
+
289
+ class DefaultSettings: NSObject {
290
+
291
+ static let shared = DefaultSettings()
292
+
293
+ private override init() {}
294
+
295
+ private var isMotionSensitivityUpdated = false
296
+ private var isMotionDetectionUpdated = false
297
+ private var isRecordingModeUpdated = false
298
+
299
+ @MainActor
300
+ func updateDoorbellSettings() async {
301
+ var retryCount = 0
302
+ let maxRetries = 3
303
+
304
+ func attemptUpdate() {
305
+ print("Tuya: Attempting to update doorbell settings - Attempt \(retryCount + 1)")
306
+
307
+ enableDefaultSettings(onSuccess: { [weak self] in
308
+ guard let self = self else { return }
309
+ print("Tuya: Default settings applied successfully after \(retryCount) retries.")
310
+ self.resetDefaultSettingsValue()
311
+ }, onFailure: { [weak self] in
312
+ guard let self = self else { return }
313
+ retryCount += 1
314
+ print("Tuya: Failed to apply default settings, retrying... \(retryCount) of \(maxRetries)")
315
+
316
+ if retryCount < maxRetries {
317
+ DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
318
+ attemptUpdate()
319
+ }
320
+ } else {
321
+ print("Tuya: Maximum retries (\(maxRetries)) reached. Default settings could not be applied.")
322
+ Airbrake.logMessage(
323
+ title: "Default Settings Failed",
324
+ message: "Failed to apply default settings after \(maxRetries) attempts."
325
+ )
326
+ }
327
+ })
328
+ }
329
+
330
+ attemptUpdate()
331
+ }
332
+
333
+ private func resetDefaultSettingsValue() {
334
+ if let id = Tuya.shared.id {
335
+ KeylessListener.emitter.resetDefaultSettings(
336
+ withID: id) { success, message in
337
+ if success {
338
+ print("Tuya: Reset Default Settings successful.")
339
+ } else {
340
+ print("Tuya: Reset Default Settings failed with message: \(message)")
341
+ }
342
+ }
343
+ } else {
344
+ print("Tuya: ID is nil, cannot reset default settings.")
345
+ }
346
+ }
347
+
348
+ private func enableDefaultSettings(onSuccess: @escaping () -> Void, onFailure: @escaping () -> Void) {
349
+
350
+ if Tuya.shared.isAosu {
351
+ handleMotionDetection(
352
+ switchKey: ThingSmartCameraDPKey.motionDetectDPName,
353
+ sensitivityKey: ThingSmartCameraDPKey.basicPIRDPName,
354
+ sensitivityValue: "1",
355
+ onSuccess: {
356
+ self.isRecordingModeUpdated = true
357
+ onSuccess()
358
+ },
359
+ onFailure: {
360
+ onFailure()
361
+ }
362
+ )
363
+ } else if !Tuya.shared.is8s {
364
+ handleMotionDetection(
365
+ switchKey: ThingSmartCameraDPKey.init(rawValue: "240"),
366
+ sensitivityKey: ThingSmartCameraDPKey.init(rawValue: "241"),
367
+ sensitivityValue: 1,
368
+ onSuccess: {
369
+ self.isRecordingModeUpdated = true
370
+ onSuccess()
371
+ },
372
+ onFailure: {
373
+ onFailure()
374
+ }
375
+ )
376
+ } else {
377
+ handleMotionDetection(
378
+ switchKey: ThingSmartCameraDPKey.motionDetectDPName,
379
+ sensitivityKey: ThingSmartCameraDPKey.motionSensitivityDPName,
380
+ sensitivityValue: "0",
381
+ onSuccess: {
382
+ self.handleRecordingMode(onSuccess: onSuccess, onFailure: onFailure)
383
+ },
384
+ onFailure: {
385
+ onFailure()
386
+ }
387
+ )
388
+ }
389
+ }
390
+
391
+ private func handleMotionDetection(
392
+ switchKey: ThingSmartCameraDPKey,
393
+ sensitivityKey: ThingSmartCameraDPKey,
394
+ sensitivityValue: Any,
395
+ onSuccess: @escaping () -> Void,
396
+ onFailure: @escaping () -> Void
397
+ ) {
398
+ SettingsManager.shared.setDPValue(
399
+ dpKey: switchKey,
400
+ value: Tuya.shared.motionDetection,
401
+ onSuccess: {
402
+ self.isMotionDetectionUpdated = true
403
+ onSuccess()
404
+ },
405
+ onFailure: {
406
+ onFailure()
407
+ }
408
+ )
409
+
410
+ if Tuya.shared.setSensitivityLow && !isMotionSensitivityUpdated {
411
+ SettingsManager.shared.setDPValue(
412
+ dpKey: sensitivityKey,
413
+ value: sensitivityValue,
414
+ onSuccess: { [weak self] in
415
+ DispatchQueue.main.async {
416
+ guard let self = self else { return }
417
+ if Tuya.shared.isAosu {
418
+ Tuya.shared.basicPIRSensitivityLevel = "1"
419
+ } else if !Tuya.shared.is8s {
420
+ Tuya.shared.pirSensitivityLevel = 1
421
+ } else {
422
+ Tuya.shared.motionSensitivityLevel = "0"
423
+ }
424
+ self.isMotionSensitivityUpdated = true
425
+ }
426
+ },
427
+ onFailure: {
428
+ onFailure()
429
+ }
430
+ )
431
+ } else {
432
+ isMotionSensitivityUpdated = true
433
+ }
434
+ }
435
+
436
+ private func handleRecordingMode(onSuccess: @escaping () -> Void, onFailure: @escaping () -> Void) {
437
+ if Tuya.shared.continuousRecording || Tuya.shared.eventRecording {
438
+
439
+ SettingsManager.shared.setDPValue(
440
+ dpKey: ThingSmartCameraDPKey.sdCardRecordDPName,
441
+ value: true,
442
+ onSuccess: { [weak self] in
443
+ guard let self = self else { return }
444
+ let mode = Tuya.shared.continuousRecording ? "2" : Tuya.shared.eventRecording ? "1" : nil
445
+
446
+ if let mode = mode {
447
+ SettingsManager.shared.setDPValue(
448
+ dpKey: ThingSmartCameraDPKey.recordModeDPName,
449
+ value: mode,
450
+ onSuccess: {
451
+ DispatchQueue.main.async {
452
+ Tuya.shared.sdCardRecordingType = mode
453
+ self.isRecordingModeUpdated = true
454
+ onSuccess()
455
+ }
456
+ },
457
+ onFailure: {
458
+ onFailure()
459
+ }
460
+ )
461
+ } else {
462
+ self.isRecordingModeUpdated = true
463
+ onSuccess()
464
+ }
465
+ },
466
+ onFailure: {
467
+ onFailure()
468
+ }
469
+ )
470
+ } else {
471
+ self.isRecordingModeUpdated = true
472
+ onSuccess()
473
+ }
474
+ }
475
+ }