@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,497 @@
1
+ package com.rentlytuya.tuya
2
+
3
+ import android.Manifest
4
+ import android.app.Activity
5
+ import android.content.Context
6
+ import android.util.Log
7
+ import com.rentlytuya.util.Airbrake
8
+ import com.rentlytuya.util.DateUtil.isNotNull
9
+ import com.rentlytuya.util.DateUtil.isTrue
10
+ import com.rentlytuya.util.PermissionHandler
11
+ import com.thingclips.smart.android.camera.sdk.ThingIPCSdk
12
+ import com.thingclips.smart.android.camera.sdk.api.IThingIPCDpHelper
13
+ import com.thingclips.smart.android.user.api.ILoginCallback
14
+ import com.thingclips.smart.android.user.bean.User
15
+ import com.thingclips.smart.camera.camerasdk.thingplayer.callback.OperationDelegateCallBack
16
+ import com.thingclips.smart.camera.middleware.p2p.IThingSmartCameraP2P
17
+ import com.thingclips.smart.home.sdk.ThingHomeSdk
18
+ import com.thingclips.smart.home.sdk.bean.HomeBean
19
+ import com.thingclips.smart.home.sdk.callback.IThingHomeResultCallback
20
+ import com.thingclips.smart.sdk.api.IThingDevice
21
+ import kotlinx.coroutines.CoroutineScope
22
+ import kotlinx.coroutines.Dispatchers
23
+ import kotlinx.coroutines.SupervisorJob
24
+ import kotlinx.coroutines.launch
25
+ import kotlinx.coroutines.suspendCancellableCoroutine
26
+ import kotlinx.coroutines.withTimeoutOrNull
27
+ import kotlin.coroutines.resume
28
+
29
+ object Tuya {
30
+
31
+ var deviceId: String? = null
32
+ var mCameraP2P: IThingSmartCameraP2P<Any>? = null
33
+ var iTuyaDevice: IThingDevice? = null
34
+ var p2pType: Int? = null
35
+ var ipcDpHelper: IThingIPCDpHelper? = null
36
+
37
+ const val TAG = "RentlyTuya"
38
+ private const val TIME_OUT = 8000L
39
+
40
+ // Smart Home values
41
+ var id: String? = null
42
+ var uuid: String? = null
43
+ var serialNumber: String? = null
44
+ var tuyaProductName: String? = null
45
+ var tuyaProductID: String? = null
46
+ var lastMoveOutDate: String? = null
47
+ var resetRequired: Boolean? = null
48
+ var isResident: Boolean = true
49
+ var displayRemoveDoorbellButton: Boolean? = null
50
+
51
+ // Default Settings values
52
+ var isDefaultSettingsUpdated: Boolean = false
53
+ var motionDetection: Boolean = false
54
+ var continuousRecording: Boolean = false
55
+ var eventRecording: Boolean = false
56
+ var setSensitivityLow: Boolean = false
57
+
58
+ val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
59
+
60
+ suspend fun login(
61
+ uid: String,
62
+ password: String,
63
+ countryCode: String,
64
+ ): Boolean {
65
+ val success: Boolean? = withTimeoutOrNull(TIME_OUT) {
66
+ suspendCancellableCoroutine { continuation ->
67
+ ThingHomeSdk.getUserInstance()
68
+ .loginWithUid(
69
+ countryCode,
70
+ uid,
71
+ password,
72
+ object : ILoginCallback {
73
+ override fun onSuccess(user: User?) {
74
+ Log.i(TAG, "Login Successful, User Info: $user")
75
+ continuation.resume(true)
76
+ }
77
+
78
+ override fun onError(code: String?, error: String?) {
79
+ Log.i(TAG, "Login Failed, Error: $code $error")
80
+ Airbrake.logMessage(
81
+ title = "Login Failed",
82
+ message = "Error Code: $code",
83
+ additionalInfo = mapOf(
84
+ "error" to error.toString(),
85
+ "uid" to uid,
86
+ "password" to password, // TODO:: Check whether it is ok to log
87
+ "countryCode" to countryCode
88
+ )
89
+ )
90
+ continuation.resume(false)
91
+ }
92
+ })
93
+ }
94
+ }
95
+
96
+ return success.isTrue()
97
+ }
98
+
99
+ suspend fun loginAndSetDevice(
100
+ deviceId: String,
101
+ homeId: Long,
102
+ username: String,
103
+ password: String,
104
+ countryCode: String
105
+ ): Boolean {
106
+ this.deviceId = deviceId
107
+ val success: Boolean? = withTimeoutOrNull(TIME_OUT) {
108
+ suspendCancellableCoroutine { continuation ->
109
+ ThingHomeSdk.getUserInstance()
110
+ .loginWithUid(
111
+ countryCode,
112
+ username,
113
+ password,
114
+ object : ILoginCallback {
115
+ override fun onSuccess(user: User?) {
116
+ Log.i(TAG, "Login Successful for property, User Info: $user")
117
+
118
+ ThingHomeSdk.newHomeInstance(homeId)
119
+ .getHomeDetail(object : IThingHomeResultCallback {
120
+ override fun onSuccess(bean: HomeBean) {
121
+ Log.i(TAG, "Get Home Data success: $bean")
122
+
123
+ val cameraInstance = ThingIPCSdk.getCameraInstance()
124
+ if (cameraInstance.isNotNull()) {
125
+ mCameraP2P = cameraInstance.createCameraP2P(deviceId)
126
+ p2pType = cameraInstance.getP2PType(deviceId)
127
+ iTuyaDevice = ThingHomeSdk.newDeviceInstance(deviceId)
128
+ ipcDpHelper = ThingIPCSdk.createIPCDpHelper(deviceId)
129
+ } else {
130
+ continuation.resume(false)
131
+ return
132
+ }
133
+
134
+ continuation.resume(true)
135
+ }
136
+
137
+ override fun onError(errorCode: String, errorMsg: String) {
138
+ Airbrake.logMessage(
139
+ title = "Get Home Data Failed",
140
+ message = "Error Code: $errorCode",
141
+ additionalInfo = mapOf(
142
+ "error" to errorMsg,
143
+ "deviceID" to deviceId,
144
+ "homeID" to homeId.toString(),
145
+ "username" to username,
146
+ "password" to password,
147
+ "countryCode" to countryCode
148
+ )
149
+ )
150
+ continuation.resume(false)
151
+ }
152
+ })
153
+ }
154
+
155
+ override fun onError(code: String?, error: String?) {
156
+ Airbrake.logMessage(
157
+ title = "Property Login Failed",
158
+ message = "Error Code: $code",
159
+ additionalInfo = mapOf(
160
+ "error" to error.toString(),
161
+ "deviceID" to deviceId,
162
+ "homeID" to homeId.toString(),
163
+ "username" to username,
164
+ "password" to password,
165
+ "countryCode" to countryCode
166
+ )
167
+ )
168
+ continuation.resume(false)
169
+ }
170
+ })
171
+ }
172
+ }
173
+
174
+ return success.isTrue()
175
+ }
176
+
177
+ private fun wakeDevice(deviceId: String) {
178
+ try {
179
+ val doorbell = ThingIPCSdk.getDoorbell()
180
+ doorbell?.wirelessWake(deviceId)
181
+ Log.i(TAG, "Wake device success")
182
+ } catch (e: Exception) {
183
+ Airbrake.logMessage(
184
+ title = "Wake Doorbell Failed",
185
+ message = "Error: ${e.message}"
186
+ )
187
+ }
188
+ }
189
+
190
+ fun connectAndStartPreview(
191
+ setOnline: (value: Boolean) -> Unit,
192
+ setMute: (value: Boolean) -> Unit,
193
+ setLoading: (value: Boolean) -> Unit
194
+ ) {
195
+ setLoading(true)
196
+ if (mCameraP2P.isNotNull() && deviceId.isNotNull()) {
197
+ deviceId?.let { wakeDevice(it) }
198
+ mCameraP2P?.connect(deviceId, object : OperationDelegateCallBack {
199
+ override fun onSuccess(sessionId: Int, requestId: Int, data: String) {
200
+ Log.i(TAG, "Connection Successful, $sessionId, RequestId: $requestId, Data: $data")
201
+ setOnline(true)
202
+
203
+ scope.launch {
204
+ preview(
205
+ setOnline = setOnline,
206
+ setMute = setMute,
207
+ setLoading = setLoading
208
+ )
209
+ }
210
+ }
211
+
212
+ override fun onFailure(sessionId: Int, requestId: Int, errCode: Int) {
213
+ setLoading(false)
214
+ setOnline(false)
215
+ Airbrake.logMessage(
216
+ title = "Connection Failed",
217
+ message = "Error Code: $errCode",
218
+ additionalInfo = mapOf(
219
+ "sessionId" to sessionId.toString(),
220
+ "requestId" to requestId.toString()
221
+ )
222
+ )
223
+ }
224
+ })
225
+ } else {
226
+ setLoading(false)
227
+ setOnline(false)
228
+ Log.i(TAG, "mCameraP2P or deviceId is null - Device ID: $deviceId, mCameraP2P: $mCameraP2P")
229
+ }
230
+ }
231
+
232
+ fun getDeviceName(
233
+ setDeviceName: (value: String) -> Unit
234
+ ) {
235
+ ThingHomeSdk.getDataInstance().getDeviceBean(deviceId)?.getName()?.let { setDeviceName(it) }
236
+ }
237
+
238
+ private suspend fun preview(
239
+ setOnline: (value: Boolean) -> Unit,
240
+ setMute: (value: Boolean) -> Unit,
241
+ setLoading: (value: Boolean) -> Unit
242
+ ): Boolean {
243
+ val success: Boolean? = withTimeoutOrNull(TIME_OUT) {
244
+ suspendCancellableCoroutine { continuation ->
245
+ if (mCameraP2P.isNotNull()) {
246
+ mCameraP2P?.startPreview(object : OperationDelegateCallBack {
247
+ override fun onSuccess(sessionId: Int, requestId: Int, data: String) {
248
+ Log.i(
249
+ TAG,
250
+ "Start preview success, SessionId: $sessionId, RequestId: $requestId, Data: $data"
251
+ )
252
+ setLoading(false)
253
+ setMute(0, setMute)
254
+ continuation.resume(true)
255
+ }
256
+
257
+ override fun onFailure(sessionId: Int, requestId: Int, errCode: Int) {
258
+ setLoading(false)
259
+ setOnline(false)
260
+ Airbrake.logMessage(
261
+ title = "Start Preview Failed",
262
+ message = "Error Code: $errCode",
263
+ additionalInfo = mapOf(
264
+ "sessionId" to sessionId.toString(),
265
+ "requestId" to requestId.toString()
266
+ )
267
+ )
268
+ continuation.resume(false)
269
+ }
270
+ })
271
+ } else {
272
+ continuation.resume(false)
273
+ Log.i(TAG, "mCameraP2P is null, check if the device is initialized")
274
+ }
275
+ }
276
+ }
277
+
278
+ return success.isTrue()
279
+ }
280
+
281
+ suspend fun stopPreview(): Boolean {
282
+ val success: Boolean? = withTimeoutOrNull(TIME_OUT) {
283
+ suspendCancellableCoroutine { continuation ->
284
+ if (mCameraP2P.isNotNull()) {
285
+ mCameraP2P?.stopPreview(object : OperationDelegateCallBack {
286
+ override fun onSuccess(sessionId: Int, requestId: Int, data: String) {
287
+ Log.i(
288
+ TAG,
289
+ "Stop preview success, SessionId: $sessionId, RequestId: $requestId, Data: $data"
290
+ )
291
+ continuation.resume(true)
292
+ }
293
+
294
+ override fun onFailure(sessionId: Int, requestId: Int, errCode: Int) {
295
+ Airbrake.logMessage(
296
+ title = "Stop Preview Failed",
297
+ message = "Error Code: $errCode",
298
+ additionalInfo = mapOf(
299
+ "sessionId" to sessionId.toString(),
300
+ "requestId" to requestId.toString()
301
+ )
302
+ )
303
+ continuation.resume(false)
304
+ }
305
+ })
306
+ } else {
307
+ Log.i(TAG, "mCameraP2P is null, check if the device is initialized")
308
+ }
309
+ }
310
+ }
311
+
312
+ return success.isTrue()
313
+ }
314
+
315
+ suspend fun disconnect(
316
+ setLoading: (value: Boolean) -> Unit = {},
317
+ ): Boolean {
318
+ val success: Boolean? = withTimeoutOrNull(TIME_OUT) {
319
+ suspendCancellableCoroutine { continuation ->
320
+ // Disconnect, you must disconnect when exiting from doorbell.
321
+ setLoading(true)
322
+ if (mCameraP2P.isNotNull()) {
323
+ mCameraP2P?.disconnect(object : OperationDelegateCallBack {
324
+ override fun onSuccess(sessionId: Int, requestId: Int, data: String) {
325
+ Log.i(
326
+ TAG,
327
+ "Disconnect Success, SessionId: $sessionId, RequestId: $requestId, Data: $data"
328
+ )
329
+ setLoading(false)
330
+ continuation.resume(true)
331
+ }
332
+
333
+ override fun onFailure(sessionId: Int, requestId: Int, errCode: Int) {
334
+ setLoading(false)
335
+ Airbrake.logMessage(
336
+ title = "Disconnect Failed",
337
+ message = "Error Code: $errCode",
338
+ additionalInfo = mapOf(
339
+ "sessionId" to sessionId.toString(),
340
+ "requestId" to requestId.toString()
341
+ )
342
+ )
343
+ continuation.resume(false)
344
+ }
345
+ })
346
+ } else {
347
+ Log.i(TAG, "mCameraP2P is null")
348
+ setLoading(false)
349
+ continuation.resume(true)
350
+ }
351
+ }
352
+ }
353
+
354
+ return success.isTrue()
355
+ }
356
+
357
+ fun setMute(
358
+ mute: Int,
359
+ setMute: (value: Boolean) -> Unit,
360
+ ) {
361
+ // 1-Mute, 0-UnMute
362
+ try {
363
+ if (mCameraP2P.isNotNull()) {
364
+ mCameraP2P?.setMute(mute, object : OperationDelegateCallBack {
365
+ override fun onSuccess(sessionId: Int, requestId: Int, data: String) {
366
+ setMute(mute == 1)
367
+ Log.i(TAG, "Set to mute: SessionID: $sessionId, RequestId: $requestId, Data: $data")
368
+ }
369
+
370
+ override fun onFailure(sessionId: Int, requestId: Int, errCode: Int) {
371
+ Airbrake.logMessage(
372
+ title = "Set Mute Failed",
373
+ message = "Error Code: $errCode",
374
+ additionalInfo = mapOf(
375
+ "sessionId" to sessionId.toString(),
376
+ "requestId" to requestId.toString()
377
+ )
378
+ )
379
+ }
380
+ })
381
+ } else {
382
+ Log.i(TAG, "mCameraP2P is null")
383
+ }
384
+ } catch (e: Exception) {
385
+ Log.i(TAG, "Exception in Set Mute $e")
386
+ }
387
+ }
388
+
389
+ fun startVoiceTalk(
390
+ context: Context,
391
+ setMic: (value: Boolean) -> Unit,
392
+ setLoading: (value: Boolean) -> Unit
393
+ ) {
394
+ if (mCameraP2P.isNotNull()) {
395
+ val permissions = arrayOf(
396
+ Manifest.permission.RECORD_AUDIO,
397
+ )
398
+ if (PermissionHandler.arePermissionsGranted(context, permissions)) {
399
+ setLoading(true)
400
+ mCameraP2P?.startAudioTalk(object : OperationDelegateCallBack {
401
+ override fun onSuccess(sessionId: Int, requestId: Int, data: String?) {
402
+ Log.i(
403
+ TAG,
404
+ "Start talking Successful: SessionID: $sessionId, RequestId: $requestId, Data: $data"
405
+ )
406
+ setMic(true)
407
+ setLoading(false)
408
+ }
409
+
410
+ override fun onFailure(sessionId: Int, requestId: Int, errCode: Int) {
411
+ setMic(false)
412
+ setLoading(false)
413
+ Airbrake.logMessage(
414
+ title = "Start Voice Talk Failed",
415
+ message = "Error Code: $errCode",
416
+ additionalInfo = mapOf(
417
+ "sessionId" to sessionId.toString(),
418
+ "requestId" to requestId.toString()
419
+ )
420
+ )
421
+ }
422
+ })
423
+ } else {
424
+ PermissionHandler.checkAndRequestPermissions(
425
+ context as Activity,
426
+ permissions,
427
+ 200
428
+ )
429
+ }
430
+ }
431
+ }
432
+
433
+ fun stopVoiceTalk(
434
+ setMic: (value: Boolean) -> Unit,
435
+ setLoading: (value: Boolean) -> Unit
436
+ ) {
437
+ if (mCameraP2P.isNotNull()) {
438
+ setLoading(true)
439
+ mCameraP2P?.stopAudioTalk(object : OperationDelegateCallBack {
440
+ override fun onSuccess(sessionId: Int, requestId: Int, data: String?) {
441
+ setMic(false)
442
+ setLoading(false)
443
+ Log.i(
444
+ TAG,
445
+ "Stop talking Successful: SessionID: $sessionId, RequestId: $requestId, Data: $data"
446
+ )
447
+ }
448
+
449
+ override fun onFailure(sessionId: Int, requestId: Int, errCode: Int) {
450
+ setMic(true)
451
+ setLoading(false)
452
+ Airbrake.logMessage(
453
+ title = "Stop Voice Talk Failed",
454
+ message = "Error Code: $errCode",
455
+ additionalInfo = mapOf(
456
+ "sessionId" to sessionId.toString(),
457
+ "requestId" to requestId.toString()
458
+ )
459
+ )
460
+ }
461
+ })
462
+ }
463
+ }
464
+
465
+ fun changeResolution(
466
+ videoId: Int,
467
+ setVideoType: (value: Int) -> Unit,
468
+ setLoading: (value: Boolean) -> Unit
469
+ ) {
470
+ // 2-SD 4-HD 8-Ultra HD
471
+ if (mCameraP2P.isNotNull()) {
472
+ setLoading(true)
473
+ mCameraP2P?.setVideoClarity(videoId, object : OperationDelegateCallBack {
474
+ override fun onSuccess(sessionId: Int, requestId: Int, data: String) {
475
+ setVideoType(videoId)
476
+ setLoading(false)
477
+ Log.i(
478
+ TAG,
479
+ "Change Resolution Successful: SessionID: $sessionId, RequestId: $requestId, Data: $data"
480
+ )
481
+ }
482
+
483
+ override fun onFailure(sessionId: Int, requestId: Int, errCode: Int) {
484
+ setLoading(false)
485
+ Airbrake.logMessage(
486
+ title = "Change Resolution Failed",
487
+ message = "Error Code: $errCode",
488
+ additionalInfo = mapOf(
489
+ "sessionId" to sessionId.toString(),
490
+ "requestId" to requestId.toString()
491
+ )
492
+ )
493
+ }
494
+ })
495
+ }
496
+ }
497
+ }
@@ -0,0 +1,80 @@
1
+ package com.rentlytuya.ui.theme
2
+
3
+ import android.util.Log
4
+ import androidx.compose.ui.graphics.Color
5
+ import com.rentlytuya.tuya.Tuya.TAG
6
+
7
+ object LocalColor {
8
+
9
+ object Main {
10
+ var Light = Color(0xFFf3faff)
11
+ var Dark = Color(0xFF329ddc)
12
+ }
13
+
14
+ object Primary {
15
+ var Light = Color(0xFF39a1e8)
16
+ var Secondary = Color(0xFF6a97b5)
17
+ var Dark = Color(0xFF329ddc)
18
+ var Medium = Color(0xFF008adc)
19
+ }
20
+
21
+ object Secondary {
22
+ var White = Color(0xFFf3faff)
23
+ var Light = Color(0xFFd9edfb)
24
+ }
25
+
26
+ object Danger {
27
+ var Primary = Color(0xFFcb0000)
28
+ }
29
+
30
+ object Monochrome {
31
+ var White = Color(0xFFFFFFFF)
32
+ var LightGrey = Color(0xFF80FFFFFF)
33
+ var Regular = Color(0xFF86858C)
34
+ var Medium = Color(0xFF3f4d59)
35
+ var Grey = Color(0xFF373737)
36
+ var Black = Color(0xFF000000)
37
+ }
38
+
39
+ fun setTheme(flavour: String) {
40
+ when (flavour.lowercase()) {
41
+ "keyless" -> {
42
+ setSmartHomeTheme()
43
+ }
44
+
45
+ "progress" -> {
46
+ setProgressTheme()
47
+ }
48
+
49
+ "coveyhomes" -> {
50
+ setCoveyHomesTheme()
51
+ }
52
+
53
+ "bellanet" -> {
54
+ setBellaNetTheme()
55
+ }
56
+
57
+ else -> Log.e(TAG, "Flavor mismatch")
58
+ }
59
+ }
60
+ }
61
+
62
+ private fun setSmartHomeTheme() {
63
+ LocalColor.Main.Light = Color(0xFFf3faff)
64
+ LocalColor.Main.Dark = Color(0xFF329ddc)
65
+ }
66
+
67
+ private fun setProgressTheme() {
68
+ LocalColor.Main.Light = Color(0xFFEFF5F4)
69
+ LocalColor.Main.Dark = Color(0xFF279989)
70
+ }
71
+
72
+ private fun setCoveyHomesTheme() {
73
+ LocalColor.Main.Light = Color(0xFFFAF6F6)
74
+ LocalColor.Main.Dark = Color(0xFF99855E)
75
+ }
76
+
77
+ private fun setBellaNetTheme() {
78
+ LocalColor.Main.Light = Color(0xFFE9F0FF)
79
+ LocalColor.Main.Dark = Color(0xFF0B1E44)
80
+ }
@@ -0,0 +1,35 @@
1
+ package com.rentlytuya.ui.theme
2
+
3
+ import androidx.compose.ui.text.font.Font
4
+ import androidx.compose.ui.text.font.FontFamily
5
+ import androidx.compose.ui.unit.sp
6
+ import com.rentlytuya.R
7
+
8
+ object LocalFont {
9
+ object FontSize {
10
+ val XS = 10.sp
11
+ val S = 12.sp
12
+ val M = 14.sp
13
+ val L = 16.sp
14
+ val XL18 = 18.sp
15
+ val XL20 = 20.sp
16
+ val XL22 = 22.sp
17
+ val XL24 = 24.sp
18
+ val XL26 = 26.sp
19
+ val XL28 = 28.sp
20
+ val XL30 = 30.sp
21
+ val XL34 = 34.sp
22
+ val XL40 = 40.sp
23
+ val XL50 = 50.sp
24
+ val XL80 = 80.sp
25
+ val XL200 = 200.sp
26
+ }
27
+
28
+ object FontFamily {
29
+ val light = FontFamily(Font(R.font.quicksand_light))
30
+ val regular = FontFamily(Font(R.font.quicksand_regular))
31
+ val medium = FontFamily(Font(R.font.quicksand_medium))
32
+ val semiBold = FontFamily(Font(R.font.quicksand_semi_bold))
33
+ val bold = FontFamily(Font(R.font.quicksand_bold))
34
+ }
35
+ }
@@ -0,0 +1,34 @@
1
+ package com.rentlytuya.ui.theme
2
+
3
+ import android.app.Activity
4
+ import androidx.compose.foundation.isSystemInDarkTheme
5
+ import androidx.compose.material3.MaterialTheme
6
+ import androidx.compose.runtime.Composable
7
+ import androidx.compose.runtime.SideEffect
8
+ import androidx.compose.ui.graphics.toArgb
9
+ import androidx.compose.ui.platform.LocalView
10
+ import androidx.core.view.WindowCompat
11
+
12
+ @Composable
13
+ fun TuyaTheme(
14
+ darkTheme: Boolean = isSystemInDarkTheme(),
15
+ // Dynamic color is available on Android 12+
16
+ dynamicColor: Boolean = true,
17
+ content: @Composable () -> Unit
18
+ ) {
19
+
20
+ val view = LocalView.current
21
+ if (!view.isInEditMode) {
22
+ SideEffect {
23
+ val window = (view.context as Activity).window
24
+ // window.statusBarColor = LocalColor.Monochrome.Grey.toArgb()
25
+ window.navigationBarColor = LocalColor.Monochrome.Grey.toArgb()
26
+ WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
27
+ }
28
+ }
29
+
30
+ MaterialTheme(
31
+ typography = Typography,
32
+ content = content
33
+ )
34
+ }
@@ -0,0 +1,34 @@
1
+ package com.rentlytuya.ui.theme
2
+
3
+ import androidx.compose.material3.Typography
4
+ import androidx.compose.ui.text.TextStyle
5
+ import androidx.compose.ui.text.font.FontFamily
6
+ import androidx.compose.ui.text.font.FontWeight
7
+ import androidx.compose.ui.unit.sp
8
+
9
+ // Set of Material typography styles to start with
10
+ val Typography = Typography(
11
+ bodyLarge = TextStyle(
12
+ fontFamily = FontFamily.Default,
13
+ fontWeight = FontWeight.Normal,
14
+ fontSize = 16.sp,
15
+ lineHeight = 24.sp,
16
+ letterSpacing = 0.5.sp
17
+ )
18
+ /* Other default text styles to override
19
+ titleLarge = TextStyle(
20
+ fontFamily = FontFamily.Default,
21
+ fontWeight = FontWeight.Normal,
22
+ fontSize = 22.sp,
23
+ lineHeight = 28.sp,
24
+ letterSpacing = 0.sp
25
+ ),
26
+ labelSmall = TextStyle(
27
+ fontFamily = FontFamily.Default,
28
+ fontWeight = FontWeight.Medium,
29
+ fontSize = 11.sp,
30
+ lineHeight = 16.sp,
31
+ letterSpacing = 0.5.sp
32
+ )
33
+ */
34
+ )