/
OfflineActivity.kt
177 lines (146 loc) · 6.98 KB
/
OfflineActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package com.google.firebase.referencecode.database.kotlin
import androidx.appcompat.app.AppCompatActivity
import android.util.Log
import com.google.firebase.database.ChildEventListener
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ServerValue
import com.google.firebase.database.ValueEventListener
class OfflineActivity : AppCompatActivity() {
private fun enablePersistence() {
// [START rtdb_enable_persistence]
FirebaseDatabase.getInstance().setPersistenceEnabled(true)
// [END rtdb_enable_persistence]
}
private fun keepSynced() {
// [START rtdb_keep_synced]
val scoresRef = FirebaseDatabase.getInstance().getReference("scores")
scoresRef.keepSynced(true)
// [END rtdb_keep_synced]
// [START rtdb_undo_keep_synced]
scoresRef.keepSynced(false)
// [END rtdb_undo_keep_synced]
}
private fun queryRecentScores() {
// [START rtdb_query_recent_scores]
val scoresRef = FirebaseDatabase.getInstance().getReference("scores")
scoresRef.orderByValue().limitToLast(4).addChildEventListener(object : ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, previousChild: String?) {
Log.d(TAG, "The ${snapshot.key} dinosaur's score is ${snapshot.value}")
}
// [START_EXCLUDE]
override fun onChildRemoved(dataSnapshot: DataSnapshot) = Unit
override fun onChildMoved(dataSnapshot: DataSnapshot, s: String?) = Unit
override fun onCancelled(databaseError: DatabaseError) = Unit
override fun onChildChanged(dataSnapshot: DataSnapshot, s: String?) = Unit
// [END_EXCLUDE]
})
// [END rtdb_query_recent_scores]
// [START rtdb_query_recent_scores_overlap]
scoresRef.orderByValue().limitToLast(2).addChildEventListener(object : ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot, previousChild: String?) {
Log.d(TAG, "The ${snapshot.key} dinosaur's score is ${snapshot.value}")
}
// [START_EXCLUDE]
override fun onChildRemoved(dataSnapshot: DataSnapshot) = Unit
override fun onChildMoved(dataSnapshot: DataSnapshot, s: String?) = Unit
override fun onCancelled(databaseError: DatabaseError) = Unit
override fun onChildChanged(dataSnapshot: DataSnapshot, s: String?) = Unit
// [END_EXCLUDE]
})
// [END rtdb_query_recent_scores_overlap]
}
private fun onDisconnect() {
// [START rtdb_on_disconnect_set]
val presenceRef = FirebaseDatabase.getInstance().getReference("disconnectmessage")
// Write a string when this client loses connection
presenceRef.onDisconnect().setValue("I disconnected!")
// [END rtdb_on_disconnect_set]
// [START rtdb_on_disconnect_remove]
presenceRef.onDisconnect().removeValue { error, reference ->
error?.let {
Log.d(TAG, "could not establish onDisconnect event: ${error.message}")
}
}
// [END rtdb_on_disconnect_remove]
// [START rtdb_on_disconnect_cancel]
val onDisconnectRef = presenceRef.onDisconnect()
onDisconnectRef.setValue("I disconnected")
// ...
// some time later when we change our minds
// ...
onDisconnectRef.cancel()
// [END rtdb_on_disconnect_cancel]
}
private fun getConnectionState() {
// [START rtdb_listen_connected]
val connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected")
connectedRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val connected = snapshot.getValue(Boolean::class.java) ?: false
if (connected) {
Log.d(TAG, "connected")
} else {
Log.d(TAG, "not connected")
}
}
override fun onCancelled(error: DatabaseError) {
Log.w(TAG, "Listener was cancelled")
}
})
// [END rtdb_listen_connected]
}
private fun disconnectionTimestamp() {
// [START rtdb_on_disconnect_timestamp]
val userLastOnlineRef = FirebaseDatabase.getInstance().getReference("users/joe/lastOnline")
userLastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP)
// [END rtdb_on_disconnect_timestamp]
}
private fun getServerTimeOffset() {
// [START rtdb_server_time_offset]
val offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset")
offsetRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val offset = snapshot.getValue(Double::class.java) ?: 0.0
val estimatedServerTimeMs = System.currentTimeMillis() + offset
}
override fun onCancelled(error: DatabaseError) {
Log.w(TAG, "Listener was cancelled")
}
})
// [END rtdb_server_time_offset]
}
private fun fullConnectionExample() {
// [START rtdb_full_connection_example]
// Since I can connect from multiple devices, we store each connection instance separately
// any time that connectionsRef's value is null (i.e. has no children) I am offline
val database = FirebaseDatabase.getInstance()
val myConnectionsRef = database.getReference("users/joe/connections")
// Stores the timestamp of my last disconnect (the last time I was seen online)
val lastOnlineRef = database.getReference("/users/joe/lastOnline")
val connectedRef = database.getReference(".info/connected")
connectedRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
val connected = snapshot.getValue(Boolean::class.java) ?: false
if (connected) {
val con = myConnectionsRef.push()
// When this device disconnects, remove it
con.onDisconnect().removeValue()
// When I disconnect, update the last time I was seen online
lastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP)
// Add this device to my connections list
// this value could contain info about the device or a timestamp too
con.setValue(java.lang.Boolean.TRUE)
}
}
override fun onCancelled(error: DatabaseError) {
Log.w(TAG, "Listener was cancelled at .info/connected")
}
})
// [END rtdb_full_connection_example]
}
companion object {
private val TAG = "OfflineActivity"
}
}