users) {
19 | this.mUsers = users;
20 | }
21 |
22 | public void add(User user) {
23 | mUsers.add(user);
24 | notifyItemInserted(mUsers.size() - 1);
25 | }
26 |
27 | @Override
28 | public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
29 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_all_user_listing, parent, false);
30 | return new ViewHolder(view);
31 | }
32 |
33 | @Override
34 | public void onBindViewHolder(ViewHolder holder, int position) {
35 | User user = mUsers.get(position);
36 |
37 | String alphabet = user.email.substring(0, 1);
38 |
39 | holder.txtUsername.setText(user.email);
40 | holder.txtUserAlphabet.setText(alphabet);
41 | }
42 |
43 | @Override
44 | public int getItemCount() {
45 | if (mUsers != null) {
46 | return mUsers.size();
47 | }
48 | return 0;
49 | }
50 |
51 | public User getUser(int position) {
52 | return mUsers.get(position);
53 | }
54 |
55 | static class ViewHolder extends RecyclerView.ViewHolder {
56 | private TextView txtUserAlphabet, txtUsername;
57 |
58 | ViewHolder(View itemView) {
59 | super(itemView);
60 | txtUserAlphabet = (TextView) itemView.findViewById(R.id.text_view_user_alphabet);
61 | txtUsername = (TextView) itemView.findViewById(R.id.text_view_username);
62 | }
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_user_listing.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
15 |
16 |
24 |
25 |
26 |
27 |
32 |
33 |
44 |
45 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
13 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
27 |
31 |
35 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/fcm/MyFirebaseInstanceIDService.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.fcm;
2 |
3 | import android.util.Log;
4 |
5 | import com.google.firebase.auth.FirebaseAuth;
6 | import com.google.firebase.database.FirebaseDatabase;
7 | import com.google.firebase.iid.FirebaseInstanceId;
8 | import com.google.firebase.iid.FirebaseInstanceIdService;
9 |
10 | import exr.at.com.firebasechat.utils.Constants;
11 | import exr.at.com.firebasechat.utils.SharedPrefUtil;
12 |
13 | public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
14 | private static final String TAG = "MyFirebaseIIDService";
15 |
16 | /**
17 | * Called if InstanceID token is updated. This may occur if the security of
18 | * the previous token had been compromised. Note that this is called when the InstanceID token
19 | * is initially generated so this is where you would retrieve the token.
20 | */
21 | // [START refresh_token]
22 | @Override
23 | public void onTokenRefresh() {
24 | // Get updated InstanceID token.
25 | String refreshedToken = FirebaseInstanceId.getInstance().getToken();
26 | Log.d(TAG, "Refreshed token: " + refreshedToken);
27 |
28 | // If you want to send messages to this application instance or
29 | // manage this apps subscriptions on the server side, send the
30 | // Instance ID token to your app server.
31 | sendRegistrationToServer(refreshedToken);
32 | }
33 | // [END refresh_token]
34 |
35 | /**
36 | * Persist token to third-party servers.
37 | *
38 | * Modify this method to associate the user's FCM InstanceID token with any server-side account
39 | * maintained by your application.
40 | *
41 | * @param token The new token.
42 | */
43 | private void sendRegistrationToServer(final String token) {
44 | new SharedPrefUtil(getApplicationContext()).saveString(Constants.ARG_FIREBASE_TOKEN, token);
45 |
46 | if (FirebaseAuth.getInstance().getCurrentUser() != null) {
47 | FirebaseDatabase.getInstance()
48 | .getReference()
49 | .child(Constants.ARG_USERS)
50 | .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
51 | .child(Constants.ARG_FIREBASE_TOKEN)
52 | .setValue(token);
53 | }
54 | }
55 | }
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/core/registration/RegisterInteractor.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.core.registration;
2 |
3 | import android.app.Activity;
4 | import android.support.annotation.NonNull;
5 | import android.util.Log;
6 |
7 | import com.google.android.gms.tasks.OnCompleteListener;
8 | import com.google.android.gms.tasks.Task;
9 | import com.google.firebase.auth.AuthResult;
10 | import com.google.firebase.auth.FirebaseAuth;
11 |
12 |
13 | public class RegisterInteractor implements RegisterContract.Interactor {
14 | private static final String TAG = RegisterInteractor.class.getSimpleName();
15 |
16 | private RegisterContract.OnRegistrationListener mOnRegistrationListener;
17 |
18 | public RegisterInteractor(RegisterContract.OnRegistrationListener onRegistrationListener) {
19 | this.mOnRegistrationListener = onRegistrationListener;
20 | }
21 |
22 | @Override
23 | public void performFirebaseRegistration(Activity activity, final String email, String password) {
24 | FirebaseAuth.getInstance()
25 | .createUserWithEmailAndPassword(email, password)
26 | .addOnCompleteListener(activity, new OnCompleteListener() {
27 | @Override
28 | public void onComplete(@NonNull Task task) {
29 | Log.e(TAG, "performFirebaseRegistration:onComplete:" + task.isSuccessful());
30 |
31 | // If sign in fails, display a message to the user. If sign in succeeds
32 | // the auth state listener will be notified and logic to handle the
33 | // signed in user can be handled in the listener.
34 | if (!task.isSuccessful()) {
35 | mOnRegistrationListener.onFailure(task.getException().getMessage());
36 | } else {
37 | // Add the user to users table.
38 | /*DatabaseReference database= FirebaseDatabase.getInstance().getReference();
39 | User user = new User(task.getResult().getUser().getUid(), email);
40 | database.child("users").push().setValue(user);*/
41 |
42 | mOnRegistrationListener.onSuccess(task.getResult().getUser());
43 | }
44 | }
45 | });
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/ui/activities/ChatActivity.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.ui.activities;
2 |
3 | import android.content.Context;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.support.v4.app.FragmentTransaction;
7 | import android.support.v7.app.AppCompatActivity;
8 | import android.support.v7.widget.Toolbar;
9 |
10 | import exr.at.com.firebasechat.FirebaseChatMainApp;
11 | import exr.at.com.firebasechat.R;
12 | import exr.at.com.firebasechat.ui.fragments.ChatFragment;
13 | import exr.at.com.firebasechat.utils.Constants;
14 |
15 |
16 | public class ChatActivity extends AppCompatActivity {
17 | private Toolbar mToolbar;
18 |
19 | public static void startActivity(Context context,
20 | String receiver,
21 | String receiverUid,
22 | String firebaseToken) {
23 | Intent intent = new Intent(context, ChatActivity.class);
24 | intent.putExtra(Constants.ARG_RECEIVER, receiver);
25 | intent.putExtra(Constants.ARG_RECEIVER_UID, receiverUid);
26 | intent.putExtra(Constants.ARG_FIREBASE_TOKEN, firebaseToken);
27 | context.startActivity(intent);
28 | }
29 |
30 | @Override
31 | protected void onCreate(Bundle savedInstanceState) {
32 | super.onCreate(savedInstanceState);
33 | setContentView(R.layout.activity_chat);
34 | bindViews();
35 | init();
36 | }
37 |
38 | private void bindViews() {
39 | mToolbar = (Toolbar) findViewById(R.id.toolbar);
40 | }
41 |
42 | private void init() {
43 | // set the toolbar
44 | setSupportActionBar(mToolbar);
45 |
46 | // set toolbar title
47 | mToolbar.setTitle(getIntent().getExtras().getString(Constants.ARG_RECEIVER));
48 |
49 | // set the register screen fragment
50 | FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
51 | fragmentTransaction.replace(R.id.frame_layout_content_chat,
52 | ChatFragment.newInstance(getIntent().getExtras().getString(Constants.ARG_RECEIVER),
53 | getIntent().getExtras().getString(Constants.ARG_RECEIVER_UID),
54 | getIntent().getExtras().getString(Constants.ARG_FIREBASE_TOKEN)),
55 | ChatFragment.class.getSimpleName());
56 | fragmentTransaction.commit();
57 | }
58 |
59 | @Override
60 | protected void onResume() {
61 | super.onResume();
62 | FirebaseChatMainApp.setChatActivityOpen(true);
63 | }
64 |
65 | @Override
66 | protected void onPause() {
67 | super.onPause();
68 | FirebaseChatMainApp.setChatActivityOpen(false);
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/core/login/LoginInteractor.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.core.login;
2 |
3 | import android.app.Activity;
4 | import android.support.annotation.NonNull;
5 | import android.util.Log;
6 |
7 |
8 | import com.google.android.gms.tasks.OnCompleteListener;
9 | import com.google.android.gms.tasks.Task;
10 | import com.google.firebase.auth.AuthResult;
11 | import com.google.firebase.auth.FirebaseAuth;
12 | import com.google.firebase.database.FirebaseDatabase;
13 |
14 | import exr.at.com.firebasechat.utils.Constants;
15 | import exr.at.com.firebasechat.utils.SharedPrefUtil;
16 |
17 | import static android.content.ContentValues.TAG;
18 |
19 | /**
20 | * Author: Kartik Sharma
21 | * Created on: 8/28/2016 , 11:10 AM
22 | * Project: FirebaseChat
23 | */
24 |
25 | public class LoginInteractor implements LoginContract.Interactor {
26 | private LoginContract.OnLoginListener mOnLoginListener;
27 |
28 | public LoginInteractor(LoginContract.OnLoginListener onLoginListener) {
29 | this.mOnLoginListener = onLoginListener;
30 | }
31 |
32 | @Override
33 | public void performFirebaseLogin(final Activity activity, final String email, String password) {
34 | FirebaseAuth.getInstance()
35 | .signInWithEmailAndPassword(email, password)
36 | .addOnCompleteListener(activity, new OnCompleteListener() {
37 | @Override
38 | public void onComplete(@NonNull Task task) {
39 | Log.d(TAG, "performFirebaseLogin:onComplete:" + task.isSuccessful());
40 |
41 | // If sign in fails, display a message to the user. If sign in succeeds
42 | // the auth state listener will be notified and logic to handle the
43 | // signed in user can be handled in the listener.
44 | if (task.isSuccessful()) {
45 | mOnLoginListener.onSuccess(task.getResult().toString());
46 | updateFirebaseToken(task.getResult().getUser().getUid(),
47 | new SharedPrefUtil(activity.getApplicationContext()).getString(Constants.ARG_FIREBASE_TOKEN, null));
48 | } else {
49 | mOnLoginListener.onFailure(task.getException().getMessage());
50 | }
51 | }
52 | });
53 | }
54 |
55 | private void updateFirebaseToken(String uid, String token) {
56 | FirebaseDatabase.getInstance()
57 | .getReference()
58 | .child(Constants.ARG_USERS)
59 | .child(uid)
60 | .child(Constants.ARG_FIREBASE_TOKEN)
61 | .setValue(token);
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
19 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | 1.8
51 |
52 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/core/users/getall/GetUsersInteractor.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.core.users.getall;
2 |
3 | import android.text.TextUtils;
4 |
5 | import com.google.firebase.auth.FirebaseAuth;
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.ValueEventListener;
10 |
11 | import java.util.ArrayList;
12 | import java.util.Iterator;
13 | import java.util.List;
14 |
15 | import exr.at.com.firebasechat.model.User;
16 | import exr.at.com.firebasechat.utils.Constants;
17 |
18 |
19 | public class GetUsersInteractor implements GetUsersContract.Interactor {
20 | private static final String TAG = "GetUsersInteractor";
21 |
22 | private GetUsersContract.OnGetAllUsersListener mOnGetAllUsersListener;
23 |
24 | public GetUsersInteractor(GetUsersContract.OnGetAllUsersListener onGetAllUsersListener) {
25 | this.mOnGetAllUsersListener = onGetAllUsersListener;
26 | }
27 |
28 |
29 | @Override
30 | public void getAllUsersFromFirebase() {
31 | FirebaseDatabase.getInstance().getReference().child(Constants.ARG_USERS).addListenerForSingleValueEvent(new ValueEventListener() {
32 | @Override
33 | public void onDataChange(DataSnapshot dataSnapshot) {
34 | Iterator dataSnapshots = dataSnapshot.getChildren().iterator();
35 | List users = new ArrayList<>();
36 | while (dataSnapshots.hasNext()) {
37 | DataSnapshot dataSnapshotChild = dataSnapshots.next();
38 | User user = dataSnapshotChild.getValue(User.class);
39 | if (!TextUtils.equals(user.uid, FirebaseAuth.getInstance().getCurrentUser().getUid())) {
40 | users.add(user);
41 | }
42 | }
43 | mOnGetAllUsersListener.onGetAllUsersSuccess(users);
44 | }
45 |
46 | @Override
47 | public void onCancelled(DatabaseError databaseError) {
48 | mOnGetAllUsersListener.onGetAllUsersFailure(databaseError.getMessage());
49 | }
50 | });
51 | }
52 |
53 | @Override
54 | public void getChatUsersFromFirebase() {
55 | /*FirebaseDatabase.getInstance().getReference().child(Constants.ARG_CHAT_ROOMS).addListenerForSingleValueEvent(new ValueEventListener() {
56 | @Override
57 | public void onDataChange(DataSnapshot dataSnapshot) {
58 | Iterator dataSnapshots=dataSnapshot.getChildren().iterator();
59 | List users=new ArrayList<>();
60 | while (dataSnapshots.hasNext()){
61 | DataSnapshot dataSnapshotChild=dataSnapshots.next();
62 | dataSnapshotChild.getRef().
63 | Chat chat=dataSnapshotChild.getValue(Chat.class);
64 | if(chat.)4
65 | if(!TextUtils.equals(user.uid,FirebaseAuth.getInstance().getCurrentUser().getUid())) {
66 | users.add(user);
67 | }
68 | }
69 | }
70 |
71 | @Override
72 | public void onCancelled(DatabaseError databaseError) {
73 |
74 | }
75 | });*/
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/utils/ItemClickSupport.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.utils;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.View;
5 |
6 | import exr.at.com.firebasechat.R;
7 |
8 |
9 | public class ItemClickSupport {
10 | private final RecyclerView mRecyclerView;
11 | private OnItemClickListener mOnItemClickListener;
12 | private OnItemLongClickListener mOnItemLongClickListener;
13 | private View.OnClickListener mOnClickListener = new View.OnClickListener() {
14 | @Override
15 | public void onClick(View v) {
16 | if (mOnItemClickListener != null) {
17 | RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
18 | mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
19 | }
20 | }
21 | };
22 | private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
23 | @Override
24 | public boolean onLongClick(View v) {
25 | if (mOnItemLongClickListener != null) {
26 | RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
27 | return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
28 | }
29 | return false;
30 | }
31 | };
32 | private RecyclerView.OnChildAttachStateChangeListener mAttachListener
33 | = new RecyclerView.OnChildAttachStateChangeListener() {
34 | @Override
35 | public void onChildViewAttachedToWindow(View view) {
36 | if (mOnItemClickListener != null) {
37 | view.setOnClickListener(mOnClickListener);
38 | }
39 | if (mOnItemLongClickListener != null) {
40 | view.setOnLongClickListener(mOnLongClickListener);
41 | }
42 | }
43 |
44 | @Override
45 | public void onChildViewDetachedFromWindow(View view) {
46 |
47 | }
48 | };
49 |
50 | private ItemClickSupport(RecyclerView recyclerView) {
51 | mRecyclerView = recyclerView;
52 | mRecyclerView.setTag(R.id.item_click_support, this);
53 | mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
54 | }
55 |
56 | public static ItemClickSupport addTo(RecyclerView view) {
57 | ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
58 | if (support == null) {
59 | support = new ItemClickSupport(view);
60 | }
61 | return support;
62 | }
63 |
64 | public static ItemClickSupport removeFrom(RecyclerView view) {
65 | ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
66 | if (support != null) {
67 | support.detach(view);
68 | }
69 | return support;
70 | }
71 |
72 | public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
73 | mOnItemClickListener = listener;
74 | return this;
75 | }
76 |
77 | public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
78 | mOnItemLongClickListener = listener;
79 | return this;
80 | }
81 |
82 | private void detach(RecyclerView view) {
83 | view.removeOnChildAttachStateChangeListener(mAttachListener);
84 | view.setTag(R.id.item_click_support, null);
85 | }
86 |
87 | public interface OnItemClickListener {
88 |
89 | void onItemClicked(RecyclerView recyclerView, int position, View v);
90 | }
91 |
92 | public interface OnItemLongClickListener {
93 |
94 | boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);
95 | }
96 | }
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/fcm/MyFirebaseMessagingService.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.fcm;
2 |
3 | import android.app.NotificationManager;
4 | import android.app.PendingIntent;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.media.RingtoneManager;
8 | import android.net.Uri;
9 | import android.support.v4.app.NotificationCompat;
10 | import android.util.Log;
11 |
12 | import com.google.firebase.messaging.FirebaseMessagingService;
13 | import com.google.firebase.messaging.RemoteMessage;
14 |
15 | import org.greenrobot.eventbus.EventBus;
16 |
17 | import exr.at.com.firebasechat.FirebaseChatMainApp;
18 | import exr.at.com.firebasechat.R;
19 | import exr.at.com.firebasechat.event.PushNotificationEvent;
20 | import exr.at.com.firebasechat.ui.activities.ChatActivity;
21 | import exr.at.com.firebasechat.utils.Constants;
22 |
23 | public class MyFirebaseMessagingService extends FirebaseMessagingService {
24 |
25 | private static final String TAG = "MyFirebaseMsgService";
26 |
27 | /**
28 | * Called when message is received.
29 | *
30 | * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
31 | */
32 | @Override
33 | public void onMessageReceived(RemoteMessage remoteMessage) {
34 |
35 | // TODO(developer): Handle FCM messages here.
36 | // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
37 | Log.d(TAG, "From: " + remoteMessage.getFrom());
38 |
39 | // Check if message contains a data payload.
40 | if (remoteMessage.getData().size() > 0) {
41 | Log.d(TAG, "Message data payload: " + remoteMessage.getData());
42 |
43 | String title = remoteMessage.getData().get("title");
44 | String message = remoteMessage.getData().get("text");
45 | String username = remoteMessage.getData().get("username");
46 | String uid = remoteMessage.getData().get("uid");
47 | String fcmToken = remoteMessage.getData().get("fcm_token");
48 |
49 | // Don't show notification if chat activity is open.
50 | if (!FirebaseChatMainApp.isChatActivityOpen()) {
51 | sendNotification(title,
52 | message,
53 | username,
54 | uid,
55 | fcmToken);
56 | } else {
57 | EventBus.getDefault().post(new PushNotificationEvent(title,
58 | message,
59 | username,
60 | uid,
61 | fcmToken));
62 | }
63 | }
64 | }
65 |
66 | /**
67 | * Create and show a simple notification containing the received FCM message.
68 | */
69 | private void sendNotification(String title,
70 | String message,
71 | String receiver,
72 | String receiverUid,
73 | String firebaseToken) {
74 | Intent intent = new Intent(this, ChatActivity.class);
75 | intent.putExtra(Constants.ARG_RECEIVER, receiver);
76 | intent.putExtra(Constants.ARG_RECEIVER_UID, receiverUid);
77 | intent.putExtra(Constants.ARG_FIREBASE_TOKEN, firebaseToken);
78 | intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
79 | PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
80 | PendingIntent.FLAG_ONE_SHOT);
81 |
82 | Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
83 | NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
84 | .setSmallIcon(R.drawable.ic_messaging)
85 | .setContentTitle(title)
86 | .setContentText(message)
87 | .setAutoCancel(true)
88 | .setSound(defaultSoundUri)
89 | .setContentIntent(pendingIntent);
90 |
91 | NotificationManager notificationManager =
92 | (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
93 |
94 | notificationManager.notify(0, notificationBuilder.build());
95 | }
96 | }
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/utils/NetworkConnectionUtil.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.utils;
2 |
3 | import android.content.Context;
4 | import android.content.DialogInterface;
5 | import android.content.Intent;
6 | import android.net.ConnectivityManager;
7 | import android.net.NetworkInfo;
8 | import android.provider.Settings;
9 | import android.support.v7.app.AlertDialog;
10 |
11 | import exr.at.com.firebasechat.R;
12 |
13 |
14 | public class NetworkConnectionUtil {
15 | public static final String ERR_DIALOG_TITLE = "No internet connection detected !";
16 | private static final String ERR_DIALOG_MSG = "Looks like our application is not able to detect an active internet connection, " +
17 | "please check your device's network settings.";
18 | private static final String ERR_DIALOG_POSITIVE_BTN = "Settings";
19 | private static final String ERR_DIALOG_NEGATIVE_BTN = "Dismiss";
20 |
21 | /**
22 | * Check if the device is connected to internet or not.
23 | *
24 | * @param context Current context of the application
25 | * @return true if device is connected to internet, otherwise false
26 | */
27 | public static boolean isConnectedToInternet(Context context) {
28 | ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
29 | NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
30 | return networkInfo != null && networkInfo.isConnectedOrConnecting();
31 | }
32 |
33 | /**
34 | * Check if the device is connected to internet via wifi or not.
35 | *
36 | * @param context Current context of the application
37 | * @return true if device is connected to internet via wifi, otherwise false
38 | */
39 | public static boolean isConnectedToWifi(Context context) {
40 | ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
41 | NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
42 | return networkInfo != null &&
43 | networkInfo.isConnectedOrConnecting() &&
44 | networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
45 | }
46 |
47 | /**
48 | * Check if the device is connected to internet via mobile network or not.
49 | *
50 | * @param context Current context of the application
51 | * @return true if device is connected to internet via mobile network, otherwise false
52 | */
53 | public static boolean isConnectedToMobileNetwork(Context context) {
54 | ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
55 | NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
56 | return networkInfo != null &&
57 | networkInfo.isConnectedOrConnecting() &&
58 | networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
59 | }
60 |
61 | /**
62 | * Show a error dialog representing that no internet connection is available currently.
63 | *
64 | * @param context Current context of the application
65 | */
66 | public static void showNoInternetAvailableErrorDialog(final Context context) {
67 | new AlertDialog.Builder(context)
68 | .setTitle(ERR_DIALOG_TITLE)
69 | .setMessage(ERR_DIALOG_MSG)
70 | .setIcon(R.drawable.ic_error_24dp)
71 | .setPositiveButton(ERR_DIALOG_POSITIVE_BTN, new DialogInterface.OnClickListener() {
72 | @Override
73 | public void onClick(DialogInterface dialogInterface, int i) {
74 | dialogInterface.dismiss();
75 | Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
76 | context.startActivity(intent);
77 | }
78 | })
79 | .setNegativeButton(ERR_DIALOG_NEGATIVE_BTN, new DialogInterface.OnClickListener() {
80 | @Override
81 | public void onClick(DialogInterface dialogInterface, int i) {
82 | dialogInterface.dismiss();
83 | }
84 | })
85 | .show();
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/ui/fragments/LoginFragment.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.ui.fragments;
2 |
3 | import android.app.ProgressDialog;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v4.app.Fragment;
8 | import android.view.LayoutInflater;
9 | import android.view.View;
10 | import android.view.ViewGroup;
11 | import android.widget.Button;
12 | import android.widget.EditText;
13 | import android.widget.Toast;
14 |
15 | import exr.at.com.firebasechat.R;
16 | import exr.at.com.firebasechat.core.login.LoginContract;
17 | import exr.at.com.firebasechat.core.login.LoginPresenter;
18 | import exr.at.com.firebasechat.ui.activities.RegisterActivity;
19 | import exr.at.com.firebasechat.ui.activities.UserListingActivity;
20 |
21 |
22 | public class LoginFragment extends Fragment implements View.OnClickListener, LoginContract.View {
23 | private LoginPresenter mLoginPresenter;
24 |
25 | private EditText mETxtEmail, mETxtPassword;
26 | private Button mBtnLogin, mBtnRegister;
27 |
28 | private ProgressDialog mProgressDialog;
29 |
30 | public static LoginFragment newInstance() {
31 | Bundle args = new Bundle();
32 | LoginFragment fragment = new LoginFragment();
33 | fragment.setArguments(args);
34 | return fragment;
35 | }
36 |
37 | @Nullable
38 | @Override
39 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
40 | View fragmentView = inflater.inflate(R.layout.fragment_login, container, false);
41 | bindViews(fragmentView);
42 | return fragmentView;
43 | }
44 |
45 | private void bindViews(View view) {
46 | mETxtEmail = (EditText) view.findViewById(R.id.edit_text_email_id);
47 | mETxtPassword = (EditText) view.findViewById(R.id.edit_text_password);
48 | mBtnLogin = (Button) view.findViewById(R.id.button_login);
49 | mBtnRegister = (Button) view.findViewById(R.id.button_register);
50 | }
51 |
52 | @Override
53 | public void onActivityCreated(@Nullable Bundle savedInstanceState) {
54 | super.onActivityCreated(savedInstanceState);
55 | init();
56 | }
57 |
58 | private void init() {
59 | mLoginPresenter = new LoginPresenter(this);
60 |
61 | mProgressDialog = new ProgressDialog(getActivity());
62 | mProgressDialog.setTitle(getString(R.string.loading));
63 | mProgressDialog.setMessage(getString(R.string.please_wait));
64 | mProgressDialog.setIndeterminate(true);
65 |
66 | mBtnLogin.setOnClickListener(this);
67 | mBtnRegister.setOnClickListener(this);
68 |
69 | setDummyCredentials();
70 | }
71 |
72 | private void setDummyCredentials() {
73 | mETxtEmail.setText("test@test.com");
74 | mETxtPassword.setText("123456");
75 | }
76 |
77 | @Override
78 | public void onClick(View view) {
79 | int viewId = view.getId();
80 |
81 | switch (viewId) {
82 | case R.id.button_login:
83 | onLogin(view);
84 | break;
85 | case R.id.button_register:
86 | onRegister(view);
87 | break;
88 | }
89 | }
90 |
91 | private void onLogin(View view) {
92 | String emailId = mETxtEmail.getText().toString();
93 | String password = mETxtPassword.getText().toString();
94 |
95 | mLoginPresenter.login(getActivity(), emailId, password);
96 | mProgressDialog.show();
97 | }
98 |
99 | private void onRegister(View view) {
100 | RegisterActivity.startActivity(getActivity());
101 | }
102 |
103 | @Override
104 | public void onLoginSuccess(String message) {
105 | mProgressDialog.dismiss();
106 | Toast.makeText(getActivity(), "Logged in successfully", Toast.LENGTH_SHORT).show();
107 | UserListingActivity.startActivity(getActivity(),
108 | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
109 | }
110 |
111 | @Override
112 | public void onLoginFailure(String message) {
113 | mProgressDialog.dismiss();
114 | Toast.makeText(getActivity(), "Error: " + message, Toast.LENGTH_SHORT).show();
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/ui/adapters/ChatRecyclerAdapter.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.ui.adapters;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.text.TextUtils;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 | import android.widget.TextView;
9 |
10 | import com.google.firebase.auth.FirebaseAuth;
11 |
12 | import java.util.List;
13 |
14 | import exr.at.com.firebasechat.R;
15 | import exr.at.com.firebasechat.model.Chat;
16 |
17 |
18 | public class ChatRecyclerAdapter extends RecyclerView.Adapter {
19 | private static final int VIEW_TYPE_ME = 1;
20 | private static final int VIEW_TYPE_OTHER = 2;
21 |
22 | private List mChats;
23 |
24 | public ChatRecyclerAdapter(List chats) {
25 | mChats = chats;
26 | }
27 |
28 | public void add(Chat chat) {
29 | mChats.add(chat);
30 | notifyItemInserted(mChats.size() - 1);
31 | }
32 |
33 | @Override
34 | public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
35 | LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
36 | RecyclerView.ViewHolder viewHolder = null;
37 | switch (viewType) {
38 | case VIEW_TYPE_ME:
39 | View viewChatMine = layoutInflater.inflate(R.layout.item_chat_mine, parent, false);
40 | viewHolder = new MyChatViewHolder(viewChatMine);
41 | break;
42 | case VIEW_TYPE_OTHER:
43 | View viewChatOther = layoutInflater.inflate(R.layout.item_chat_other, parent, false);
44 | viewHolder = new OtherChatViewHolder(viewChatOther);
45 | break;
46 | }
47 | return viewHolder;
48 | }
49 |
50 | @Override
51 | public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
52 | if (TextUtils.equals(mChats.get(position).senderUid,
53 | FirebaseAuth.getInstance().getCurrentUser().getUid())) {
54 | configureMyChatViewHolder((MyChatViewHolder) holder, position);
55 | } else {
56 | configureOtherChatViewHolder((OtherChatViewHolder) holder, position);
57 | }
58 | }
59 |
60 | private void configureMyChatViewHolder(MyChatViewHolder myChatViewHolder, int position) {
61 | Chat chat = mChats.get(position);
62 |
63 | String alphabet = chat.sender.substring(0, 1);
64 |
65 | myChatViewHolder.txtChatMessage.setText(chat.message);
66 | myChatViewHolder.txtUserAlphabet.setText(alphabet);
67 | }
68 |
69 | private void configureOtherChatViewHolder(OtherChatViewHolder otherChatViewHolder, int position) {
70 | Chat chat = mChats.get(position);
71 |
72 | String alphabet = chat.sender.substring(0, 1);
73 |
74 | otherChatViewHolder.txtChatMessage.setText(chat.message);
75 | otherChatViewHolder.txtUserAlphabet.setText(alphabet);
76 | }
77 |
78 | @Override
79 | public int getItemCount() {
80 | if (mChats != null) {
81 | return mChats.size();
82 | }
83 | return 0;
84 | }
85 |
86 | @Override
87 | public int getItemViewType(int position) {
88 | if (TextUtils.equals(mChats.get(position).senderUid,
89 | FirebaseAuth.getInstance().getCurrentUser().getUid())) {
90 | return VIEW_TYPE_ME;
91 | } else {
92 | return VIEW_TYPE_OTHER;
93 | }
94 | }
95 |
96 | private static class MyChatViewHolder extends RecyclerView.ViewHolder {
97 | private TextView txtChatMessage, txtUserAlphabet;
98 |
99 | public MyChatViewHolder(View itemView) {
100 | super(itemView);
101 | txtChatMessage = (TextView) itemView.findViewById(R.id.text_view_chat_message);
102 | txtUserAlphabet = (TextView) itemView.findViewById(R.id.text_view_user_alphabet);
103 | }
104 | }
105 |
106 | private static class OtherChatViewHolder extends RecyclerView.ViewHolder {
107 | private TextView txtChatMessage, txtUserAlphabet;
108 |
109 | public OtherChatViewHolder(View itemView) {
110 | super(itemView);
111 | txtChatMessage = (TextView) itemView.findViewById(R.id.text_view_chat_message);
112 | txtUserAlphabet = (TextView) itemView.findViewById(R.id.text_view_user_alphabet);
113 | }
114 | }
115 | }
116 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/ui/activities/UserListingActivity.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.ui.activities;
2 |
3 | import android.content.Context;
4 | import android.content.DialogInterface;
5 | import android.content.Intent;
6 | import android.os.Bundle;
7 | import android.support.design.widget.TabLayout;
8 | import android.support.v4.view.ViewPager;
9 | import android.support.v7.app.AlertDialog;
10 | import android.support.v7.app.AppCompatActivity;
11 | import android.support.v7.widget.Toolbar;
12 | import android.view.Menu;
13 | import android.view.MenuItem;
14 | import android.widget.Toast;
15 |
16 | import exr.at.com.firebasechat.R;
17 | import exr.at.com.firebasechat.core.logout.LogoutContract;
18 | import exr.at.com.firebasechat.core.logout.LogoutPresenter;
19 | import exr.at.com.firebasechat.ui.adapters.UserListingPagerAdapter;
20 |
21 |
22 | public class UserListingActivity extends AppCompatActivity implements LogoutContract.View {
23 | private Toolbar mToolbar;
24 | private TabLayout mTabLayoutUserListing;
25 | private ViewPager mViewPagerUserListing;
26 |
27 | private LogoutPresenter mLogoutPresenter;
28 |
29 | public static void startActivity(Context context) {
30 | Intent intent = new Intent(context, UserListingActivity.class);
31 | context.startActivity(intent);
32 | }
33 |
34 | public static void startActivity(Context context, int flags) {
35 | Intent intent = new Intent(context, UserListingActivity.class);
36 | intent.setFlags(flags);
37 | context.startActivity(intent);
38 | }
39 |
40 | @Override
41 | protected void onCreate(Bundle savedInstanceState) {
42 | super.onCreate(savedInstanceState);
43 | setContentView(R.layout.activity_user_listing);
44 | bindViews();
45 | init();
46 | }
47 |
48 | private void bindViews() {
49 | mToolbar = (Toolbar) findViewById(R.id.toolbar);
50 | mTabLayoutUserListing = (TabLayout) findViewById(R.id.tab_layout_user_listing);
51 | mViewPagerUserListing = (ViewPager) findViewById(R.id.view_pager_user_listing);
52 | }
53 |
54 | private void init() {
55 | // set the toolbar
56 | setSupportActionBar(mToolbar);
57 |
58 | // set the view pager adapter
59 | UserListingPagerAdapter userListingPagerAdapter = new UserListingPagerAdapter(getSupportFragmentManager());
60 | mViewPagerUserListing.setAdapter(userListingPagerAdapter);
61 |
62 | // attach tab layout with view pager
63 | mTabLayoutUserListing.setupWithViewPager(mViewPagerUserListing);
64 |
65 | mLogoutPresenter = new LogoutPresenter(this);
66 | }
67 |
68 | @Override
69 | public boolean onCreateOptionsMenu(Menu menu) {
70 | getMenuInflater().inflate(R.menu.menu_user_listing, menu);
71 | return super.onCreateOptionsMenu(menu);
72 | }
73 |
74 | @Override
75 | public boolean onOptionsItemSelected(MenuItem item) {
76 | switch (item.getItemId()) {
77 | case R.id.action_logout:
78 | logout();
79 | break;
80 | }
81 | return super.onOptionsItemSelected(item);
82 | }
83 |
84 | private void logout() {
85 | new AlertDialog.Builder(this)
86 | .setTitle(R.string.logout)
87 | .setMessage(R.string.are_you_sure)
88 | .setPositiveButton(R.string.logout, new DialogInterface.OnClickListener() {
89 | @Override
90 | public void onClick(DialogInterface dialog, int which) {
91 | dialog.dismiss();
92 | mLogoutPresenter.logout();
93 | }
94 | })
95 | .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
96 | @Override
97 | public void onClick(DialogInterface dialog, int which) {
98 | dialog.dismiss();
99 | }
100 | })
101 | .show();
102 | }
103 |
104 | @Override
105 | public void onLogoutSuccess(String message) {
106 | Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
107 | LoginActivity.startIntent(this,
108 | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
109 | }
110 |
111 | @Override
112 | public void onLogoutFailure(String message) {
113 | Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
114 | }
115 | }
116 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/fcm/FcmNotificationBuilder.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.fcm;
2 |
3 | import android.util.Log;
4 |
5 | import org.json.JSONException;
6 | import org.json.JSONObject;
7 |
8 | import java.io.IOException;
9 |
10 | import okhttp3.Call;
11 | import okhttp3.Callback;
12 | import okhttp3.MediaType;
13 | import okhttp3.OkHttpClient;
14 | import okhttp3.Request;
15 | import okhttp3.RequestBody;
16 | import okhttp3.Response;
17 |
18 |
19 |
20 | public class FcmNotificationBuilder {
21 | public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
22 | private static final String TAG = "FcmNotificationBuilder";
23 | private static final String SERVER_API_KEY = "YOUR_SERVER_API_KEY";
24 | private static final String CONTENT_TYPE = "Content-Type";
25 | private static final String APPLICATION_JSON = "application/json";
26 | private static final String AUTHORIZATION = "Authorization";
27 | private static final String AUTH_KEY = "key=" + SERVER_API_KEY;
28 | private static final String FCM_URL = "https://fcm.googleapis.com/fcm/send";
29 | // json related keys
30 | private static final String KEY_TO = "to";
31 | private static final String KEY_NOTIFICATION = "notification";
32 | private static final String KEY_TITLE = "title";
33 | private static final String KEY_TEXT = "text";
34 | private static final String KEY_DATA = "data";
35 | private static final String KEY_USERNAME = "username";
36 | private static final String KEY_UID = "uid";
37 | private static final String KEY_FCM_TOKEN = "fcm_token";
38 |
39 | private String mTitle;
40 | private String mMessage;
41 | private String mUsername;
42 | private String mUid;
43 | private String mFirebaseToken;
44 | private String mReceiverFirebaseToken;
45 |
46 | private FcmNotificationBuilder() {
47 |
48 | }
49 |
50 | public static FcmNotificationBuilder initialize() {
51 | return new FcmNotificationBuilder();
52 | }
53 |
54 | public FcmNotificationBuilder title(String title) {
55 | mTitle = title;
56 | return this;
57 | }
58 |
59 | public FcmNotificationBuilder message(String message) {
60 | mMessage = message;
61 | return this;
62 | }
63 |
64 | public FcmNotificationBuilder username(String username) {
65 | mUsername = username;
66 | return this;
67 | }
68 |
69 | public FcmNotificationBuilder uid(String uid) {
70 | mUid = uid;
71 | return this;
72 | }
73 |
74 | public FcmNotificationBuilder firebaseToken(String firebaseToken) {
75 | mFirebaseToken = firebaseToken;
76 | return this;
77 | }
78 |
79 | public FcmNotificationBuilder receiverFirebaseToken(String receiverFirebaseToken) {
80 | mReceiverFirebaseToken = receiverFirebaseToken;
81 | return this;
82 | }
83 |
84 | public void send() {
85 | RequestBody requestBody = null;
86 | try {
87 | requestBody = RequestBody.create(MEDIA_TYPE_JSON, getValidJsonBody().toString());
88 | } catch (JSONException e) {
89 | e.printStackTrace();
90 | }
91 |
92 | Request request = new Request.Builder()
93 | .addHeader(CONTENT_TYPE, APPLICATION_JSON)
94 | .addHeader(AUTHORIZATION, AUTH_KEY)
95 | .url(FCM_URL)
96 | .post(requestBody)
97 | .build();
98 |
99 | Call call = new OkHttpClient().newCall(request);
100 | call.enqueue(new Callback() {
101 | @Override
102 | public void onFailure(Call call, IOException e) {
103 | Log.e(TAG, "onGetAllUsersFailure: " + e.getMessage());
104 | }
105 |
106 | @Override
107 | public void onResponse(Call call, Response response) throws IOException {
108 | Log.e(TAG, "onResponse: " + response.body().string());
109 | }
110 | });
111 | }
112 |
113 | private JSONObject getValidJsonBody() throws JSONException {
114 | JSONObject jsonObjectBody = new JSONObject();
115 | jsonObjectBody.put(KEY_TO, mReceiverFirebaseToken);
116 |
117 | JSONObject jsonObjectData = new JSONObject();
118 | jsonObjectData.put(KEY_TITLE, mTitle);
119 | jsonObjectData.put(KEY_TEXT, mMessage);
120 | jsonObjectData.put(KEY_USERNAME, mUsername);
121 | jsonObjectData.put(KEY_UID, mUid);
122 | jsonObjectData.put(KEY_FCM_TOKEN, mFirebaseToken);
123 | jsonObjectBody.put(KEY_DATA, jsonObjectData);
124 |
125 | return jsonObjectBody;
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/ui/fragments/RegisterFragment.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.ui.fragments;
2 |
3 | import android.app.ProgressDialog;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.support.annotation.Nullable;
7 | import android.support.v4.app.Fragment;
8 | import android.util.Log;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 | import android.widget.Button;
13 | import android.widget.EditText;
14 | import android.widget.Toast;
15 |
16 | import com.google.firebase.auth.FirebaseUser;
17 |
18 | import exr.at.com.firebasechat.R;
19 | import exr.at.com.firebasechat.core.registration.RegisterContract;
20 | import exr.at.com.firebasechat.core.registration.RegisterPresenter;
21 | import exr.at.com.firebasechat.core.users.add.AddUserContract;
22 | import exr.at.com.firebasechat.core.users.add.AddUserPresenter;
23 | import exr.at.com.firebasechat.ui.activities.UserListingActivity;
24 |
25 |
26 | public class RegisterFragment extends Fragment implements View.OnClickListener, RegisterContract.View, AddUserContract.View {
27 | private static final String TAG = RegisterFragment.class.getSimpleName();
28 |
29 | private RegisterPresenter mRegisterPresenter;
30 | private AddUserPresenter mAddUserPresenter;
31 |
32 | private EditText mETxtEmail, mETxtPassword;
33 | private Button mBtnRegister;
34 |
35 | private ProgressDialog mProgressDialog;
36 |
37 | public static RegisterFragment newInstance() {
38 | Bundle args = new Bundle();
39 | RegisterFragment fragment = new RegisterFragment();
40 | fragment.setArguments(args);
41 | return fragment;
42 | }
43 |
44 | @Nullable
45 | @Override
46 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
47 | View fragmentView = inflater.inflate(R.layout.fragment_register, container, false);
48 | bindViews(fragmentView);
49 | return fragmentView;
50 | }
51 |
52 | private void bindViews(View view) {
53 | mETxtEmail = (EditText) view.findViewById(R.id.edit_text_email_id);
54 | mETxtPassword = (EditText) view.findViewById(R.id.edit_text_password);
55 | mBtnRegister = (Button) view.findViewById(R.id.button_register);
56 | }
57 |
58 | @Override
59 | public void onActivityCreated(@Nullable Bundle savedInstanceState) {
60 | super.onActivityCreated(savedInstanceState);
61 | init();
62 | }
63 |
64 | private void init() {
65 | mRegisterPresenter = new RegisterPresenter(this);
66 | mAddUserPresenter = new AddUserPresenter(this);
67 |
68 | mProgressDialog = new ProgressDialog(getActivity());
69 | mProgressDialog.setTitle(getString(R.string.loading));
70 | mProgressDialog.setMessage(getString(R.string.please_wait));
71 | mProgressDialog.setIndeterminate(true);
72 |
73 | mBtnRegister.setOnClickListener(this);
74 | }
75 |
76 | @Override
77 | public void onClick(View view) {
78 | int viewId = view.getId();
79 |
80 | switch (viewId) {
81 | case R.id.button_register:
82 | onRegister(view);
83 | break;
84 | }
85 | }
86 |
87 | private void onRegister(View view) {
88 | String emailId = mETxtEmail.getText().toString();
89 | String password = mETxtPassword.getText().toString();
90 |
91 | mRegisterPresenter.register(getActivity(), emailId, password);
92 | mProgressDialog.show();
93 | }
94 |
95 | @Override
96 | public void onRegistrationSuccess(FirebaseUser firebaseUser) {
97 | mProgressDialog.setMessage(getString(R.string.adding_user_to_db));
98 | Toast.makeText(getActivity(), "Registration Successful!", Toast.LENGTH_SHORT).show();
99 | mAddUserPresenter.addUser(getActivity().getApplicationContext(), firebaseUser);
100 | }
101 |
102 | @Override
103 | public void onRegistrationFailure(String message) {
104 | mProgressDialog.dismiss();
105 | mProgressDialog.setMessage(getString(R.string.please_wait));
106 | Log.e(TAG, "onRegistrationFailure: " + message);
107 | Toast.makeText(getActivity(), "Registration failed!+\n" + message, Toast.LENGTH_LONG).show();
108 | }
109 |
110 | @Override
111 | public void onAddUserSuccess(String message) {
112 | mProgressDialog.dismiss();
113 | Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
114 | UserListingActivity.startActivity(getActivity(),
115 | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
116 | }
117 |
118 | @Override
119 | public void onAddUserFailure(String message) {
120 | mProgressDialog.dismiss();
121 | Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/ui/fragments/UsersFragment.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.ui.fragments;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v4.app.Fragment;
6 | import android.support.v4.widget.SwipeRefreshLayout;
7 | import android.support.v7.widget.RecyclerView;
8 | import android.text.TextUtils;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 | import android.widget.Toast;
13 |
14 | import java.util.List;
15 |
16 | import exr.at.com.firebasechat.R;
17 | import exr.at.com.firebasechat.core.users.getall.GetUsersContract;
18 | import exr.at.com.firebasechat.core.users.getall.GetUsersPresenter;
19 | import exr.at.com.firebasechat.model.User;
20 | import exr.at.com.firebasechat.ui.activities.ChatActivity;
21 | import exr.at.com.firebasechat.ui.adapters.UserListingRecyclerAdapter;
22 | import exr.at.com.firebasechat.utils.ItemClickSupport;
23 |
24 |
25 | public class UsersFragment extends Fragment implements GetUsersContract.View, ItemClickSupport.OnItemClickListener, SwipeRefreshLayout.OnRefreshListener {
26 | public static final String ARG_TYPE = "type";
27 | public static final String TYPE_CHATS = "type_chats";
28 | public static final String TYPE_ALL = "type_all";
29 |
30 | private SwipeRefreshLayout mSwipeRefreshLayout;
31 | private RecyclerView mRecyclerViewAllUserListing;
32 |
33 | private UserListingRecyclerAdapter mUserListingRecyclerAdapter;
34 |
35 | private GetUsersPresenter mGetUsersPresenter;
36 |
37 | public static UsersFragment newInstance(String type) {
38 | Bundle args = new Bundle();
39 | args.putString(ARG_TYPE, type);
40 | UsersFragment fragment = new UsersFragment();
41 | fragment.setArguments(args);
42 | return fragment;
43 | }
44 |
45 | @Nullable
46 | @Override
47 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
48 | View fragmentView = inflater.inflate(R.layout.fragment_users, container, false);
49 | bindViews(fragmentView);
50 | return fragmentView;
51 | }
52 |
53 | private void bindViews(View view) {
54 | mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
55 | mRecyclerViewAllUserListing = (RecyclerView) view.findViewById(R.id.recycler_view_all_user_listing);
56 | }
57 |
58 | @Override
59 | public void onActivityCreated(@Nullable Bundle savedInstanceState) {
60 | super.onActivityCreated(savedInstanceState);
61 | init();
62 | }
63 |
64 | private void init() {
65 | mGetUsersPresenter = new GetUsersPresenter(this);
66 | getUsers();
67 | mSwipeRefreshLayout.post(new Runnable() {
68 | @Override
69 | public void run() {
70 | mSwipeRefreshLayout.setRefreshing(true);
71 | }
72 | });
73 |
74 | ItemClickSupport.addTo(mRecyclerViewAllUserListing)
75 | .setOnItemClickListener(this);
76 |
77 | mSwipeRefreshLayout.setOnRefreshListener(this);
78 | }
79 |
80 | @Override
81 | public void onRefresh() {
82 | getUsers();
83 | }
84 |
85 | private void getUsers() {
86 | if (TextUtils.equals(getArguments().getString(ARG_TYPE), TYPE_CHATS)) {
87 |
88 | } else if (TextUtils.equals(getArguments().getString(ARG_TYPE), TYPE_ALL)) {
89 | mGetUsersPresenter.getAllUsers();
90 | }
91 | }
92 |
93 | @Override
94 | public void onItemClicked(RecyclerView recyclerView, int position, View v) {
95 | ChatActivity.startActivity(getActivity(),
96 | mUserListingRecyclerAdapter.getUser(position).email,
97 | mUserListingRecyclerAdapter.getUser(position).uid,
98 | mUserListingRecyclerAdapter.getUser(position).firebaseToken);
99 | }
100 |
101 | @Override
102 | public void onGetAllUsersSuccess(List users) {
103 | mSwipeRefreshLayout.post(new Runnable() {
104 | @Override
105 | public void run() {
106 | mSwipeRefreshLayout.setRefreshing(false);
107 | }
108 | });
109 | mUserListingRecyclerAdapter = new UserListingRecyclerAdapter(users);
110 | mRecyclerViewAllUserListing.setAdapter(mUserListingRecyclerAdapter);
111 | mUserListingRecyclerAdapter.notifyDataSetChanged();
112 | }
113 |
114 | @Override
115 | public void onGetAllUsersFailure(String message) {
116 | mSwipeRefreshLayout.post(new Runnable() {
117 | @Override
118 | public void run() {
119 | mSwipeRefreshLayout.setRefreshing(false);
120 | }
121 | });
122 | Toast.makeText(getActivity(), "Error: " + message, Toast.LENGTH_SHORT).show();
123 | }
124 |
125 | @Override
126 | public void onGetChatUsersSuccess(List users) {
127 |
128 | }
129 |
130 | @Override
131 | public void onGetChatUsersFailure(String message) {
132 |
133 | }
134 | }
135 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/utils/SharedPrefUtil.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.utils;
2 |
3 | import android.content.Context;
4 | import android.content.SharedPreferences;
5 |
6 |
7 | public class SharedPrefUtil {
8 | /**
9 | * Name of the preference file
10 | */
11 | private static final String APP_PREFS = "application_preferences";
12 |
13 | private Context mContext;
14 | private SharedPreferences mSharedPreferences;
15 | private SharedPreferences.Editor mEditor;
16 |
17 | public SharedPrefUtil(Context mContext) {
18 | this.mContext = mContext;
19 | }
20 |
21 | /**
22 | * Save a string into shared preference
23 | *
24 | * @param key The name of the preference to modify
25 | * @param value The new value for the preference
26 | */
27 | public void saveString(String key, String value) {
28 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
29 | mEditor = mSharedPreferences.edit();
30 | mEditor.putString(key, value);
31 | mEditor.commit();
32 | }
33 |
34 | /**
35 | * Save a int into shared preference
36 | *
37 | * @param key The name of the preference to modify
38 | * @param value The new value for the preference
39 | */
40 | public void saveInt(String key, int value) {
41 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
42 | mEditor = mSharedPreferences.edit();
43 | mEditor.putInt(key, value);
44 | mEditor.commit();
45 | }
46 |
47 | /**
48 | * Save a boolean into shared preference
49 | *
50 | * @param key The name of the preference to modify
51 | * @param value The new value for the preference
52 | */
53 | public void saveBoolean(String key, boolean value) {
54 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
55 | mEditor = mSharedPreferences.edit();
56 | mEditor.putBoolean(key, value);
57 | mEditor.commit();
58 | }
59 |
60 | /**
61 | * Retrieve a String value from the preferences.
62 | *
63 | * @param key The name of the preference to retrieve.
64 | * @return Returns the preference value if it exists, or null.
65 | * Throws ClassCastException if there is a preference with this name that is not a String.
66 | */
67 | public String getString(String key) {
68 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
69 | return mSharedPreferences.getString(key, null);
70 | }
71 |
72 | /**
73 | * Retrieve a String value from the preferences.
74 | *
75 | * @param key The name of the preference to retrieve.
76 | * @param defaultValue Value to return if this preference does not exist.
77 | * @return Returns the preference value if it exists, or defaultValue.
78 | * Throws ClassCastException if there is a preference with this name that is not a String.
79 | */
80 | public String getString(String key, String defaultValue) {
81 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
82 | return mSharedPreferences.getString(key, defaultValue);
83 | }
84 |
85 | /**
86 | * Retrieve a int value from the preferences.
87 | *
88 | * @param key The name of the preference to retrieve.
89 | * @return Returns the preference value if it exists, or 0.
90 | * Throws ClassCastException if there is a preference with this name that is not a int.
91 | */
92 | public int getInt(String key) {
93 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
94 | return mSharedPreferences.getInt(key, 0);
95 | }
96 |
97 | /**
98 | * Retrieve a int value from the preferences.
99 | *
100 | * @param key The name of the preference to retrieve.
101 | * @param defaultValue Value to return if this preference does not exist.
102 | * @return Returns the preference value if it exists, or defaultValue.
103 | * Throws ClassCastException if there is a preference with this name that is not a int.
104 | */
105 | public int getInt(String key, int defaultValue) {
106 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
107 | return mSharedPreferences.getInt(key, defaultValue);
108 | }
109 |
110 | /**
111 | * Retrieve a boolean value from the preferences.
112 | *
113 | * @param key The name of the preference to retrieve.
114 | * @return Returns the preference value if it exists, or false.
115 | * Throws ClassCastException if there is a preference with this name that is not a boolean.
116 | */
117 | public boolean getBoolean(String key) {
118 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
119 | return mSharedPreferences.getBoolean(key, false);
120 | }
121 |
122 | /**
123 | * Retrieve a boolean value from the preferences.
124 | *
125 | * @param key The name of the preference to retrieve.
126 | * @param defaultValue Value to return if this preference does not exist.
127 | * @return Returns the preference value if it exists, or defaultValue.
128 | * Throws ClassCastException if there is a preference with this name that is not a boolean.
129 | */
130 | public boolean getBoolean(String key, boolean defaultValue) {
131 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
132 | return mSharedPreferences.getBoolean(key, defaultValue);
133 | }
134 |
135 | /**
136 | * Clears the shared preference file
137 | */
138 | public void clear() {
139 | mSharedPreferences = mContext.getSharedPreferences(APP_PREFS, Context.MODE_PRIVATE);
140 | mSharedPreferences.edit().clear().apply();
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/ui/fragments/ChatFragment.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.ui.fragments;
2 |
3 | import android.app.ProgressDialog;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.support.v7.widget.RecyclerView;
8 | import android.view.KeyEvent;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.view.ViewGroup;
12 | import android.view.inputmethod.EditorInfo;
13 | import android.widget.EditText;
14 | import android.widget.TextView;
15 | import android.widget.Toast;
16 |
17 | import com.google.firebase.auth.FirebaseAuth;
18 |
19 | import org.greenrobot.eventbus.EventBus;
20 | import org.greenrobot.eventbus.Subscribe;
21 |
22 | import java.util.ArrayList;
23 |
24 | import exr.at.com.firebasechat.R;
25 | import exr.at.com.firebasechat.core.chat.ChatContract;
26 | import exr.at.com.firebasechat.core.chat.ChatPresenter;
27 | import exr.at.com.firebasechat.event.PushNotificationEvent;
28 | import exr.at.com.firebasechat.model.Chat;
29 | import exr.at.com.firebasechat.ui.adapters.ChatRecyclerAdapter;
30 | import exr.at.com.firebasechat.utils.Constants;
31 |
32 |
33 | public class ChatFragment extends Fragment implements ChatContract.View, TextView.OnEditorActionListener {
34 | private RecyclerView mRecyclerViewChat;
35 | private EditText mETxtMessage;
36 |
37 | private ProgressDialog mProgressDialog;
38 |
39 | private ChatRecyclerAdapter mChatRecyclerAdapter;
40 |
41 | private ChatPresenter mChatPresenter;
42 |
43 | public static ChatFragment newInstance(String receiver,
44 | String receiverUid,
45 | String firebaseToken) {
46 | Bundle args = new Bundle();
47 | args.putString(Constants.ARG_RECEIVER, receiver);
48 | args.putString(Constants.ARG_RECEIVER_UID, receiverUid);
49 | args.putString(Constants.ARG_FIREBASE_TOKEN, firebaseToken);
50 | ChatFragment fragment = new ChatFragment();
51 | fragment.setArguments(args);
52 | return fragment;
53 | }
54 |
55 | @Override
56 | public void onStart() {
57 | super.onStart();
58 | EventBus.getDefault().register(this);
59 | }
60 |
61 | @Override
62 | public void onStop() {
63 | super.onStop();
64 | EventBus.getDefault().unregister(this);
65 | }
66 |
67 | @Nullable
68 | @Override
69 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
70 | View fragmentView = inflater.inflate(R.layout.fragment_chat, container, false);
71 | bindViews(fragmentView);
72 | return fragmentView;
73 | }
74 |
75 | private void bindViews(View view) {
76 | mRecyclerViewChat = (RecyclerView) view.findViewById(R.id.recycler_view_chat);
77 | mETxtMessage = (EditText) view.findViewById(R.id.edit_text_message);
78 | }
79 |
80 | @Override
81 | public void onActivityCreated(@Nullable Bundle savedInstanceState) {
82 | super.onActivityCreated(savedInstanceState);
83 | init();
84 | }
85 |
86 | private void init() {
87 | mProgressDialog = new ProgressDialog(getActivity());
88 | mProgressDialog.setTitle(getString(R.string.loading));
89 | mProgressDialog.setMessage(getString(R.string.please_wait));
90 | mProgressDialog.setIndeterminate(true);
91 |
92 | mETxtMessage.setOnEditorActionListener(this);
93 |
94 | mChatPresenter = new ChatPresenter(this);
95 | mChatPresenter.getMessage(FirebaseAuth.getInstance().getCurrentUser().getUid(),
96 | getArguments().getString(Constants.ARG_RECEIVER_UID));
97 | }
98 |
99 | @Override
100 | public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
101 | if (actionId == EditorInfo.IME_ACTION_SEND) {
102 | sendMessage();
103 | return true;
104 | }
105 | return false;
106 | }
107 |
108 | private void sendMessage() {
109 | String message = mETxtMessage.getText().toString();
110 | String receiver = getArguments().getString(Constants.ARG_RECEIVER);
111 | String receiverUid = getArguments().getString(Constants.ARG_RECEIVER_UID);
112 | String sender = FirebaseAuth.getInstance().getCurrentUser().getEmail();
113 | String senderUid = FirebaseAuth.getInstance().getCurrentUser().getUid();
114 | String receiverFirebaseToken = getArguments().getString(Constants.ARG_FIREBASE_TOKEN);
115 | Chat chat = new Chat(sender,
116 | receiver,
117 | senderUid,
118 | receiverUid,
119 | message,
120 | System.currentTimeMillis());
121 | mChatPresenter.sendMessage(getActivity().getApplicationContext(),
122 | chat,
123 | receiverFirebaseToken);
124 | }
125 |
126 | @Override
127 | public void onSendMessageSuccess() {
128 | mETxtMessage.setText("");
129 | Toast.makeText(getActivity(), "Message sent", Toast.LENGTH_SHORT).show();
130 | }
131 |
132 | @Override
133 | public void onSendMessageFailure(String message) {
134 | Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
135 | }
136 |
137 | @Override
138 | public void onGetMessagesSuccess(Chat chat) {
139 | if (mChatRecyclerAdapter == null) {
140 | mChatRecyclerAdapter = new ChatRecyclerAdapter(new ArrayList());
141 | mRecyclerViewChat.setAdapter(mChatRecyclerAdapter);
142 | }
143 | mChatRecyclerAdapter.add(chat);
144 | mRecyclerViewChat.smoothScrollToPosition(mChatRecyclerAdapter.getItemCount() - 1);
145 | }
146 |
147 | @Override
148 | public void onGetMessagesFailure(String message) {
149 | Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
150 | }
151 |
152 | @Subscribe
153 | public void onPushNotificationEvent(PushNotificationEvent pushNotificationEvent) {
154 | if (mChatRecyclerAdapter == null || mChatRecyclerAdapter.getItemCount() == 0) {
155 | mChatPresenter.getMessage(FirebaseAuth.getInstance().getCurrentUser().getUid(),
156 | pushNotificationEvent.getUid());
157 | }
158 | }
159 | }
160 |
--------------------------------------------------------------------------------
/app/src/main/java/exr/at/com/firebasechat/core/chat/ChatInteractor.java:
--------------------------------------------------------------------------------
1 | package exr.at.com.firebasechat.core.chat;
2 |
3 | import android.content.Context;
4 | import android.util.Log;
5 |
6 | import com.google.firebase.database.ChildEventListener;
7 | import com.google.firebase.database.DataSnapshot;
8 | import com.google.firebase.database.DatabaseError;
9 | import com.google.firebase.database.DatabaseReference;
10 | import com.google.firebase.database.FirebaseDatabase;
11 | import com.google.firebase.database.ValueEventListener;
12 |
13 | import exr.at.com.firebasechat.fcm.FcmNotificationBuilder;
14 | import exr.at.com.firebasechat.model.Chat;
15 | import exr.at.com.firebasechat.utils.Constants;
16 | import exr.at.com.firebasechat.utils.SharedPrefUtil;
17 |
18 | /**
19 | * Author: Kartik Sharma
20 | * Created on: 9/2/2016 , 10:08 PM
21 | * Project: FirebaseChat
22 | */
23 |
24 | public class ChatInteractor implements ChatContract.Interactor {
25 | private static final String TAG = "ChatInteractor";
26 |
27 | private ChatContract.OnSendMessageListener mOnSendMessageListener;
28 | private ChatContract.OnGetMessagesListener mOnGetMessagesListener;
29 |
30 | public ChatInteractor(ChatContract.OnSendMessageListener onSendMessageListener) {
31 | this.mOnSendMessageListener = onSendMessageListener;
32 | }
33 |
34 | public ChatInteractor(ChatContract.OnGetMessagesListener onGetMessagesListener) {
35 | this.mOnGetMessagesListener = onGetMessagesListener;
36 | }
37 |
38 | public ChatInteractor(ChatContract.OnSendMessageListener onSendMessageListener,
39 | ChatContract.OnGetMessagesListener onGetMessagesListener) {
40 | this.mOnSendMessageListener = onSendMessageListener;
41 | this.mOnGetMessagesListener = onGetMessagesListener;
42 | }
43 |
44 | @Override
45 | public void sendMessageToFirebaseUser(final Context context, final Chat chat, final String receiverFirebaseToken) {
46 | final String room_type_1 = chat.senderUid + "_" + chat.receiverUid;
47 | final String room_type_2 = chat.receiverUid + "_" + chat.senderUid;
48 |
49 | final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
50 |
51 | databaseReference.child(Constants.ARG_CHAT_ROOMS).getRef().addListenerForSingleValueEvent(new ValueEventListener() {
52 | @Override
53 | public void onDataChange(DataSnapshot dataSnapshot) {
54 | if (dataSnapshot.hasChild(room_type_1)) {
55 | Log.e(TAG, "sendMessageToFirebaseUser: " + room_type_1 + " exists");
56 | databaseReference.child(Constants.ARG_CHAT_ROOMS).child(room_type_1).child(String.valueOf(chat.timestamp)).setValue(chat);
57 | } else if (dataSnapshot.hasChild(room_type_2)) {
58 | Log.e(TAG, "sendMessageToFirebaseUser: " + room_type_2 + " exists");
59 | databaseReference.child(Constants.ARG_CHAT_ROOMS).child(room_type_2).child(String.valueOf(chat.timestamp)).setValue(chat);
60 | } else {
61 | Log.e(TAG, "sendMessageToFirebaseUser: success");
62 | databaseReference.child(Constants.ARG_CHAT_ROOMS).child(room_type_1).child(String.valueOf(chat.timestamp)).setValue(chat);
63 | getMessageFromFirebaseUser(chat.senderUid, chat.receiverUid);
64 | }
65 | // send push notification to the receiver
66 | sendPushNotificationToReceiver(chat.sender,
67 | chat.message,
68 | chat.senderUid,
69 | new SharedPrefUtil(context).getString(Constants.ARG_FIREBASE_TOKEN),
70 | receiverFirebaseToken);
71 | mOnSendMessageListener.onSendMessageSuccess();
72 | }
73 |
74 | @Override
75 | public void onCancelled(DatabaseError databaseError) {
76 | mOnSendMessageListener.onSendMessageFailure("Unable to send message: " + databaseError.getMessage());
77 | }
78 | });
79 | }
80 |
81 | private void sendPushNotificationToReceiver(String username,
82 | String message,
83 | String uid,
84 | String firebaseToken,
85 | String receiverFirebaseToken) {
86 | FcmNotificationBuilder.initialize()
87 | .title(username)
88 | .message(message)
89 | .username(username)
90 | .uid(uid)
91 | .firebaseToken(firebaseToken)
92 | .receiverFirebaseToken(receiverFirebaseToken)
93 | .send();
94 | }
95 |
96 | @Override
97 | public void getMessageFromFirebaseUser(String senderUid, String receiverUid) {
98 | final String room_type_1 = senderUid + "_" + receiverUid;
99 | final String room_type_2 = receiverUid + "_" + senderUid;
100 |
101 | final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
102 |
103 | databaseReference.child(Constants.ARG_CHAT_ROOMS).getRef().addListenerForSingleValueEvent(new ValueEventListener() {
104 | @Override
105 | public void onDataChange(DataSnapshot dataSnapshot) {
106 | if (dataSnapshot.hasChild(room_type_1)) {
107 | Log.e(TAG, "getMessageFromFirebaseUser: " + room_type_1 + " exists");
108 | FirebaseDatabase.getInstance()
109 | .getReference()
110 | .child(Constants.ARG_CHAT_ROOMS)
111 | .child(room_type_1).addChildEventListener(new ChildEventListener() {
112 | @Override
113 | public void onChildAdded(DataSnapshot dataSnapshot, String s) {
114 | Chat chat = dataSnapshot.getValue(Chat.class);
115 | mOnGetMessagesListener.onGetMessagesSuccess(chat);
116 | }
117 |
118 | @Override
119 | public void onChildChanged(DataSnapshot dataSnapshot, String s) {
120 |
121 | }
122 |
123 | @Override
124 | public void onChildRemoved(DataSnapshot dataSnapshot) {
125 |
126 | }
127 |
128 | @Override
129 | public void onChildMoved(DataSnapshot dataSnapshot, String s) {
130 |
131 | }
132 |
133 | @Override
134 | public void onCancelled(DatabaseError databaseError) {
135 | mOnGetMessagesListener.onGetMessagesFailure("Unable to get message: " + databaseError.getMessage());
136 | }
137 | });
138 | } else if (dataSnapshot.hasChild(room_type_2)) {
139 | Log.e(TAG, "getMessageFromFirebaseUser: " + room_type_2 + " exists");
140 | FirebaseDatabase.getInstance()
141 | .getReference()
142 | .child(Constants.ARG_CHAT_ROOMS)
143 | .child(room_type_2).addChildEventListener(new ChildEventListener() {
144 | @Override
145 | public void onChildAdded(DataSnapshot dataSnapshot, String s) {
146 | Chat chat = dataSnapshot.getValue(Chat.class);
147 | mOnGetMessagesListener.onGetMessagesSuccess(chat);
148 | }
149 |
150 | @Override
151 | public void onChildChanged(DataSnapshot dataSnapshot, String s) {
152 |
153 | }
154 |
155 | @Override
156 | public void onChildRemoved(DataSnapshot dataSnapshot) {
157 |
158 | }
159 |
160 | @Override
161 | public void onChildMoved(DataSnapshot dataSnapshot, String s) {
162 |
163 | }
164 |
165 | @Override
166 | public void onCancelled(DatabaseError databaseError) {
167 | mOnGetMessagesListener.onGetMessagesFailure("Unable to get message: " + databaseError.getMessage());
168 | }
169 | });
170 | } else {
171 | Log.e(TAG, "getMessageFromFirebaseUser: no such room available");
172 | }
173 | }
174 |
175 | @Override
176 | public void onCancelled(DatabaseError databaseError) {
177 | mOnGetMessagesListener.onGetMessagesFailure("Unable to get message: " + databaseError.getMessage());
178 | }
179 | });
180 | }
181 | }
182 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 | #FFEBEE
8 | #FFCDD2
9 | #EF9A9A
10 | #E57373
11 | #EF5350
12 | #F44336
13 | #E53935
14 | #D32F2F
15 | #C62828
16 | #B71C1C
17 | #FF8A80
18 | #FF5252
19 | #FF1744
20 | #D50000
21 |
22 | #EDE7F6
23 | #D1C4E9
24 | #B39DDB
25 | #9575CD
26 | #7E57C2
27 | #673AB7
28 | #5E35B1
29 | #512DA8
30 | #4527A0
31 | #311B92
32 | #B388FF
33 | #7C4DFF
34 | #651FFF
35 | #6200EA
36 |
37 | #E1F5FE
38 | #B3E5FC
39 | #81D4FA
40 | #4FC3F7
41 | #29B6F6
42 | #03A9F4
43 | #039BE5
44 | #0288D1
45 | #0277BD
46 | #01579B
47 | #80D8FF
48 | #40C4FF
49 | #00B0FF
50 | #0091EA
51 |
52 | #E8F5E9
53 | #C8E6C9
54 | #A5D6A7
55 | #81C784
56 | #66BB6A
57 | #4CAF50
58 | #43A047
59 | #388E3C
60 | #2E7D32
61 | #1B5E20
62 | #B9F6CA
63 | #69F0AE
64 | #00E676
65 | #00C853
66 |
67 | #FFFDE7
68 | #FFF9C4
69 | #FFF59D
70 | #FFF176
71 | #FFEE58
72 | #FFEB3B
73 | #FDD835
74 | #FBC02D
75 | #F9A825
76 | #F57F17
77 | #FFFF8D
78 | #FFFF00
79 | #FFEA00
80 | #FFD600
81 |
82 | #FBE9E7
83 | #FFCCBC
84 | #FFAB91
85 | #FF8A65
86 | #FF7043
87 | #FF5722
88 | #F4511E
89 | #E64A19
90 | #D84315
91 | #BF360C
92 | #FF9E80
93 | #FF6E40
94 | #FF3D00
95 | #DD2C00
96 |
97 | #ECEFF1
98 | #CFD8DC
99 | #B0BEC5
100 | #90A4AE
101 | #78909C
102 | #607D8B
103 | #546E7A
104 | #455A64
105 | #37474F
106 | #263238
107 |
108 | #FCE4EC
109 | #F8BBD0
110 | #F48FB1
111 | #F06292
112 | #EC407A
113 | #E91E63
114 | #D81B60
115 | #C2185B
116 | #AD1457
117 | #880E4F
118 | #FF80AB
119 | #FF4081
120 | #F50057
121 | #C51162
122 |
123 | #E8EAF6
124 | #C5CAE9
125 | #9FA8DA
126 | #7986CB
127 | #5C6BC0
128 | #3F51B5
129 | #3949AB
130 | #303F9F
131 | #283593
132 | #1A237E
133 | #8C9EFF
134 | #536DFE
135 | #3D5AFE
136 | #304FFE
137 |
138 | #E0F7FA
139 | #B2EBF2
140 | #80DEEA
141 | #4DD0E1
142 | #26C6DA
143 | #00BCD4
144 | #00ACC1
145 | #0097A7
146 | #00838F
147 | #006064
148 | #84FFFF
149 | #18FFFF
150 | #00E5FF
151 | #00B8D4
152 |
153 | #F1F8E9
154 | #DCEDC8
155 | #C5E1A5
156 | #AED581
157 | #9CCC65
158 | #8BC34A
159 | #7CB342
160 | #689F38
161 | #558B2F
162 | #33691E
163 | #CCFF90
164 | #B2FF59
165 | #76FF03
166 | #64DD17
167 |
168 | #FFF8E1
169 | #FFECB3
170 | #FFE082
171 | #FFD54F
172 | #FFCA28
173 | #FFC107
174 | #FFB300
175 | #FFA000
176 | #FF8F00
177 | #FF6F00
178 | #FFE57F
179 | #FFD740
180 | #FFC400
181 | #FFAB00
182 |
183 | #EFEBE9
184 | #D7CCC8
185 | #BCAAA4
186 | #A1887F
187 | #8D6E63
188 | #795548
189 | #6D4C41
190 | #5D4037
191 | #4E342E
192 | #3E2723
193 |
194 | #F3E5F5
195 | #E1BEE7
196 | #CE93D8
197 | #BA68C8
198 | #AB47BC
199 | #9C27B0
200 | #8E24AA
201 | #7B1FA2
202 | #6A1B9A
203 | #4A148C
204 | #EA80FC
205 | #E040FB
206 | #D500F9
207 | #AA00FF
208 |
209 | #E3F2FD
210 | #BBDEFB
211 | #90CAF9
212 | #64B5F6
213 | #42A5F5
214 | #2196F3
215 | #1E88E5
216 | #1976D2
217 | #1565C0
218 | #0D47A1
219 | #82B1FF
220 | #448AFF
221 | #2979FF
222 | #2962FF
223 |
224 | #E0F2F1
225 | #B2DFDB
226 | #80CBC4
227 | #4DB6AC
228 | #26A69A
229 | #009688
230 | #00897B
231 | #00796B
232 | #00695C
233 | #004D40
234 | #A7FFEB
235 | #64FFDA
236 | #1DE9B6
237 | #00BFA5
238 |
239 | #F9FBE7
240 | #F0F4C3
241 | #E6EE9C
242 | #DCE775
243 | #D4E157
244 | #CDDC39
245 | #C0CA33
246 | #AFB42B
247 | #9E9D24
248 | #827717
249 | #F4FF81
250 | #EEFF41
251 | #C6FF00
252 | #AEEA00
253 |
254 | #FFF3E0
255 | #FFE0B2
256 | #FFCC80
257 | #FFB74D
258 | #FFA726
259 | #FF9800
260 | #FB8C00
261 | #F57C00
262 | #EF6C00
263 | #E65100
264 | #FFD180
265 | #FFAB40
266 | #FF9100
267 | #FF6D00
268 |
269 | #FAFAFA
270 | #F5F5F5
271 | #EEEEEE
272 | #E0E0E0
273 | #BDBDBD
274 | #9E9E9E
275 | #757575
276 | #616161
277 | #424242
278 | #212121
279 |
280 | #000000
281 | #FFFFFF
282 |
283 |
--------------------------------------------------------------------------------