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