1
1
package pl.rmakowiecki.smartalarmcore.remote
2
2
3
+ import android.provider.Settings
3
4
import com.google.firebase.auth.FirebaseAuth
5
+ import com.google.firebase.auth.FirebaseUser
4
6
import com.google.firebase.database.DataSnapshot
5
7
import com.google.firebase.database.DatabaseError
6
8
import com.google.firebase.database.FirebaseDatabase
7
9
import com.google.firebase.database.ValueEventListener
8
10
import io.reactivex.Observable
9
11
import io.reactivex.Single
12
+ import io.reactivex.SingleEmitter
13
+ import pl.rmakowiecki.smartalarmcore.AlarmActivity
10
14
import pl.rmakowiecki.smartalarmcore.AlarmArmingState
11
15
import pl.rmakowiecki.smartalarmcore.AlarmTriggerState
12
16
import pl.rmakowiecki.smartalarmcore.extensions.logD
17
+ import pl.rmakowiecki.smartalarmcore.extensions.printStackTrace
13
18
import pl.rmakowiecki.smartalarmcore.toArmingState
14
19
15
- class AlarmBackendInteractor : AlarmBackendContract {
20
+ class AlarmBackendInteractor ( val activity : AlarmActivity ) : AlarmBackendContract {
16
21
17
22
private val databaseNode = FirebaseDatabase
18
23
.getInstance()
19
24
.reference
20
25
21
26
override fun signInToBackend (): Single <Boolean > = Single .create { emitter ->
27
+
28
+ FirebaseAuth .getInstance().signOut()
29
+ logD(Settings .Secure .getString(activity.contentResolver, Settings .Secure .ANDROID_ID ))
30
+
22
31
getCurrentBackendUser()?.let {
23
32
emitter.onSuccess(true )
24
33
} ? : FirebaseAuth .getInstance()
25
34
.signInAnonymously()
26
- .addOnCompleteListener { emitter.onSuccess(it.isSuccessful) }
35
+ .addOnSuccessListener { signUpAsAuthorizedUser(it.user, emitter) }
36
+ }
37
+
38
+ private fun signUpAsAuthorizedUser (firebaseUser : FirebaseUser , emitter : SingleEmitter <Boolean >) {
39
+ logD(firebaseUser.uid, " UID USERA" )
40
+ FirebaseAuth .getInstance().createUserWithEmailAndPassword(
41
+ " ${firebaseUser.uid} @smarthome.com" ,
42
+ Settings .Secure .getString(activity.contentResolver, Settings .Secure .ANDROID_ID )
43
+ ).addOnSuccessListener {
44
+ initializeCoreDeviceNoSqlModel(emitter)
45
+ }.addOnFailureListener { printStackTrace(it) }
27
46
}
28
47
48
+ private fun initializeCoreDeviceNoSqlModel (emitter : SingleEmitter <Boolean >) = databaseNode
49
+ .child(getCurrentBackendUser()?.uid)
50
+ .setValue(RemoteAlarmStateModel (true , false ))
51
+ .addOnSuccessListener { emitter.onSuccess(true ) }
52
+
29
53
override fun isLoggedInToBackend (): Single <Boolean > =
30
54
Single .just(getCurrentBackendUser() != null )
31
55
32
- private fun getCurrentBackendUser () = FirebaseAuth .getInstance().currentUser
56
+ private fun getCurrentBackendUser (): FirebaseUser ? {
57
+ logD(FirebaseAuth .getInstance().currentUser, " GET UID" )
58
+ return FirebaseAuth .getInstance().currentUser
59
+ }
33
60
34
61
override fun observeAlarmArmingState (): Observable <AlarmArmingState > = Observable .create { emitter ->
35
62
val valueListener = object : ValueEventListener {
@@ -38,19 +65,25 @@ class AlarmBackendInteractor : AlarmBackendContract {
38
65
override fun onCancelled (databaseError : DatabaseError ? ) = emitter.onComplete()
39
66
}
40
67
41
- databaseNode.child(Nodes .ALARM_ARMING ).addValueEventListener(valueListener)
68
+ val alarmArmingNode = databaseNode
69
+ .child(getCurrentBackendUser()?.uid)
70
+ .child(Nodes .ALARM_ARMING )
71
+
72
+ alarmArmingNode.addValueEventListener(valueListener)
42
73
43
74
emitter.setCancellable {
44
- databaseNode.child( Nodes . ALARM_ARMING ) .removeEventListener(valueListener)
75
+ alarmArmingNode .removeEventListener(valueListener)
45
76
}
46
77
}
47
78
48
79
override fun updateAlarmState (alarmState : AlarmTriggerState ) {
49
- logD( " Updating trigger value on server " )
50
- databaseNode .child(Nodes .ALARM_TRIGGER )
80
+ databaseNode.child(getCurrentBackendUser()?.uid )
81
+ .child(Nodes .ALARM_TRIGGER )
51
82
.setValue(alarmState.toBoolean())
52
83
.addOnCompleteListener { }
53
84
}
54
85
}
55
86
56
- private fun DataSnapshot.getArmingState () = (this .value as Boolean ).toArmingState()
87
+ private fun DataSnapshot.getArmingState () = (this .value as Boolean ).toArmingState()
88
+
89
+ class RemoteAlarmStateModel (val active : Boolean , val triggered : Boolean )
0 commit comments