@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,147 @@
1
+ package com.rentlytuya.components
2
+
3
+ import androidx.compose.foundation.Image
4
+ import androidx.compose.foundation.border
5
+ import androidx.compose.foundation.layout.PaddingValues
6
+ import androidx.compose.foundation.layout.Row
7
+ import androidx.compose.foundation.layout.padding
8
+ import androidx.compose.foundation.shape.RoundedCornerShape
9
+ import androidx.compose.material3.ButtonDefaults
10
+ import androidx.compose.material3.Text
11
+ import androidx.compose.runtime.Composable
12
+ import androidx.compose.runtime.CompositionLocalProvider
13
+ import androidx.compose.ui.Modifier
14
+ import androidx.compose.ui.graphics.Color
15
+ import androidx.compose.ui.platform.LocalDensity
16
+ import androidx.compose.ui.res.painterResource
17
+ import androidx.compose.ui.semantics.contentDescription
18
+ import androidx.compose.ui.semantics.semantics
19
+ import androidx.compose.ui.text.style.TextAlign
20
+ import androidx.compose.ui.text.style.TextOverflow
21
+ import androidx.compose.ui.unit.Density
22
+ import androidx.compose.ui.unit.Dp
23
+ import androidx.compose.ui.unit.dp
24
+ import com.rentlytuya.ui.theme.LocalColor
25
+ import com.rentlytuya.ui.theme.LocalFont
26
+ import com.rentlytuya.util.Heap
27
+ import androidx.compose.material3.Button as MaterialButton
28
+
29
+ @Composable
30
+ fun Button(
31
+ modifier: Modifier = Modifier,
32
+ id: String,
33
+ textModifier: Modifier = Modifier,
34
+ title: String,
35
+ // Font Size
36
+ xs: Boolean = false,
37
+ s: Boolean = false,
38
+ m: Boolean = false,
39
+ l: Boolean = false,
40
+ xl18: Boolean = false,
41
+ xl20: Boolean = false,
42
+ xl22: Boolean = false,
43
+ xl24: Boolean = false,
44
+ // Color
45
+ primary: Boolean = false,
46
+ secondary: Boolean = false,
47
+ white: Boolean = false,
48
+ grey: Boolean = false,
49
+ black: Boolean = false,
50
+ textColor: Color?,
51
+ borderColor: Color? = null,
52
+ // Font Weight
53
+ light: Boolean = false,
54
+ medium: Boolean = false,
55
+ semiBold: Boolean = false,
56
+ bold: Boolean = false,
57
+ cornerRadius: Dp = 30.dp,
58
+ disabled: Boolean = false,
59
+ elevation: Boolean = true,
60
+ iconId: Int? = null,
61
+ onClick: () -> Unit = {}
62
+ ) {
63
+
64
+ val buttonColor = when {
65
+ primary -> LocalColor.Primary.Medium
66
+ secondary -> Color(0xFFf37787)
67
+ white -> LocalColor.Monochrome.White
68
+ grey -> LocalColor.Monochrome.LightGrey
69
+ black -> LocalColor.Monochrome.Black
70
+ else -> LocalColor.Primary.Light
71
+ }
72
+
73
+ val borderModifier = borderColor?.let { color ->
74
+ Modifier.border(1.dp, color, RoundedCornerShape(cornerRadius))
75
+ } ?: Modifier
76
+
77
+ val fontFamily = when {
78
+ light -> LocalFont.FontFamily.light
79
+ medium -> LocalFont.FontFamily.medium
80
+ semiBold -> LocalFont.FontFamily.semiBold
81
+ bold -> LocalFont.FontFamily.bold
82
+ else -> LocalFont.FontFamily.regular
83
+ }
84
+
85
+ val fontSize = when {
86
+ xs -> LocalFont.FontSize.XS
87
+ s -> LocalFont.FontSize.S
88
+ m -> LocalFont.FontSize.M
89
+ l -> LocalFont.FontSize.L
90
+ xl18 -> LocalFont.FontSize.XL18
91
+ xl20 -> LocalFont.FontSize.XL20
92
+ xl22 -> LocalFont.FontSize.XL22
93
+ xl24 -> LocalFont.FontSize.XL24
94
+ else -> LocalFont.FontSize.M
95
+ }
96
+
97
+ MaterialButton(
98
+ modifier = Modifier
99
+ .semantics { contentDescription = "${id}Button" }
100
+ .then(modifier)
101
+ .then(borderModifier),
102
+ enabled = !disabled,
103
+ onClick = {
104
+ Heap.trackEvent(eventName = id)
105
+ onClick()
106
+ },
107
+ shape = RoundedCornerShape(cornerRadius),
108
+ colors = ButtonDefaults.buttonColors(
109
+ containerColor = buttonColor,
110
+ disabledContainerColor = buttonColor.copy(alpha = 0.5F)
111
+ ),
112
+ elevation = when {
113
+ elevation -> ButtonDefaults.elevatedButtonElevation()
114
+ else -> null
115
+ },
116
+ contentPadding = PaddingValues(0.dp)
117
+ ) {
118
+ CompositionLocalProvider(
119
+ LocalDensity provides Density(
120
+ density = LocalDensity.current.density,
121
+ fontScale = 1f
122
+ )
123
+ ) {
124
+ Row {
125
+ if (iconId != null) {
126
+ Image(
127
+ painter = painterResource(id = iconId),
128
+ contentDescription = "${id}Icon",
129
+ modifier = Modifier.padding(end = 8.dp)
130
+ )
131
+ }
132
+ Text(
133
+ text = title,
134
+ fontSize = fontSize,
135
+ fontFamily = fontFamily,
136
+ textAlign = TextAlign.Center,
137
+ color = textColor!!,
138
+ maxLines = 1,
139
+ overflow = TextOverflow.Clip,
140
+ modifier = Modifier
141
+ .semantics { contentDescription = "${id}Text" }
142
+ .then(textModifier)
143
+ )
144
+ }
145
+ }
146
+ }
147
+ }
@@ -0,0 +1,275 @@
1
+ package com.rentlytuya.components
2
+
3
+ import android.os.Build
4
+ import androidx.annotation.RequiresApi
5
+ import androidx.compose.foundation.background
6
+ import androidx.compose.foundation.border
7
+ import androidx.compose.foundation.clickable
8
+ import androidx.compose.foundation.layout.Arrangement
9
+ import androidx.compose.foundation.layout.Box
10
+ import androidx.compose.foundation.layout.Column
11
+ import androidx.compose.foundation.layout.Row
12
+ import androidx.compose.foundation.layout.Spacer
13
+ import androidx.compose.foundation.layout.fillMaxHeight
14
+ import androidx.compose.foundation.layout.fillMaxWidth
15
+ import androidx.compose.foundation.layout.padding
16
+ import androidx.compose.foundation.layout.size
17
+ import androidx.compose.foundation.lazy.grid.GridCells
18
+ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
19
+ import androidx.compose.foundation.shape.CircleShape
20
+ import androidx.compose.material.icons.Icons
21
+ import androidx.compose.material.icons.automirrored.filled.ArrowBack
22
+ import androidx.compose.material.icons.automirrored.filled.ArrowForward
23
+ import androidx.compose.material3.CircularProgressIndicator
24
+ import androidx.compose.material3.Icon
25
+ import androidx.compose.material3.IconButton
26
+ import androidx.compose.runtime.Composable
27
+ import androidx.compose.runtime.LaunchedEffect
28
+ import androidx.compose.runtime.MutableState
29
+ import androidx.compose.runtime.getValue
30
+ import androidx.compose.runtime.mutableLongStateOf
31
+ import androidx.compose.runtime.mutableStateOf
32
+ import androidx.compose.runtime.remember
33
+ import androidx.compose.runtime.setValue
34
+ import androidx.compose.ui.Alignment
35
+ import androidx.compose.ui.Modifier
36
+ import androidx.compose.ui.draw.clip
37
+ import androidx.compose.ui.unit.dp
38
+ import com.rentlytuya.R
39
+ import com.rentlytuya.ui.theme.LocalColor
40
+ import com.rentlytuya.util.Util.strings
41
+ import java.time.Instant
42
+ import java.time.LocalDate
43
+ import java.time.YearMonth
44
+ import java.time.ZoneOffset
45
+ import java.time.format.DateTimeFormatter
46
+ import java.util.Calendar
47
+
48
+ @RequiresApi(Build.VERSION_CODES.O)
49
+ @Composable
50
+ fun DatePicker(
51
+ isVisible: MutableState<Boolean>,
52
+ initialDate: Long = Calendar.getInstance().timeInMillis,
53
+ availableDates: Array<Int>,
54
+ minDate: LocalDate?,
55
+ isLoading: Boolean,
56
+ onDateSelected: (Long) -> Unit,
57
+ onMonthChanged: (YearMonth) -> Unit,
58
+ onCancel: () -> Unit,
59
+ onOk: (Long) -> Unit,
60
+ onAppear: () -> Unit
61
+ ) {
62
+ var currentMonth by remember { mutableStateOf(YearMonth.now()) }
63
+ var tempDate by remember { mutableLongStateOf(initialDate) }
64
+ var selectedDate by remember { mutableLongStateOf(initialDate) }
65
+
66
+ val daysInMonth = currentMonth.atEndOfMonth().dayOfMonth
67
+ val firstDayOfWeek = currentMonth.atDay(1).dayOfWeek.value % 7
68
+
69
+ LaunchedEffect(isVisible.value) {
70
+ if (isVisible.value) {
71
+ tempDate = selectedDate
72
+ currentMonth = Instant.ofEpochMilli(selectedDate)
73
+ .atZone(ZoneOffset.UTC)
74
+ .toLocalDate()
75
+ .let { YearMonth.of(it.year, it.month) }
76
+ }
77
+ onAppear()
78
+ }
79
+
80
+ if (isVisible.value) {
81
+ Alert(
82
+ isVisible = true,
83
+ onDismiss = { isVisible.value = false }
84
+ ) {
85
+ Column {
86
+ Column(
87
+ modifier = Modifier
88
+ .fillMaxWidth()
89
+ .background(LocalColor.Main.Dark)
90
+ .padding(start = 15.dp, top = 20.dp, bottom = 30.dp)
91
+ ) {
92
+ Label(
93
+ modifier = Modifier.padding(bottom = 20.dp),
94
+ title = "Select date",
95
+ l = true,
96
+ white = true,
97
+ bold = true
98
+ )
99
+ Label(
100
+ title = LocalDate.ofEpochDay(tempDate / 86400000)
101
+ .format(DateTimeFormatter.ofPattern("MMM dd yyyy")),
102
+ xl34 = true,
103
+ white = true,
104
+ bold = true
105
+ )
106
+ }
107
+
108
+ Column(
109
+ modifier = Modifier
110
+ .fillMaxWidth()
111
+ .padding(horizontal = 16.dp, vertical = 5.dp)
112
+ .background(LocalColor.Monochrome.White)
113
+ ) {
114
+ Row(
115
+ modifier = Modifier
116
+ .fillMaxWidth()
117
+ .padding(vertical = 8.dp),
118
+ horizontalArrangement = Arrangement.SpaceBetween
119
+ ) {
120
+ IconButton(
121
+ onClick = {
122
+ currentMonth = currentMonth.minusMonths(1)
123
+ onMonthChanged(currentMonth)
124
+ },
125
+ enabled = !isLoading
126
+ ) {
127
+ Icon(
128
+ Icons.AutoMirrored.Filled.ArrowBack,
129
+ contentDescription = "Previous Month"
130
+ )
131
+ }
132
+
133
+ Label(
134
+ modifier = Modifier.align(Alignment.CenterVertically),
135
+ title = currentMonth.format(DateTimeFormatter.ofPattern("MMMM yyyy")),
136
+ l = true,
137
+ bold = true,
138
+ black = true
139
+ )
140
+
141
+ IconButton(
142
+ onClick = {
143
+ currentMonth = currentMonth.plusMonths(1)
144
+ onMonthChanged(currentMonth)
145
+ },
146
+ enabled = !isLoading
147
+ ) {
148
+ Icon(
149
+ Icons.AutoMirrored.Filled.ArrowForward,
150
+ contentDescription = "Next Month"
151
+ )
152
+ }
153
+ }
154
+
155
+ Row(
156
+ modifier = Modifier
157
+ .fillMaxWidth(),
158
+ horizontalArrangement = Arrangement.SpaceAround
159
+ ) {
160
+ listOf("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat").forEach {
161
+ Label(
162
+ title = it,
163
+ s = true,
164
+ bold = true,
165
+ black = true
166
+ )
167
+ }
168
+ }
169
+
170
+ if (isLoading) {
171
+ Box(
172
+ modifier = Modifier
173
+ .fillMaxWidth()
174
+ .fillMaxHeight(0.5f),
175
+ contentAlignment = Alignment.Center
176
+ ) {
177
+ CircularProgressIndicator(
178
+ modifier = Modifier
179
+ .align(Alignment.Center),
180
+ color = LocalColor.Main.Dark
181
+ )
182
+ }
183
+ } else {
184
+ LazyVerticalGrid(
185
+ columns = GridCells.Fixed(7),
186
+ modifier = Modifier
187
+ .fillMaxWidth()
188
+ .fillMaxHeight(0.5f)
189
+ .padding(vertical = 8.dp),
190
+ horizontalArrangement = Arrangement.Center,
191
+ verticalArrangement = Arrangement.Center
192
+ ) {
193
+
194
+ items(firstDayOfWeek) {
195
+ Spacer(modifier = Modifier.size(40.dp))
196
+ }
197
+
198
+ items(daysInMonth) { day ->
199
+ val date = currentMonth.atDay(day + 1)
200
+ val isAvailable = availableDates.contains(day + 1)
201
+ val isBeforeMinDate = minDate?.let { date.isBefore(it) } == true
202
+ val isSelected = date == LocalDate.ofEpochDay(tempDate / 86400000)
203
+
204
+ Box(
205
+ modifier = Modifier
206
+ .size(45.dp)
207
+ .padding(6.dp)
208
+ .clip(CircleShape)
209
+ .then(
210
+ if (isAvailable && !isBeforeMinDate) {
211
+ Modifier.border(
212
+ 1.dp,
213
+ color = LocalColor.Main.Dark,
214
+ shape = CircleShape
215
+ )
216
+ } else Modifier
217
+ )
218
+ .background(
219
+ when {
220
+ isSelected -> LocalColor.Main.Dark
221
+ isAvailable && !isBeforeMinDate -> LocalColor.Monochrome.White
222
+ else -> LocalColor.Monochrome.White
223
+ }
224
+ )
225
+ .clickable(enabled = isAvailable && !isBeforeMinDate) {
226
+ if (!isBeforeMinDate) {
227
+ tempDate = date.toEpochDay() * 86400000L
228
+ onDateSelected(tempDate)
229
+ }
230
+ },
231
+ contentAlignment = Alignment.Center
232
+ ) {
233
+ Label(
234
+ title = (day + 1).toString(),
235
+ m = true,
236
+ bold = isSelected,
237
+ white = isSelected,
238
+ black = !isSelected
239
+ )
240
+ }
241
+ }
242
+ }
243
+ }
244
+
245
+ Row(
246
+ modifier = Modifier
247
+ .fillMaxWidth()
248
+ .padding(bottom = 5.dp),
249
+ horizontalArrangement = Arrangement.End
250
+ ) {
251
+ AnchorButton(
252
+ modifier = Modifier.padding(5.dp),
253
+ id = "DatePicker_Cancel",
254
+ title = strings(id = R.string.cancel),
255
+ black = true,
256
+ semiBold = true
257
+ ) {
258
+ onCancel()
259
+ }
260
+ AnchorButton(
261
+ modifier = Modifier.padding(5.dp),
262
+ id = "DatePicker_OK",
263
+ title = strings(id = R.string.ok).uppercase(),
264
+ black = true,
265
+ semiBold = true
266
+ ) {
267
+ selectedDate = tempDate
268
+ onOk(tempDate)
269
+ }
270
+ }
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
@@ -0,0 +1,53 @@
1
+ package com.rentlytuya.components
2
+
3
+ import androidx.compose.foundation.background
4
+ import androidx.compose.foundation.layout.Box
5
+ import androidx.compose.foundation.layout.fillMaxHeight
6
+ import androidx.compose.foundation.layout.fillMaxWidth
7
+ import androidx.compose.foundation.layout.height
8
+ import androidx.compose.foundation.layout.width
9
+ import androidx.compose.runtime.Composable
10
+ import androidx.compose.ui.Modifier
11
+ import androidx.compose.ui.platform.LocalDensity
12
+ import androidx.compose.ui.unit.Dp
13
+ import androidx.compose.ui.unit.dp
14
+ import com.rentlytuya.ui.theme.LocalColor
15
+
16
+ enum class DividerDirection {
17
+ Horizontal,
18
+ Vertical
19
+ }
20
+
21
+ @Composable
22
+ fun Divider(
23
+ modifier: Modifier = Modifier,
24
+ thickness: Dp = 1.dp,
25
+ direction: DividerDirection = DividerDirection.Horizontal,
26
+ primary: Boolean = false,
27
+ ) {
28
+ val targetThickness = when (thickness) {
29
+ Dp.Hairline -> (1f / LocalDensity.current.density).dp
30
+ else -> thickness
31
+ }
32
+
33
+ val color = when {
34
+ primary -> LocalColor.Secondary.Light
35
+ else -> LocalColor.Secondary.Light
36
+ }
37
+
38
+ Box(
39
+ when (direction) {
40
+ DividerDirection.Vertical -> modifier
41
+ .fillMaxHeight()
42
+ .width(targetThickness)
43
+ .background(color)
44
+ .then(modifier)
45
+
46
+ else -> modifier
47
+ .fillMaxWidth()
48
+ .height(targetThickness)
49
+ .background(color)
50
+ .then(modifier)
51
+ }
52
+ )
53
+ }
@@ -0,0 +1,59 @@
1
+ package com.rentlytuya.components
2
+
3
+ import android.content.Context
4
+ import androidx.compose.runtime.Composable
5
+ import androidx.compose.ui.Modifier
6
+ import androidx.compose.ui.viewinterop.AndroidView
7
+ import com.facebook.drawee.backends.pipeline.Fresco
8
+ import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder
9
+ import com.rentlytuya.R
10
+ import com.thingclips.drawee.view.DecryptImageView
11
+
12
+ @Composable
13
+ fun EncryptedImageView(
14
+ imageUrl: String,
15
+ modifier: Modifier = Modifier
16
+ ) {
17
+ val (url, encryptionKey) = parseEncryptedUrl(imageUrl) ?: Pair("", "")
18
+
19
+ AndroidView(
20
+ modifier = modifier,
21
+ factory = { context ->
22
+ createEncryptedImageView(context, url, encryptionKey)
23
+ }
24
+ )
25
+ }
26
+
27
+ fun parseEncryptedUrl(url: String): Pair<String, String>? {
28
+ return if (url.contains("@")) {
29
+ val index = url.lastIndexOf("@")
30
+ val encryptionKey = url.substring(index + 1)
31
+ val imageUrl = url.substring(0, index)
32
+ Pair(imageUrl, encryptionKey)
33
+ } else {
34
+ null
35
+ }
36
+ }
37
+
38
+ private fun createEncryptedImageView(
39
+ context: Context,
40
+ imageUrl: String,
41
+ encryptionKey: String
42
+ ): DecryptImageView {
43
+ val decryptImageView = DecryptImageView(context)
44
+
45
+ val hierarchy = GenericDraweeHierarchyBuilder(context.resources)
46
+ .setPlaceholderImage(R.drawable.img_place_holder)
47
+ .build()
48
+
49
+ decryptImageView.hierarchy = hierarchy
50
+
51
+ val controller = Fresco.newDraweeControllerBuilder()
52
+ .setUri(imageUrl)
53
+ .build()
54
+
55
+ decryptImageView.controller = controller
56
+ decryptImageView.setImageURI(imageUrl, encryptionKey.toByteArray())
57
+
58
+ return decryptImageView
59
+ }
@@ -0,0 +1,155 @@
1
+ package com.rentlytuya.components
2
+
3
+ import androidx.compose.material3.Text
4
+ import androidx.compose.runtime.Composable
5
+ import androidx.compose.runtime.CompositionLocalProvider
6
+ import androidx.compose.ui.Modifier
7
+ import androidx.compose.ui.platform.LocalDensity
8
+ import androidx.compose.ui.platform.testTag
9
+ import androidx.compose.ui.semantics.contentDescription
10
+ import androidx.compose.ui.semantics.semantics
11
+ import androidx.compose.ui.text.AnnotatedString
12
+ import androidx.compose.ui.text.style.TextAlign
13
+ import androidx.compose.ui.text.style.TextDecoration
14
+ import androidx.compose.ui.text.style.TextOverflow
15
+ import androidx.compose.ui.unit.Density
16
+ import androidx.compose.ui.unit.TextUnit
17
+ import com.rentlytuya.ui.theme.LocalColor
18
+ import com.rentlytuya.ui.theme.LocalFont.FontFamily
19
+ import com.rentlytuya.ui.theme.LocalFont.FontSize
20
+
21
+ @Composable
22
+ fun Label(
23
+ modifier: Modifier = Modifier,
24
+ id: String = "",
25
+ title: String,
26
+ annotatedTitle: AnnotatedString = AnnotatedString(""),
27
+ // Font Size
28
+ xs: Boolean = false,
29
+ s: Boolean = false,
30
+ m: Boolean = false,
31
+ l: Boolean = false,
32
+ xl18: Boolean = false,
33
+ xl20: Boolean = false,
34
+ xl22: Boolean = false,
35
+ xl24: Boolean = false,
36
+ xl26: Boolean = false,
37
+ xl28: Boolean = false,
38
+ xl30: Boolean = false,
39
+ xl34: Boolean = false,
40
+ xl40: Boolean = false,
41
+ xl50: Boolean = false,
42
+ xl80: Boolean = false,
43
+ xl200: Boolean = false,
44
+ // Color
45
+ primary: Boolean = false,
46
+ secondary: Boolean = false,
47
+ lightGrey: Boolean = false,
48
+ grey: Boolean = false,
49
+ white: Boolean = false,
50
+ black: Boolean = false,
51
+ // Font Weight
52
+ light: Boolean = false,
53
+ medium: Boolean = false,
54
+ semiBold: Boolean = false,
55
+ bold: Boolean = false,
56
+ // Text Alignment
57
+ left: Boolean = false,
58
+ right: Boolean = false,
59
+ center: Boolean = false,
60
+ // Text Decoration
61
+ underLine: Boolean = false,
62
+ strikeThrough: Boolean = false,
63
+ maxLines: Int = 1,
64
+ clip: Boolean = false,
65
+ ellipsis: Boolean = false,
66
+ //Letter Spacing
67
+ letterSpacing: TextUnit = TextUnit.Unspecified,
68
+ lineHeight: TextUnit = TextUnit.Unspecified
69
+ ) {
70
+ val textAlign = when {
71
+ left -> TextAlign.Left
72
+ right -> TextAlign.Right
73
+ center -> TextAlign.Center
74
+ else -> TextAlign.Start
75
+ }
76
+
77
+ val color = when {
78
+ primary -> LocalColor.Primary.Light
79
+ secondary -> LocalColor.Primary.Secondary
80
+ lightGrey -> LocalColor.Monochrome.Regular
81
+ grey -> LocalColor.Monochrome.Medium
82
+ white -> LocalColor.Monochrome.White
83
+ black -> LocalColor.Monochrome.Black
84
+ else -> LocalColor.Primary.Light
85
+ }
86
+
87
+ val textDecoration = when {
88
+ underLine -> TextDecoration.Underline
89
+ strikeThrough -> TextDecoration.LineThrough
90
+ else -> TextDecoration.None
91
+ }
92
+
93
+ val fontFamily = when {
94
+ light -> FontFamily.light
95
+ medium -> FontFamily.medium
96
+ semiBold -> FontFamily.semiBold
97
+ bold -> FontFamily.bold
98
+ else -> FontFamily.regular
99
+ }
100
+
101
+ val fontSize = when {
102
+ xs -> FontSize.XS
103
+ s -> FontSize.S
104
+ m -> FontSize.M
105
+ l -> FontSize.L
106
+ xl18 -> FontSize.XL18
107
+ xl20 -> FontSize.XL20
108
+ xl22 -> FontSize.XL22
109
+ xl24 -> FontSize.XL24
110
+ xl26 -> FontSize.XL26
111
+ xl28 -> FontSize.XL28
112
+ xl30 -> FontSize.XL30
113
+ xl34 -> FontSize.XL34
114
+ xl40 -> FontSize.XL40
115
+ xl50 -> FontSize.XL50
116
+ xl80 -> FontSize.XL80
117
+ xl200 -> FontSize.XL200
118
+ else -> FontSize.L
119
+ }
120
+
121
+ val overflow = when {
122
+ clip -> TextOverflow.Clip
123
+ ellipsis -> TextOverflow.Ellipsis
124
+ else -> TextOverflow.Visible
125
+ }
126
+
127
+ val text = when {
128
+ title.isNotEmpty() -> AnnotatedString(title)
129
+ else -> annotatedTitle
130
+ }
131
+
132
+ CompositionLocalProvider(
133
+ LocalDensity provides Density(
134
+ density = LocalDensity.current.density,
135
+ fontScale = 1f
136
+ )
137
+ ) {
138
+ Text(
139
+ text = text,
140
+ fontSize = fontSize,
141
+ fontFamily = fontFamily,
142
+ textAlign = textAlign,
143
+ color = color,
144
+ textDecoration = textDecoration,
145
+ maxLines = maxLines,
146
+ overflow = overflow,
147
+ modifier = Modifier
148
+ .semantics { contentDescription = id.ifEmpty { title } }
149
+ .testTag(id.ifEmpty { title })
150
+ .then(modifier),
151
+ letterSpacing = letterSpacing,
152
+ lineHeight = lineHeight
153
+ )
154
+ }
155
+ }