@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,503 @@
1
+ package com.rentlytuya
2
+
3
+ import android.content.Intent
4
+ import android.util.Log
5
+ import com.alibaba.fastjson.JSON
6
+ import com.facebook.react.bridge.Arguments
7
+ import com.facebook.react.bridge.Promise
8
+ import com.facebook.react.bridge.ReactApplicationContext
9
+ import com.facebook.react.bridge.ReactContextBaseJavaModule
10
+ import com.facebook.react.bridge.ReactMethod
11
+ import com.facebook.react.bridge.ReadableMap
12
+ import com.rentlytuya.tuya.Settings
13
+ import com.rentlytuya.tuya.Settings.createJsonPayload
14
+ import com.rentlytuya.tuya.Tuya
15
+ import com.rentlytuya.tuya.Tuya.iTuyaDevice
16
+ import com.rentlytuya.ui.theme.LocalColor
17
+ import com.rentlytuya.util.Airbrake
18
+ import com.rentlytuya.util.DPConstants
19
+ import com.rentlytuya.util.DateUtil.isNull
20
+ import com.rentlytuya.util.ReactUtils
21
+ import com.rentlytuya.util.checkParams
22
+ import com.thingclips.smart.android.common.utils.WiFiUtil
23
+ import com.thingclips.smart.android.user.api.ILogoutCallback
24
+ import com.thingclips.smart.home.sdk.ThingHomeSdk
25
+ import com.thingclips.smart.home.sdk.bean.HomeBean
26
+ import com.thingclips.smart.home.sdk.builder.ThingCameraActivatorBuilder
27
+ import com.thingclips.smart.home.sdk.callback.IThingHomeResultCallback
28
+ import com.thingclips.smart.sdk.api.IResultCallback
29
+ import com.thingclips.smart.sdk.api.IThingActivatorGetToken
30
+ import com.thingclips.smart.sdk.api.IThingSmartCameraActivatorListener
31
+ import com.thingclips.smart.sdk.bean.DeviceBean
32
+ import kotlinx.coroutines.CoroutineExceptionHandler
33
+ import kotlinx.coroutines.CoroutineScope
34
+ import kotlinx.coroutines.Dispatchers
35
+ import kotlinx.coroutines.SupervisorJob
36
+ import kotlinx.coroutines.launch
37
+ import kotlinx.coroutines.withTimeoutOrNull
38
+
39
+ class RentlyTuyaModule(private val reactContext: ReactApplicationContext) :
40
+ ReactContextBaseJavaModule(reactContext) {
41
+
42
+ override fun getName(): String {
43
+ return NAME
44
+ }
45
+
46
+ private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
47
+
48
+ @ReactMethod
49
+ fun initAirbrake(params: ReadableMap, promise: Promise) {
50
+ if (!params.checkParams("key", "id")) {
51
+ promise.reject("false", "invalid_params")
52
+ return
53
+ }
54
+
55
+ val airbrakeKey = params.getString("key")!!
56
+ val airbrakeID = params.getString("id")!!
57
+
58
+ Airbrake.initialize(
59
+ airbrakeKey = airbrakeKey,
60
+ airbrakeID = airbrakeID,
61
+ context = reactApplicationContext
62
+ )
63
+ }
64
+
65
+ @ReactMethod
66
+ fun openCameraLivePreview(params: ReadableMap, promise: Promise) {
67
+ if (!params.checkParams("uid", "passwd", "countryCode", "devId", "homeId", "id", "flavour")) {
68
+ promise.reject("false", "invalid_params")
69
+ return
70
+ }
71
+
72
+ val exceptionHandler =
73
+ CoroutineExceptionHandler { _, e ->
74
+ Log.i(TAG, "Error in openCameraLivePreview: ${e.message}")
75
+ promise.reject("false", e)
76
+ }
77
+
78
+ scope.launch(exceptionHandler) {
79
+ Tuya.lastMoveOutDate =
80
+ if (params.hasKey("last_moveout_at")) params.getString("last_moveout_at") else null
81
+ Tuya.resetRequired =
82
+ if (params.hasKey("resetRequired")) params.getBoolean("resetRequired") else null
83
+ Tuya.isResident = if (params.hasKey("isResident")) params.getBoolean("isResident") else true
84
+ Tuya.displayRemoveDoorbellButton =
85
+ if (params.hasKey("display_remove_doorbell_button")) params.getBoolean("display_remove_doorbell_button") else null
86
+ Tuya.tuyaProductName =
87
+ if (params.hasKey("tuya_product_name")) params.getString("tuya_product_name") else null
88
+ Tuya.tuyaProductID =
89
+ if (params.hasKey("product_id")) params.getString("product_id") else null
90
+ Tuya.uuid = if (params.hasKey("device_uuid")) params.getString("device_uuid") else null
91
+ Tuya.serialNumber = if (params.hasKey("serial_no")) params.getString("serial_no") else null
92
+ Tuya.id = if (params.hasKey("id")) params.getString("id") else null
93
+ Tuya.isDefaultSettingsUpdated =
94
+ if (params.hasKey("doorbell_default_settings_updated")) params.getBoolean("doorbell_default_settings_updated") else false
95
+ Tuya.motionDetection =
96
+ if (params.hasKey("motion_detection")) params.getBoolean("motion_detection") else false
97
+ Tuya.continuousRecording =
98
+ if (params.hasKey("continuous_recording")) params.getBoolean("continuous_recording") else false
99
+ Tuya.eventRecording =
100
+ if (params.hasKey("event_recording")) params.getBoolean("event_recording") else false
101
+ Tuya.setSensitivityLow =
102
+ if (params.hasKey("set_sensitivity_low")) params.getBoolean("set_sensitivity_low") else false
103
+
104
+ // If both event and continuous recording are false, set event recording to true - NB: Only for 8s Doorbell
105
+ if (!Tuya.eventRecording && !Tuya.continuousRecording) {
106
+ Tuya.eventRecording = true
107
+ }
108
+
109
+ val username = params.getString("propertyCredentialUsername") ?: params.getString("uid")!!
110
+ val password = params.getString("propertyCredentialPassword") ?: params.getString("passwd")!!
111
+
112
+ val deviceId = params.getString("devId")!!
113
+ val homeId = params.getString("homeId")!!.toLong()
114
+ val countryCode = params.getString("countryCode")!!
115
+ val flavour = params.getString("flavour")!!
116
+
117
+ val success = Tuya.loginAndSetDevice(
118
+ deviceId = deviceId,
119
+ homeId = homeId,
120
+ password = password,
121
+ username = username,
122
+ countryCode = countryCode
123
+ )
124
+
125
+ if (success) {
126
+ LocalColor.setTheme(flavour)
127
+ val intent = Intent(reactContext, TuyaActivity::class.java)
128
+
129
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
130
+ reactContext.startActivity(intent)
131
+ promise.resolve(true)
132
+ } else {
133
+ promise.resolve(false)
134
+ }
135
+ }
136
+ }
137
+
138
+ @ReactMethod
139
+ fun loginWithUid(params: ReadableMap, promise: Promise) {
140
+ if (!params.checkParams("uid", "password", "countryCode")) {
141
+ promise.reject("false", "Invalid params")
142
+ return
143
+ }
144
+
145
+ val exceptionHandler =
146
+ CoroutineExceptionHandler { _, e ->
147
+ Log.i(TAG, "Error in loginWithUid: ${e.message}")
148
+ promise.reject("false", e)
149
+ }
150
+
151
+ scope.launch(exceptionHandler) {
152
+ val uid = params.getString("uid")!!
153
+ val password = params.getString("password")!!
154
+ val countryCode = params.getString("countryCode")!!
155
+
156
+ val success = Tuya.login(
157
+ uid = uid,
158
+ password = password,
159
+ countryCode = countryCode
160
+ )
161
+ promise.resolve(success)
162
+ }
163
+ }
164
+
165
+ @ReactMethod
166
+ fun getTokenForQRCode(params: ReadableMap, promise: Promise) {
167
+ if (!params.checkParams("homeId")) {
168
+ promise.reject("false", "Invalid params")
169
+ return
170
+ }
171
+
172
+ val exceptionHandler =
173
+ CoroutineExceptionHandler { _, e ->
174
+ Log.i(TAG, "Get Token Failure: ${e.message}")
175
+ promise.reject("false", e.message)
176
+ }
177
+
178
+ scope.launch(exceptionHandler) {
179
+ val homeId = params.getString("homeId")!!.toLong()
180
+
181
+ ThingHomeSdk.getActivatorInstance().getActivatorToken(
182
+ homeId,
183
+ object : IThingActivatorGetToken {
184
+ override fun onSuccess(s: String) {
185
+ Log.i(TAG, "Get Token success: $s")
186
+ promise.resolve(s)
187
+ }
188
+
189
+ override fun onFailure(code: String, message: String) {
190
+ Log.i(TAG, "Get Token Failure: $code $message")
191
+ promise.reject(code, message)
192
+ }
193
+ }
194
+ )
195
+ }
196
+ }
197
+
198
+ @ReactMethod
199
+ fun getCurrentWifi(promise: Promise) {
200
+ try {
201
+ val ssid = WiFiUtil.getCurrentSSID(reactApplicationContext.applicationContext).orEmpty()
202
+ Log.i(TAG, "Current SSID: $ssid")
203
+ promise.resolve(if (ssid == "<unknown ssid>" || ssid.isEmpty()) "" else ssid)
204
+ } catch (e: Exception) {
205
+ promise.resolve("")
206
+ }
207
+ }
208
+
209
+ @ReactMethod
210
+ fun logout(promise: Promise) {
211
+ val exceptionHandler =
212
+ CoroutineExceptionHandler { _, e ->
213
+ Log.i(TAG, "Logout Failure: ${e.message}")
214
+ promise.reject("false", e.message)
215
+ }
216
+
217
+ scope.launch(exceptionHandler) {
218
+ ThingHomeSdk.getUserInstance().logout(object : ILogoutCallback {
219
+ override fun onSuccess() {
220
+ Log.i(TAG, "Logout Success")
221
+ promise.resolve(true)
222
+ }
223
+
224
+ override fun onError(code: String?, error: String?) {
225
+ Log.i(TAG, "Logout Failure: Code $code, Error: $error")
226
+ promise.reject(code, error)
227
+ }
228
+ })
229
+ }
230
+ }
231
+
232
+ @ReactMethod
233
+ fun registerForPushNotification(params: ReadableMap, promise: Promise) {
234
+ if (!params.checkParams("token")) {
235
+ promise.reject("false", "Invalid params")
236
+ return
237
+ }
238
+
239
+ val exceptionHandler =
240
+ CoroutineExceptionHandler { _, e ->
241
+ Log.i(TAG, "Error registering push notification: ${e.message}")
242
+ promise.reject("false", e.message)
243
+ }
244
+
245
+ scope.launch(exceptionHandler) {
246
+ val token = params.getString("token")
247
+
248
+ ThingHomeSdk.getPushInstance()
249
+ .registerDevice(token, "FCM", object : IResultCallback {
250
+ override fun onSuccess() {
251
+ Log.i(TAG, "Push notification: registration success")
252
+ promise.resolve(true)
253
+ }
254
+
255
+ override fun onError(code: String, message: String) {
256
+ Log.i(TAG, "Error registering push notification: Code: $code, Error: $message")
257
+ promise.resolve(false)
258
+ }
259
+ })
260
+ }
261
+ }
262
+
263
+ @ReactMethod
264
+ fun renameDevice(params: ReadableMap, promise: Promise) {
265
+ if (!params.checkParams("devId", "name")) {
266
+ promise.reject("false", "Invalid params")
267
+ return
268
+ }
269
+
270
+ val exceptionHandler =
271
+ CoroutineExceptionHandler { _, e ->
272
+ Log.i(TAG, "Error renaming device: ${e.message}")
273
+ promise.reject("false", e.message)
274
+ }
275
+
276
+ scope.launch(exceptionHandler) {
277
+ ThingHomeSdk.newDeviceInstance(params.getString("devId"))
278
+ .renameDevice(params.getString("name"), object : IResultCallback {
279
+ override fun onSuccess() {
280
+ Log.i(TAG, "Rename Success")
281
+ promise.resolve("success")
282
+ }
283
+
284
+ override fun onError(code: String?, message: String?) {
285
+ Log.i(TAG, "Error renaming device: Code: $code, Error: $message")
286
+ promise.reject(code, message)
287
+ }
288
+ })
289
+ }
290
+ }
291
+
292
+ @ReactMethod
293
+ fun resetDevice(params: ReadableMap, promise: Promise) {
294
+ if (!params.checkParams("devId", "homeId", "username", "password", "countryCode")) {
295
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
296
+ return
297
+ }
298
+
299
+ val exceptionHandler =
300
+ CoroutineExceptionHandler { _, e ->
301
+ Log.i(TAG, "Error in Reset Device: ${e.message}")
302
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
303
+ }
304
+
305
+ scope.launch(exceptionHandler) {
306
+ val deviceId = params.getString("devId")
307
+ val homeId = params.getString("homeId")!!
308
+ val username = params.getString("username")!!
309
+ val password = params.getString("password")!!
310
+ val countryCode = params.getString("countryCode")!!
311
+
312
+ val success = Tuya.loginAndSetDevice(
313
+ deviceId = deviceId!!,
314
+ homeId = homeId.toLong(),
315
+ username = username,
316
+ password = password,
317
+ countryCode = countryCode
318
+ )
319
+
320
+ if (!success) {
321
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
322
+ return@launch
323
+ }
324
+
325
+ if (iTuyaDevice.isNull()) {
326
+ // TODO:: Need to refactor (Change this to reject and handle in react native)
327
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
328
+ return@launch
329
+ }
330
+
331
+ val result = withTimeoutOrNull(10000) {
332
+ // Step 1: Set Chime type to Mechanical
333
+ iTuyaDevice!!.publishDps(
334
+ createJsonPayload(DPConstants.CHIME_TYPE, "1"),
335
+ object : IResultCallback {
336
+ override fun onError(code: String, error: String?) {
337
+ Log.i(TAG, "Error in 'chime': Code=$code, Error=$error")
338
+ }
339
+
340
+ override fun onSuccess() {
341
+ Log.i(TAG, "Step 'chime' reset successfully")
342
+ }
343
+ })
344
+
345
+ // Step 2: Set SD Card Mode to Event Recording
346
+ val isSDCardModeSupported =
347
+ Settings.isDPSupported(deviceId = deviceId, dpId = DPConstants.SD_RECORD_MODE)
348
+ val isSDStatusSupported =
349
+ Settings.isDPSupported(deviceId = deviceId, dpId = DPConstants.SD_STATUS)
350
+
351
+ if (isSDStatusSupported) {
352
+ if (isSDCardModeSupported) {
353
+ iTuyaDevice!!.publishDps(
354
+ createJsonPayload(DPConstants.SD_RECORD_MODE, "1"),
355
+ object : IResultCallback {
356
+ override fun onError(code: String, error: String?) {
357
+ Log.i(
358
+ TAG,
359
+ "Error in 'SD Card Record Mode': Code=$code, Error=$error"
360
+ )
361
+ }
362
+
363
+ override fun onSuccess() {
364
+ Log.i(TAG, "Step 'SD Card Record Mode' reset successfully")
365
+ }
366
+ })
367
+ } else {
368
+ Log.i(TAG, "Reset Failed due to SD Card Mode not supported")
369
+ }
370
+
371
+ // Step 3: Format SD Card
372
+ val sdCardStatus =
373
+ Settings.queryValueByDPID(deviceId = deviceId, dpId = DPConstants.SD_STATUS)
374
+ if (sdCardStatus != null && sdCardStatus != 5) {
375
+ iTuyaDevice!!.publishDps(
376
+ createJsonPayload(DPConstants.SD_FORMAT, true),
377
+ object : IResultCallback {
378
+ override fun onError(code: String, error: String?) {
379
+ Log.i(
380
+ TAG,
381
+ "Error in 'SD Card Format': Code=$code, Error=$error"
382
+ )
383
+ }
384
+
385
+ override fun onSuccess() {
386
+ Log.i(TAG, "Step 'SD Card Format' successful")
387
+ }
388
+ })
389
+ } else {
390
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
391
+ }
392
+ } else {
393
+ Log.i(TAG, "Reset Failed due to SD Card status not supported")
394
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
395
+ }
396
+ }
397
+
398
+ if (result == null) {
399
+ Log.i(TAG, "Timeout occurred while resetting the device")
400
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
401
+ } else {
402
+ promise.resolve(Arguments.createMap().apply { putString("success", "true") })
403
+ }
404
+ }
405
+ }
406
+
407
+ @ReactMethod
408
+ fun initActivatorForQRCode(params: ReadableMap, promise: Promise) {
409
+ if (!params.checkParams("ssid", "password", "time", "token")) {
410
+ promise.reject("false", "Invalid params")
411
+ return
412
+ }
413
+
414
+ val cameraActivator = ThingHomeSdk.getActivatorInstance().newCameraDevActivator(
415
+ ThingCameraActivatorBuilder()
416
+ .setSsid(params.getString("ssid"))
417
+ .setContext(reactApplicationContext.applicationContext)
418
+ .setPassword(params.getString("password"))
419
+ .setTimeOut(params.getInt("time").toLong())
420
+ .setToken(params.getString("token"))
421
+ .setListener(object : IThingSmartCameraActivatorListener {
422
+ override fun onQRCodeSuccess(qrCodeUrl: String?) {
423
+ Log.i(TAG, "QR Code Success: $qrCodeUrl")
424
+ }
425
+
426
+ override fun onError(errorCode: String?, errorMsg: String?) {
427
+ Log.i(TAG, "Error in QR Code Activation: Code: $errorCode, Message: $errorMsg")
428
+ if (errorCode == "1006" && errorMsg.equals("time out", true)) {
429
+ promise.resolve(Arguments.createMap().apply { putString("is_timeout", "true") })
430
+ } else {
431
+ promise.reject(errorCode, errorMsg)
432
+ }
433
+ }
434
+
435
+ override fun onActiveSuccess(device: DeviceBean?) {
436
+ Log.i(TAG, "Activation Success: $device")
437
+ promise.resolve(ReactUtils.parseToWritableMap(device))
438
+ }
439
+ })
440
+ )
441
+ cameraActivator?.start() ?: Log.i(TAG, "Camera Activator is null")
442
+ }
443
+
444
+ @ReactMethod
445
+ fun setTuyaHome(params: ReadableMap, promise: Promise) {
446
+ if (!params.checkParams("homeId")) {
447
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
448
+ return
449
+ }
450
+
451
+ val exceptionHandler =
452
+ CoroutineExceptionHandler { _, e ->
453
+ Log.i(TAG, "Error in setTuyaHome: ${e.message}")
454
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
455
+ }
456
+
457
+ scope.launch(exceptionHandler) {
458
+ ThingHomeSdk.newHomeInstance(params.getString("homeId")!!.toLong())
459
+ .getHomeDetail(object : IThingHomeResultCallback {
460
+ override fun onSuccess(bean: HomeBean?) {
461
+ Log.i(TAG, "setTuyaHome success: $bean")
462
+ promise.resolve(Arguments.createMap().apply { putString("success", "true") })
463
+ }
464
+
465
+ override fun onError(errorCode: String?, errorMsg: String?) {
466
+ Log.e(TAG, "Error in setTuyaHome: Code: $errorCode, Message: $errorMsg")
467
+ promise.resolve(Arguments.createMap().apply { putString("success", "false") })
468
+ }
469
+ })
470
+ }
471
+ }
472
+
473
+ @ReactMethod
474
+ fun getDeviceData(params: ReadableMap, promise: Promise) {
475
+ if (!params.checkParams("devId")) {
476
+ promise.reject("false", "Invalid params")
477
+ return
478
+ }
479
+
480
+ val exceptionHandler =
481
+ CoroutineExceptionHandler { _, e ->
482
+ Log.i(TAG, "Error in getDeviceData: ${e.message}")
483
+ promise.reject("false", e.message)
484
+ }
485
+
486
+ scope.launch(exceptionHandler) {
487
+ val deviceId = params.getString("devId")
488
+ val deviceData = ThingHomeSdk.getDataInstance().getDeviceBean(deviceId)
489
+
490
+ if (deviceData != null) {
491
+ val json = JSON.toJSONString(deviceData)
492
+ promise.resolve(json)
493
+ } else {
494
+ promise.reject("device_not_found", "Device not found for devId: $deviceId")
495
+ }
496
+ }
497
+ }
498
+
499
+ companion object {
500
+ const val NAME = "RentlyTuya"
501
+ const val TAG = "RentlyTuya"
502
+ }
503
+ }
@@ -0,0 +1,18 @@
1
+ package com.rentlytuya
2
+
3
+ import com.facebook.react.ReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.uimanager.ViewManager
7
+ import com.rentlytuya.util.KeylessModule
8
+
9
+
10
+ class RentlyTuyaPackage : ReactPackage {
11
+ override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
12
+ return listOf(RentlyTuyaModule(reactContext), KeylessModule(reactContext))
13
+ }
14
+
15
+ override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
16
+ return emptyList()
17
+ }
18
+ }
@@ -0,0 +1,45 @@
1
+ package com.rentlytuya
2
+
3
+ import android.os.Bundle
4
+ import androidx.activity.ComponentActivity
5
+ import androidx.activity.compose.setContent
6
+ import androidx.lifecycle.lifecycleScope
7
+ import androidx.navigation.NavHostController
8
+ import androidx.navigation.compose.rememberNavController
9
+ import com.rentlytuya.dashboard.NavController
10
+ import com.rentlytuya.tuya.Tuya
11
+ import com.rentlytuya.ui.theme.TuyaTheme
12
+ import kotlinx.coroutines.launch
13
+
14
+ class TuyaActivity : ComponentActivity() {
15
+
16
+ private var navController: NavHostController? = null
17
+
18
+ override fun onCreate(savedInstanceState: Bundle?) {
19
+ super.onCreate(savedInstanceState)
20
+
21
+ setContent {
22
+ navController = rememberNavController()
23
+
24
+ TuyaTheme {
25
+ navController?.let { NavController(navController = it) }
26
+ }
27
+ }
28
+ }
29
+
30
+ override fun onStop() {
31
+ super.onStop()
32
+ if (navController?.currentDestination?.route != "Playback") {
33
+ lifecycleScope.launch {
34
+ Tuya.disconnect()
35
+ }
36
+ }
37
+ }
38
+
39
+ override fun onDestroy() {
40
+ super.onDestroy()
41
+ lifecycleScope.launch {
42
+ Tuya.disconnect()
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,83 @@
1
+ package com.rentlytuya.alerts
2
+
3
+ import androidx.compose.foundation.layout.Arrangement
4
+ import androidx.compose.foundation.layout.Row
5
+ import androidx.compose.foundation.layout.fillMaxWidth
6
+ import androidx.compose.foundation.layout.padding
7
+ import androidx.compose.runtime.Composable
8
+ import androidx.compose.ui.Modifier
9
+ import androidx.compose.ui.unit.dp
10
+ import androidx.compose.ui.unit.sp
11
+ import com.rentlytuya.R
12
+ import com.rentlytuya.components.Alert
13
+ import com.rentlytuya.components.AnchorButton
14
+ import com.rentlytuya.components.Label
15
+ import com.rentlytuya.util.Util.strings
16
+
17
+ @Composable
18
+ fun FormatSDCardAlert(
19
+ isFormatSDCardVisible: Boolean,
20
+ onDismiss: () -> Unit,
21
+ onFormat: () -> Unit
22
+ ) {
23
+
24
+ Alert(
25
+ modifier = Modifier
26
+ .padding(top = 20.dp, start = 20.dp, end = 15.dp),
27
+ isVisible = isFormatSDCardVisible,
28
+ onDismiss = onDismiss
29
+ ) {
30
+
31
+ Label(
32
+ modifier = Modifier
33
+ .padding(bottom = 5.dp),
34
+ title = strings(id = R.string.formatSDCard),
35
+ bold = true,
36
+ xl20 = true,
37
+ black = true
38
+ )
39
+
40
+ Label(
41
+ modifier = Modifier
42
+ .padding(vertical = 5.dp),
43
+ title = strings(id = R.string.formatSDCardDescription),
44
+ medium = true,
45
+ l = true,
46
+ black = true,
47
+ maxLines = 6,
48
+ lineHeight = 18.sp
49
+ )
50
+
51
+ Row(
52
+ modifier = Modifier
53
+ .fillMaxWidth()
54
+ .padding(bottom = 5.dp),
55
+ horizontalArrangement = Arrangement.End
56
+ ) {
57
+ AnchorButton(
58
+ modifier = Modifier,
59
+ id = "FormatSDCard_No",
60
+ title = strings(id = R.string.no),
61
+ semiBold = true,
62
+ black = true,
63
+ m = true,
64
+ onClick = {
65
+ onDismiss()
66
+ }
67
+ )
68
+
69
+ AnchorButton(
70
+ modifier = Modifier,
71
+ id = "FormatSDCard_Yes",
72
+ title = strings(id = R.string.yes),
73
+ semiBold = true,
74
+ black = true,
75
+ m = true,
76
+ onClick = {
77
+ onFormat()
78
+ }
79
+ )
80
+ }
81
+ }
82
+ }
83
+