Skip to content

Commit 6cc02c9

Browse files
committed
Offline db snippets
Change-Id: I8a40920dba45ed47986c46abb95f9a06f0fd40ca
1 parent 6184605 commit 6cc02c9

File tree

3 files changed

+378
-0
lines changed

3 files changed

+378
-0
lines changed

database/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
</activity>
1818
<activity android:name=".MainActivity" />
1919
<activity android:name=".kotlin.MainActivity" />
20+
<activity android:name=".OfflineActivity"></activity>
2021
</application>
2122

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

0 commit comments

Comments
 (0)