Skip to content

Commit cf144b4

Browse files
SUPERCILEXsamtstern
authored andcommitted
Update documentation and sample for #544 (#567)
1 parent ac5c849 commit cf144b4

File tree

5 files changed

+229
-154
lines changed

5 files changed

+229
-154
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@
3030
<activity
3131
android:name=".database.ChatActivity"
3232
android:label="@string/name_chat"/>
33+
<activity
34+
android:name=".database.ChatIndexActivity"
35+
android:label="@string/name_chat"/>
3336

3437
<!-- Auth UI demo -->
3538
<activity

app/src/main/java/com/firebase/uidemo/database/ChatActivity.java

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,23 @@
3232
import com.google.android.gms.tasks.OnSuccessListener;
3333
import com.google.firebase.auth.AuthResult;
3434
import com.google.firebase.auth.FirebaseAuth;
35-
import com.google.firebase.auth.FirebaseUser;
3635
import com.google.firebase.database.DatabaseError;
3736
import com.google.firebase.database.DatabaseReference;
3837
import com.google.firebase.database.FirebaseDatabase;
3938
import com.google.firebase.database.Query;
4039

41-
public class ChatActivity extends AppCompatActivity implements FirebaseAuth.AuthStateListener {
40+
public class ChatActivity extends AppCompatActivity implements FirebaseAuth.AuthStateListener, View.OnClickListener {
4241
private static final String TAG = "RecyclerViewDemo";
4342

4443
private FirebaseAuth mAuth;
45-
private DatabaseReference mRef;
46-
private DatabaseReference mChatRef;
44+
protected DatabaseReference mChatRef;
4745
private Button mSendButton;
48-
private EditText mMessageEdit;
46+
protected EditText mMessageEdit;
4947

5048
private RecyclerView mMessages;
5149
private LinearLayoutManager mManager;
52-
private FirebaseRecyclerAdapter<Chat, ChatHolder> mAdapter;
53-
private TextView mEmptyListMessage;
50+
protected FirebaseRecyclerAdapter<Chat, ChatHolder> mAdapter;
51+
protected TextView mEmptyListMessage;
5452

5553
@Override
5654
protected void onCreate(Bundle savedInstanceState) {
@@ -64,28 +62,9 @@ protected void onCreate(Bundle savedInstanceState) {
6462
mMessageEdit = (EditText) findViewById(R.id.messageEdit);
6563
mEmptyListMessage = (TextView) findViewById(R.id.emptyTextView);
6664

67-
mRef = FirebaseDatabase.getInstance().getReference();
68-
mChatRef = mRef.child("chats");
65+
mChatRef = FirebaseDatabase.getInstance().getReference().child("chats");
6966

70-
mSendButton.setOnClickListener(new View.OnClickListener() {
71-
@Override
72-
public void onClick(View v) {
73-
String uid = mAuth.getCurrentUser().getUid();
74-
String name = "User " + uid.substring(0, 6);
75-
76-
Chat chat = new Chat(name, mMessageEdit.getText().toString(), uid);
77-
mChatRef.push().setValue(chat, new DatabaseReference.CompletionListener() {
78-
@Override
79-
public void onComplete(DatabaseError error, DatabaseReference reference) {
80-
if (error != null) {
81-
Log.e(TAG, "Failed to write message", error.toException());
82-
}
83-
}
84-
});
85-
86-
mMessageEdit.setText("");
87-
}
88-
});
67+
mSendButton.setOnClickListener(this);
8968

9069
mManager = new LinearLayoutManager(this);
9170
mManager.setReverseLayout(false);
@@ -126,33 +105,30 @@ public void onDestroy() {
126105
}
127106

128107
@Override
129-
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
130-
updateUI();
131-
}
108+
public void onClick(View v) {
109+
String uid = mAuth.getCurrentUser().getUid();
110+
String name = "User " + uid.substring(0, 6);
132111

133-
private void attachRecyclerViewAdapter() {
134-
Query lastFifty = mChatRef.limitToLast(50);
135-
mAdapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(
136-
Chat.class, R.layout.message, ChatHolder.class, lastFifty) {
112+
Chat chat = new Chat(name, mMessageEdit.getText().toString(), uid);
113+
mChatRef.push().setValue(chat, new DatabaseReference.CompletionListener() {
137114
@Override
138-
public void populateViewHolder(ChatHolder holder, Chat chat, int position) {
139-
holder.setName(chat.getName());
140-
holder.setText(chat.getMessage());
141-
142-
FirebaseUser currentUser = mAuth.getCurrentUser();
143-
if (currentUser != null && chat.getUid().equals(currentUser.getUid())) {
144-
holder.setIsSender(true);
145-
} else {
146-
holder.setIsSender(false);
115+
public void onComplete(DatabaseError error, DatabaseReference reference) {
116+
if (error != null) {
117+
Log.e(TAG, "Failed to write message", error.toException());
147118
}
148119
}
120+
});
149121

150-
@Override
151-
public void onDataChanged() {
152-
// If there are no chat messages, show a view that invites the user to add a message.
153-
mEmptyListMessage.setVisibility(mAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
154-
}
155-
};
122+
mMessageEdit.setText("");
123+
}
124+
125+
@Override
126+
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
127+
updateUI();
128+
}
129+
130+
private void attachRecyclerViewAdapter() {
131+
mAdapter = getAdapter();
156132

157133
// Scroll to bottom on new messages
158134
mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@@ -165,6 +141,26 @@ public void onItemRangeInserted(int positionStart, int itemCount) {
165141
mMessages.setAdapter(mAdapter);
166142
}
167143

144+
protected FirebaseRecyclerAdapter<Chat, ChatHolder> getAdapter() {
145+
Query lastFifty = mChatRef.limitToLast(50);
146+
return new FirebaseRecyclerAdapter<Chat, ChatHolder>(
147+
Chat.class,
148+
R.layout.message,
149+
ChatHolder.class,
150+
lastFifty) {
151+
@Override
152+
public void populateViewHolder(ChatHolder holder, Chat chat, int position) {
153+
holder.bind(chat);
154+
}
155+
156+
@Override
157+
public void onDataChanged() {
158+
// If there are no chat messages, show a view that invites the user to add a message.
159+
mEmptyListMessage.setVisibility(getItemCount() == 0 ? View.VISIBLE : View.GONE);
160+
}
161+
};
162+
}
163+
168164
private void signInAnonymously() {
169165
Toast.makeText(this, "Signing in...", Toast.LENGTH_SHORT).show();
170166
mAuth.signInAnonymously()

app/src/main/java/com/firebase/uidemo/database/ChatHolder.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import android.widget.TextView;
1414

1515
import com.firebase.uidemo.R;
16+
import com.google.firebase.auth.FirebaseAuth;
17+
import com.google.firebase.auth.FirebaseUser;
1618

1719
public class ChatHolder extends RecyclerView.ViewHolder {
1820
private final TextView mNameField;
@@ -36,7 +38,23 @@ public ChatHolder(View itemView) {
3638
mGray300 = ContextCompat.getColor(itemView.getContext(), R.color.material_gray_300);
3739
}
3840

39-
public void setIsSender(boolean isSender) {
41+
public void bind(Chat chat) {
42+
setName(chat.getName());
43+
setText(chat.getMessage());
44+
45+
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
46+
setIsSender(currentUser != null && chat.getUid().equals(currentUser.getUid()));
47+
}
48+
49+
private void setName(String name) {
50+
mNameField.setText(name);
51+
}
52+
53+
private void setText(String text) {
54+
mTextField.setText(text);
55+
}
56+
57+
private void setIsSender(boolean isSender) {
4058
final int color;
4159
if (isSender) {
4260
color = mGreen300;
@@ -56,12 +74,4 @@ public void setIsSender(boolean isSender) {
5674
((RotateDrawable) mRightArrow.getBackground()).getDrawable()
5775
.setColorFilter(color, PorterDuff.Mode.SRC);
5876
}
59-
60-
public void setName(String name) {
61-
mNameField.setText(name);
62-
}
63-
64-
public void setText(String text) {
65-
mTextField.setText(text);
66-
}
6777
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.firebase.uidemo.database;
2+
3+
import android.os.Bundle;
4+
import android.view.View;
5+
6+
import com.firebase.ui.database.FirebaseIndexRecyclerAdapter;
7+
import com.firebase.ui.database.FirebaseRecyclerAdapter;
8+
import com.firebase.uidemo.R;
9+
import com.google.firebase.auth.FirebaseAuth;
10+
import com.google.firebase.database.DataSnapshot;
11+
import com.google.firebase.database.DatabaseReference;
12+
import com.google.firebase.database.FirebaseDatabase;
13+
14+
public class ChatIndexActivity extends ChatActivity {
15+
private DatabaseReference mChatIndicesRef;
16+
17+
@Override
18+
protected void onCreate(Bundle savedInstanceState) {
19+
super.onCreate(savedInstanceState);
20+
mChatIndicesRef = FirebaseDatabase.getInstance().getReference().child("chatIndices");
21+
}
22+
23+
@Override
24+
public void onClick(View v) {
25+
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
26+
String name = "User " + uid.substring(0, 6);
27+
Chat chat = new Chat(name, mMessageEdit.getText().toString(), uid);
28+
29+
DatabaseReference chatRef = mChatRef.push();
30+
mChatIndicesRef.child(chatRef.getKey()).setValue(true);
31+
chatRef.setValue(chat);
32+
33+
mMessageEdit.setText("");
34+
}
35+
36+
@Override
37+
protected FirebaseRecyclerAdapter<Chat, ChatHolder> getAdapter() {
38+
return new FirebaseIndexRecyclerAdapter<Chat, ChatHolder>(
39+
Chat.class,
40+
R.layout.message,
41+
ChatHolder.class,
42+
mChatIndicesRef.limitToLast(50),
43+
mChatRef) {
44+
@Override
45+
public void populateViewHolder(ChatHolder holder, Chat chat, int position) {
46+
holder.bind(chat);
47+
}
48+
49+
@Override
50+
public void onChildChanged(EventType type,
51+
DataSnapshot snapshot,
52+
int index,
53+
int oldIndex) {
54+
super.onChildChanged(type, snapshot, index, oldIndex);
55+
56+
// TODO temporary fix for https://github.com/firebase/FirebaseUI-Android/issues/546
57+
onDataChanged();
58+
}
59+
60+
@Override
61+
public void onDataChanged() {
62+
// If there are no chat messages, show a view that invites the user to add a message.
63+
mEmptyListMessage.setVisibility(getItemCount() == 0 ? View.VISIBLE : View.GONE);
64+
}
65+
};
66+
}
67+
}

0 commit comments

Comments
 (0)