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