@@ -21,6 +21,7 @@ import pl.rmakowiecki.smartalarmcore.remote.Nodes.ALARM_STATE
21
21
import pl.rmakowiecki.smartalarmcore.remote.Nodes.ALARM_TRIGGER
22
22
import pl.rmakowiecki.smartalarmcore.remote.Nodes.CORE_DEVICE_DIRECTORY
23
23
import pl.rmakowiecki.smartalarmcore.remote.Nodes.IMAGES_DIRECTORY
24
+ import pl.rmakowiecki.smartalarmcore.remote.Nodes.PRESENCE_NODE
24
25
import pl.rmakowiecki.smartalarmcore.toArmingState
25
26
26
27
class AlarmBackendInteractor (private val activity : AlarmActivity ) : AlarmBackendContract {
@@ -34,16 +35,32 @@ class AlarmBackendInteractor(private val activity: AlarmActivity) : AlarmBackend
34
35
.getReferenceFromUrl(" gs://smartalarmcore.appspot.com" )
35
36
36
37
override fun signInToBackend (): Single <Boolean > = Single .create { emitter ->
38
+ reportAbsenceOnDisconnect()
37
39
38
40
logD(Settings .Secure .getString(activity.contentResolver, Settings .Secure .ANDROID_ID ))
39
41
40
42
getCurrentBackendUser()?.let {
43
+ reportPresence()
41
44
emitter.onSuccess(true )
42
45
} ? : FirebaseAuth .getInstance()
43
46
.signInAnonymously()
44
47
.addOnSuccessListener { signUpAsAuthorizedUser(it.user, emitter) }
45
48
}
46
49
50
+ private fun reportAbsenceOnDisconnect () = getCurrentBackendUser()?.uid?.let {
51
+ val systemPresenceNode = databaseNode.child(it)
52
+ .child(ALARM_STATE )
53
+ .child(PRESENCE_NODE )
54
+
55
+ systemPresenceNode.onDisconnect().setValue(false )
56
+ }
57
+
58
+ private fun reportPresence () = databaseNode
59
+ .child(getCurrentBackendUser()?.uid)
60
+ .child(ALARM_STATE )
61
+ .child(PRESENCE_NODE )
62
+ .setValue(true )
63
+
47
64
private fun signUpAsAuthorizedUser (firebaseUser : FirebaseUser , emitter : SingleEmitter <Boolean >) {
48
65
FirebaseAuth .getInstance().createUserWithEmailAndPassword(
49
66
" ${firebaseUser.uid} @smarthome.com" ,
@@ -53,11 +70,14 @@ class AlarmBackendInteractor(private val activity: AlarmActivity) : AlarmBackend
53
70
}.addOnFailureListener(::printStackTrace)
54
71
}
55
72
56
- private fun initializeCoreDeviceNoSqlModel (emitter : SingleEmitter <Boolean >) = databaseNode
57
- .child(getCurrentBackendUser()?.uid)
58
- .child(ALARM_STATE )
59
- .setValue(RemoteAlarmStateModel (true , false ))
60
- .addOnSuccessListener { emitter.onSuccess(true ) }
73
+ private fun initializeCoreDeviceNoSqlModel (emitter : SingleEmitter <Boolean >) {
74
+ reportAbsenceOnDisconnect()
75
+
76
+ databaseNode.child(getCurrentBackendUser()?.uid)
77
+ .child(ALARM_STATE )
78
+ .setValue(RemoteAlarmStateModel (true , false , true ))
79
+ .addOnSuccessListener { emitter.onSuccess(true ) }
80
+ }
61
81
62
82
override fun isLoggedInToBackend (): Single <Boolean > =
63
83
Single .just(getCurrentBackendUser() != null )
@@ -119,7 +139,8 @@ private fun DataSnapshot.getArmingState() = (this.value as Boolean).toArmingStat
119
139
120
140
class RemoteAlarmStateModel (
121
141
val active : Boolean ,
122
- val triggered : Boolean
142
+ val triggered : Boolean ,
143
+ val connected : Boolean
123
144
)
124
145
125
146
class SecurityIncidentResponse (
0 commit comments