Skip to content

Commit ea983b3

Browse files
committed
Update firebase alarm function & restrict alarm notifications to subscribed channel
1 parent 05ee8c9 commit ea983b3

File tree

7 files changed

+56
-26
lines changed

7 files changed

+56
-26
lines changed

app/src/main/java/pl/rmakowiecki/smartalarmcore/Activity.kt

Lines changed: 0 additions & 7 deletions
This file was deleted.

app/src/main/java/pl/rmakowiecki/smartalarmcore/AlarmActivity.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@ class AlarmActivity : AppCompatActivity() {
1818

1919
printWifiNetworkStatus()
2020
alarmController = initSystemController()
21-
alarmController.observeAlarm()
2221
}
2322

2423
private fun initSystemController() = AlarmController(
2524
BeamBreakDetectorPeripheryContract.create(),
26-
AlarmBackendContract.create(),
25+
AlarmBackendContract.create(this),
2726
UsbSetupProviderContract.create(this)
2827
)
2928

app/src/main/java/pl/rmakowiecki/smartalarmcore/AlarmController.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@ class AlarmController(
1919

2020
init {
2121
connectToBackend()
22-
usbSetupProviderContract.registerBroadcastListener()
22+
usbSetupProviderContract.registerBroadcastListener({ }, { })
2323
}
2424

2525
private fun connectToBackend() {
2626
backendConnectionDisposable = backendInteractor
2727
.signInToBackend()
2828
.applyIoSchedulers()
29-
.subscribe()
29+
.subscribeBy(
30+
onSuccess = { observeAlarm() }
31+
)
3032
}
3133

32-
fun observeAlarm() {
34+
private fun observeAlarm() {
3335
alarmArmingDisposable = backendInteractor
3436
.observeAlarmArmingState()
3537
.applyIoSchedulers()

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package pl.rmakowiecki.smartalarmcore.remote
22

33
import io.reactivex.Observable
44
import io.reactivex.Single
5+
import pl.rmakowiecki.smartalarmcore.AlarmActivity
56
import pl.rmakowiecki.smartalarmcore.AlarmArmingState
67
import pl.rmakowiecki.smartalarmcore.AlarmTriggerState
78

@@ -12,7 +13,7 @@ interface AlarmBackendContract {
1213
fun updateAlarmState(alarmState: AlarmTriggerState)
1314

1415
companion object {
15-
fun create() = AlarmBackendInteractor()
16+
fun create(activity: AlarmActivity) = AlarmBackendInteractor(activity)
1617
}
1718
}
1819

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,62 @@
11
package pl.rmakowiecki.smartalarmcore.remote
22

3+
import android.provider.Settings
34
import com.google.firebase.auth.FirebaseAuth
5+
import com.google.firebase.auth.FirebaseUser
46
import com.google.firebase.database.DataSnapshot
57
import com.google.firebase.database.DatabaseError
68
import com.google.firebase.database.FirebaseDatabase
79
import com.google.firebase.database.ValueEventListener
810
import io.reactivex.Observable
911
import io.reactivex.Single
12+
import io.reactivex.SingleEmitter
13+
import pl.rmakowiecki.smartalarmcore.AlarmActivity
1014
import pl.rmakowiecki.smartalarmcore.AlarmArmingState
1115
import pl.rmakowiecki.smartalarmcore.AlarmTriggerState
1216
import pl.rmakowiecki.smartalarmcore.extensions.logD
17+
import pl.rmakowiecki.smartalarmcore.extensions.printStackTrace
1318
import pl.rmakowiecki.smartalarmcore.toArmingState
1419

15-
class AlarmBackendInteractor : AlarmBackendContract {
20+
class AlarmBackendInteractor(val activity: AlarmActivity) : AlarmBackendContract {
1621

1722
private val databaseNode = FirebaseDatabase
1823
.getInstance()
1924
.reference
2025

2126
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+
2231
getCurrentBackendUser()?.let {
2332
emitter.onSuccess(true)
2433
} ?: FirebaseAuth.getInstance()
2534
.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) }
2746
}
2847

48+
private fun initializeCoreDeviceNoSqlModel(emitter: SingleEmitter<Boolean>) = databaseNode
49+
.child(getCurrentBackendUser()?.uid)
50+
.setValue(RemoteAlarmStateModel(true, false))
51+
.addOnSuccessListener { emitter.onSuccess(true) }
52+
2953
override fun isLoggedInToBackend(): Single<Boolean> =
3054
Single.just(getCurrentBackendUser() != null)
3155

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

3461
override fun observeAlarmArmingState(): Observable<AlarmArmingState> = Observable.create { emitter ->
3562
val valueListener = object : ValueEventListener {
@@ -38,19 +65,25 @@ class AlarmBackendInteractor : AlarmBackendContract {
3865
override fun onCancelled(databaseError: DatabaseError?) = emitter.onComplete()
3966
}
4067

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)
4273

4374
emitter.setCancellable {
44-
databaseNode.child(Nodes.ALARM_ARMING).removeEventListener(valueListener)
75+
alarmArmingNode.removeEventListener(valueListener)
4576
}
4677
}
4778

4879
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)
5182
.setValue(alarmState.toBoolean())
5283
.addOnCompleteListener { }
5384
}
5485
}
5586

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)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package pl.rmakowiecki.smartalarmcore.remote
22

33
object Nodes {
4-
const val ALARM_TRIGGER = "trigger"
4+
const val ALARM_TRIGGER = "triggered"
55
const val ALARM_ARMING = "active"
66
}

functions/index.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@ const functions = require('firebase-functions');
22
const admin = require('firebase-admin');
33
admin.initializeApp(functions.config().firebase)
44

5-
exports.sendAlarmNotification = functions.database.ref('/trigger').onWrite(event => {
5+
exports.sendAlarmNotification = functions.database.ref('/{currentCoreDeviceUid}/triggered').onWrite(event => {
66
const data = event.data;
7+
const coreUid = event.params.currentCoreDeviceUid
8+
79
console.log('Alarm state event triggered');
810
if (!data.changed() || data.val() === false) {
911
console.log('Initial conditions for launching the alarm were not met');
1012
return;
1113
}
1214

13-
const alarmArmingStatePromise = admin.database().ref('/active').once('value');
15+
const alarmArmingStatePromise = admin.database().ref(`/${coreUid}/active`).once('value');
1416

1517
return alarmArmingStatePromise.then(alarmArmingStateSnapshot => {
1618

@@ -33,14 +35,14 @@ exports.sendAlarmNotification = functions.database.ref('/trigger').onWrite(event
3335
};
3436

3537
console.log('Alarm triggered!');
36-
return admin.messaging().sendToTopic("Alarm_Notifications", payload, options).then(response => {
38+
return admin.messaging().sendToTopic(coreUid, payload, options).then(response => {
3739
// For each message check if there was an error.
3840
const tokensToRemove = [];
3941
response.results.forEach((result, index) => {
4042
const error = result.error;
4143
if (error) {
4244
console.error('Failure sending notification to', tokens[index], error);
43-
// Cleanup the tokens who are not registered anymore.
45+
// Cleanup the tokens which are not registered anymore.
4446
if (error.code === 'messaging/invalid-registration-token' || error.code === 'messaging/registration-token-not-registered') {
4547
console.log("registration error occurred");
4648
}

0 commit comments

Comments
 (0)