11package com .cswala .cswala .Fragments ;
22
3+ import android .content .Context ;
34import android .os .Bundle ;
4-
5- import androidx .fragment .app .Fragment ;
6-
5+ import android .text .Editable ;
6+ import android .text .TextWatcher ;
77import android .view .LayoutInflater ;
88import android .view .View ;
99import android .view .ViewGroup ;
10+ import android .view .inputmethod .InputMethodManager ;
11+ import android .widget .EditText ;
12+ import android .widget .FrameLayout ;
13+ import android .widget .LinearLayout ;
14+
15+ import androidx .annotation .NonNull ;
16+ import androidx .annotation .Nullable ;
17+ import androidx .appcompat .widget .AppCompatImageButton ;
18+ import androidx .fragment .app .Fragment ;
19+ import androidx .recyclerview .widget .LinearLayoutManager ;
20+ import androidx .recyclerview .widget .RecyclerView ;
1021
1122import com .cswala .cswala .R ;
23+ import com .cswala .cswala .Adapters .MessageAdapter ;
24+ import com .cswala .cswala .observer .ScrollToBottomObserver ;
25+ import com .cswala .cswala .Models .Message ;
26+ import com .cswala .cswala .utils .MessageListener ;
27+ import com .firebase .ui .database .FirebaseRecyclerOptions ;
28+ import com .google .android .material .snackbar .Snackbar ;
29+ import com .google .firebase .auth .FirebaseAuth ;
30+ import com .google .firebase .database .DatabaseError ;
31+ import com .google .firebase .database .DatabaseReference ;
32+ import com .google .firebase .database .FirebaseDatabase ;
33+ import com .google .firebase .database .Query ;
34+
35+ import java .util .Date ;
1236
1337
1438public class CommunityFragment extends Fragment {
1539
40+ private EditText msgInput ;
41+ private AppCompatImageButton sendBtn ;
42+ private MessageAdapter adapter ;
43+ private FirebaseDatabase database ;
44+ private FirebaseAuth auth ;
45+ private RecyclerView chatRv ;
46+ private LinearLayout sendMsgContainer ;
47+ private FrameLayout progContainer ;
1648
1749 @ Override
1850 public View onCreateView (LayoutInflater inflater , ViewGroup container ,
1951 Bundle savedInstanceState ) {
20-
2152 return inflater .inflate (R .layout .fragment_community , container , false );
2253 }
54+
55+ @ Override
56+ public void onViewCreated (@ NonNull final View view , @ Nullable Bundle savedInstanceState ) {
57+ chatRv = view .findViewById (R .id .chat_rv );
58+ msgInput = view .findViewById (R .id .msg_input );
59+ sendBtn = view .findViewById (R .id .send_btn );
60+ sendMsgContainer = view .findViewById (R .id .send_msg_container );
61+ progContainer = view .findViewById (R .id .prog_container );
62+
63+ MessageListener messageListener = new MessageListener () {
64+ @ Override
65+ public void onMessageReceived () {
66+ progContainer .setVisibility (View .GONE );
67+ }
68+
69+ @ Override
70+ public void onError (DatabaseError error ) {
71+ Snackbar .make (view , "Some error occurred" , Snackbar .LENGTH_SHORT ).show ();
72+ }
73+ };
74+
75+ database = FirebaseDatabase .getInstance ();
76+ auth = FirebaseAuth .getInstance ();
77+
78+ // chatRv.setVisibility(View.GONE);
79+ // sendMsgContainer.setVisibility(View.GONE);
80+ progContainer .setVisibility (View .VISIBLE );
81+
82+ Query query = database
83+ .getReference ()
84+ .child ("chats" )
85+ .limitToLast (50 );
86+
87+ FirebaseRecyclerOptions <Message > options =
88+ new FirebaseRecyclerOptions .Builder <Message >()
89+ .setQuery (query , Message .class )
90+ .build ();
91+
92+ LinearLayoutManager llm = new LinearLayoutManager (getContext ());
93+ llm .setStackFromEnd (true );
94+ chatRv .setLayoutManager (llm );
95+
96+ adapter = new MessageAdapter (options , messageListener , auth .getCurrentUser ().getUid (), getContext ());
97+ chatRv .setAdapter (adapter );
98+ adapter .registerAdapterDataObserver (new ScrollToBottomObserver (chatRv , adapter , llm ));
99+
100+ sendBtn .setOnClickListener (new View .OnClickListener () {
101+ @ Override
102+ public void onClick (View v ) {
103+ String content = msgInput .getText ().toString ().trim ();
104+ if (content .equals ("" )) return ;
105+
106+ closeKeyboard ();
107+ DatabaseReference ref = database .getReference ().child ("chats" ).push ();
108+
109+ String msgId = ref .getKey ();
110+ String senderId = auth .getCurrentUser ().getUid ();
111+ String senderName = auth .getCurrentUser ().getDisplayName ();
112+
113+ if (senderName == null || senderName .trim ().equals ("" )) {
114+ senderName = "Unknown" ;
115+ }
116+
117+ Message message = new Message (msgId , senderName , senderId , content , new Date ().getTime ());
118+
119+ ref .setValue (message );
120+
121+
122+ msgInput .setText ("" );
123+
124+ }
125+ });
126+ msgInput .addTextChangedListener (new TextWatcher () {
127+ boolean prevEmpty = true ;
128+
129+ @ Override
130+ public void beforeTextChanged (CharSequence s , int start , int count , int after ) {
131+ }
132+
133+ @ Override
134+ public void onTextChanged (CharSequence s , int start , int before , int count ) {
135+ }
136+
137+ @ Override
138+ public void afterTextChanged (Editable s ) {
139+ final boolean isEmpty = s .toString ().trim ().equals ("" );
140+ if (isEmpty == prevEmpty ) return ;
141+ prevEmpty = isEmpty ;
142+
143+ if (isEmpty ) {
144+ sendBtn .setVisibility (View .GONE );
145+ } else {
146+ sendBtn .setVisibility (View .VISIBLE );
147+ }
148+ }
149+ });
150+ }
151+
152+ @ Override
153+ public void onStart () {
154+ super .onStart ();
155+ if (adapter != null ) {
156+ adapter .startListening ();
157+ }
158+ }
159+
160+ @ Override
161+ public void onStop () {
162+ super .onStop ();
163+ if (adapter != null ) {
164+ adapter .stopListening ();
165+ }
166+ }
167+
168+ private void closeKeyboard () {
169+ try {
170+ View view = getActivity ().getCurrentFocus ();
171+ if (view != null ) {
172+ InputMethodManager imm = (InputMethodManager ) getContext ().getSystemService (Context .INPUT_METHOD_SERVICE );
173+ imm .hideSoftInputFromWindow (view .getWindowToken (), 0 );
174+ }
175+ } catch (Exception ignored ) {}
176+ }
23177}
0 commit comments