Skip to content

Commit 5778e79

Browse files
committed
Implement connectivity presence system
1 parent ca70707 commit 5778e79

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

app/src/main/java/pl/rmakowiecki/smartalarmcore/remote/AlarmBackendInteractor.kt

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import pl.rmakowiecki.smartalarmcore.remote.Nodes.ALARM_STATE
2121
import pl.rmakowiecki.smartalarmcore.remote.Nodes.ALARM_TRIGGER
2222
import pl.rmakowiecki.smartalarmcore.remote.Nodes.CORE_DEVICE_DIRECTORY
2323
import pl.rmakowiecki.smartalarmcore.remote.Nodes.IMAGES_DIRECTORY
24+
import pl.rmakowiecki.smartalarmcore.remote.Nodes.PRESENCE_NODE
2425
import pl.rmakowiecki.smartalarmcore.toArmingState
2526

2627
class AlarmBackendInteractor(private val activity: AlarmActivity) : AlarmBackendContract {
@@ -34,16 +35,32 @@ class AlarmBackendInteractor(private val activity: AlarmActivity) : AlarmBackend
3435
.getReferenceFromUrl("gs://smartalarmcore.appspot.com")
3536

3637
override fun signInToBackend(): Single<Boolean> = Single.create { emitter ->
38+
reportAbsenceOnDisconnect()
3739

3840
logD(Settings.Secure.getString(activity.contentResolver, Settings.Secure.ANDROID_ID))
3941

4042
getCurrentBackendUser()?.let {
43+
reportPresence()
4144
emitter.onSuccess(true)
4245
} ?: FirebaseAuth.getInstance()
4346
.signInAnonymously()
4447
.addOnSuccessListener { signUpAsAuthorizedUser(it.user, emitter) }
4548
}
4649

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+
4764
private fun signUpAsAuthorizedUser(firebaseUser: FirebaseUser, emitter: SingleEmitter<Boolean>) {
4865
FirebaseAuth.getInstance().createUserWithEmailAndPassword(
4966
"${firebaseUser.uid}@smarthome.com",
@@ -53,11 +70,14 @@ class AlarmBackendInteractor(private val activity: AlarmActivity) : AlarmBackend
5370
}.addOnFailureListener(::printStackTrace)
5471
}
5572

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+
}
6181

6282
override fun isLoggedInToBackend(): Single<Boolean> =
6383
Single.just(getCurrentBackendUser() != null)
@@ -119,7 +139,8 @@ private fun DataSnapshot.getArmingState() = (this.value as Boolean).toArmingStat
119139

120140
class RemoteAlarmStateModel(
121141
val active: Boolean,
122-
val triggered: Boolean
142+
val triggered: Boolean,
143+
val connected: Boolean
123144
)
124145

125146
class SecurityIncidentResponse(

app/src/main/java/pl/rmakowiecki/smartalarmcore/remote/Constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ object Nodes {
77
const val CORE_DEVICE_DIRECTORY = "core_assets"
88
const val IMAGES_DIRECTORY = "images"
99
const val INCIDENTS = "incidents"
10+
const val PRESENCE_NODE = "connected"
1011
}

0 commit comments

Comments
 (0)