11
11
import android .support .v7 .widget .RecyclerView ;
12
12
import android .util .Log ;
13
13
import android .view .Gravity ;
14
- import android .view .Menu ;
15
- import android .view .MenuInflater ;
16
- import android .view .MenuItem ;
17
14
import android .view .View ;
18
15
import android .widget .Button ;
19
16
import android .widget .EditText ;
@@ -45,6 +42,7 @@ public class ChatActivity extends AppCompatActivity {
45
42
private EditText mMessageEdit ;
46
43
47
44
private RecyclerView mMessages ;
45
+ private LinearLayoutManager mManager ;
48
46
private FirebaseRecyclerAdapter <Chat , ChatHolder > mRecyclerViewAdapter ;
49
47
50
48
@ Override
@@ -56,7 +54,7 @@ protected void onCreate(Bundle savedInstanceState) {
56
54
mAuth .addAuthStateListener (new FirebaseAuth .AuthStateListener () {
57
55
@ Override
58
56
public void onAuthStateChanged (@ NonNull FirebaseAuth firebaseAuth ) {
59
- invalidateOptionsMenu ();
57
+ updateUI ();
60
58
}
61
59
});
62
60
@@ -88,17 +86,36 @@ public void onComplete(DatabaseError databaseError, DatabaseReference reference)
88
86
89
87
mMessages = (RecyclerView ) findViewById (R .id .messagesList );
90
88
91
- LinearLayoutManager manager = new LinearLayoutManager (this );
92
- manager .setReverseLayout (false );
89
+ mManager = new LinearLayoutManager (this );
90
+ mManager .setReverseLayout (false );
93
91
94
92
mMessages .setHasFixedSize (false );
95
- mMessages .setLayoutManager (manager );
93
+ mMessages .setLayoutManager (mManager );
96
94
}
97
95
98
96
@ Override
99
97
public void onStart () {
100
98
super .onStart ();
101
99
100
+ // Default Database rules do not allow unauthenticated reads, so we need to
101
+ // sign in before attaching the RecyclerView adapter otherwise the Adapter will
102
+ // not be able to read any data from the Database.
103
+ if (!isSignedIn ()) {
104
+ signInAnonymously ();
105
+ } else {
106
+ attachRecyclerViewAdapter ();
107
+ }
108
+ }
109
+
110
+ @ Override
111
+ public void onStop () {
112
+ super .onStop ();
113
+ if (mRecyclerViewAdapter != null ) {
114
+ mRecyclerViewAdapter .cleanup ();
115
+ }
116
+ }
117
+
118
+ private void attachRecyclerViewAdapter () {
102
119
mRecyclerViewAdapter = new FirebaseRecyclerAdapter <Chat , ChatHolder >(
103
120
Chat .class , R .layout .message , ChatHolder .class , mChatRef ) {
104
121
@@ -116,49 +133,19 @@ public void populateViewHolder(ChatHolder chatView, Chat chat, int position) {
116
133
}
117
134
};
118
135
119
- mMessages .setAdapter (mRecyclerViewAdapter );
120
- }
121
-
122
- @ Override
123
- public void onStop () {
124
- super .onStop ();
125
-
126
- mRecyclerViewAdapter .cleanup ();
127
- }
128
-
129
- @ Override
130
- public boolean onCreateOptionsMenu (Menu menu ) {
131
- MenuInflater inflater = getMenuInflater ();
132
- inflater .inflate (R .menu .chat_login_menu , menu );
133
- return true ;
134
- }
135
-
136
- @ Override
137
- public boolean onPrepareOptionsMenu (Menu menu ) {
138
- menu .findItem (R .id .login_menu_item ).setVisible (!isSignedIn ());
139
- menu .findItem (R .id .logout_menu_item ).setVisible (isSignedIn ());
140
-
141
- mSendButton .setEnabled (isSignedIn ());
142
- mMessageEdit .setEnabled (isSignedIn ());
143
-
144
- return true ;
145
- }
146
-
147
- @ Override
148
- public boolean onOptionsItemSelected (MenuItem item ) {
149
- switch (item .getItemId ()) {
150
- case R .id .login_menu_item :
151
- signInAnonymously ();
152
- return true ;
153
- case R .id .logout_menu_item :
154
- mAuth .signOut ();
155
- return true ;
156
- }
136
+ // Scroll to bottom on new messages
137
+ mRecyclerViewAdapter .registerAdapterDataObserver (new RecyclerView .AdapterDataObserver () {
138
+ @ Override
139
+ public void onItemRangeInserted (int positionStart , int itemCount ) {
140
+ mManager .smoothScrollToPosition (mMessages , null , mRecyclerViewAdapter .getItemCount ());
141
+ }
142
+ });
157
143
158
- return super . onOptionsItemSelected ( item );
144
+ mMessages . setAdapter ( mRecyclerViewAdapter );
159
145
}
160
146
161
147
private void signInAnonymously () {
148
+ Toast .makeText (this , "Signing in..." , Toast .LENGTH_SHORT ).show ();
162
149
mAuth .signInAnonymously ()
163
150
.addOnCompleteListener (this , new OnCompleteListener <AuthResult >() {
164
151
@ Override
@@ -167,6 +154,7 @@ public void onComplete(@NonNull Task<AuthResult> task) {
167
154
if (task .isSuccessful ()) {
168
155
Toast .makeText (ChatActivity .this , "Signed In" ,
169
156
Toast .LENGTH_SHORT ).show ();
157
+ attachRecyclerViewAdapter ();
170
158
} else {
171
159
Toast .makeText (ChatActivity .this , "Sign In Failed" ,
172
160
Toast .LENGTH_SHORT ).show ();
@@ -179,6 +167,12 @@ public boolean isSignedIn() {
179
167
return (mAuth .getCurrentUser () != null );
180
168
}
181
169
170
+ public void updateUI () {
171
+ // Sending only allowed when signed in
172
+ mSendButton .setEnabled (isSignedIn ());
173
+ mMessageEdit .setEnabled (isSignedIn ());
174
+ }
175
+
182
176
public static class Chat {
183
177
184
178
String name ;
0 commit comments