diff --git a/README.md b/README.md index 61d39780..699059f3 100755 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@
-CometChat Android Demo app (built using **CometChat Pro**) is a fully functional messaging app capable of **one-on-one** (private) and **group** messaging along with recent conversations. The app enables users to send **text** and **multimedia messages like audio, video, images, documents.** +CometChat Android Demo app (built using **CometChat Pro**) is a fully functional messaging app capable of **one-on-one** (private) and **group** messaging. The app enables users to send **text** and **multimedia messages like audio, video, images, documents.** [![Platform](https://img.shields.io/badge/Platform-Android-brightgreen.svg)](#) [![Platform](https://img.shields.io/badge/Language-Java-yellowgreen.svg)](#) @@ -81,15 +81,17 @@ To run our open source app with CometChat Pro v1, follow these steps: ` public static final String API_KEY = "XXXXXXXXX";` + - add `google-service.json` file for push notification + ## Note - You can Obtain your *APP_ID* and *API_KEY* from [CometChat-Pro Dashboard](https://app.cometchat.com/) + You can Obtain your *APP_ID* and *API_KEY* from [CometChat-Pulse Dashboard](https://app.cometchat.com/) - For more information read [CometChat-Pro Android SDK](https://prodocs.cometchat.com/docs/android-quick-start) Documentation + For more information read [CometChat-Pulse Android SDK](https://prodocs.cometchat.com/docs/android-quick-start) Documentation @@ -97,6 +99,12 @@ To run our open source app with CometChat Pro v1, follow these steps: ![Studio Guide](https://github.com/CometChat-Pulse/android-java-chat-app/blob/master/ScreenShots/guide.png) +## Push Notification + +The Push Notification extension allows you to send push notifications to mobile apps and desktop browsers. + +For more information read [Android-Push-Notification](https://prodocs.cometchat.com/docs/android-extensions-push-notification) Documentation. + @@ -104,17 +112,17 @@ To run our open source app with CometChat Pro v1, follow these steps: ## Screenshots - + - + - + - + ` `
















diff --git a/ScreenShots/gif_1.gif b/ScreenShots/gif_1.gif new file mode 100644 index 00000000..1711ed20 Binary files /dev/null and b/ScreenShots/gif_1.gif differ diff --git a/ScreenShots/gif_2.gif b/ScreenShots/gif_2.gif new file mode 100644 index 00000000..43fa0d5c Binary files /dev/null and b/ScreenShots/gif_2.gif differ diff --git a/ScreenShots/gif_3.gif b/ScreenShots/gif_3.gif new file mode 100644 index 00000000..0e070aed Binary files /dev/null and b/ScreenShots/gif_3.gif differ diff --git a/ScreenShots/gif_4.gif b/ScreenShots/gif_4.gif new file mode 100644 index 00000000..eb41aeec Binary files /dev/null and b/ScreenShots/gif_4.gif differ diff --git a/app/build.gradle b/app/build.gradle index 403bb8de..935d11e9 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,8 +63,16 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' - //cometchat sdk - implementation 'com.cometchat:pro-android-chat-sdk:2.0.0-beta8' + //Firebase + implementation 'com.google.android.gms:play-services-auth:17.0.0' + implementation 'com.google.android.gms:play-services-plus:17.0.0' + implementation 'com.google.firebase:firebase-core:17.2.1' + implementation 'com.google.firebase:firebase-messaging:20.1.0' + implementation 'com.google.android.gms:play-services-maps:17.0.0' + implementation 'com.google.android.gms:play-services-location:17.0.0' + implementation 'com.google.android.gms:play-services-places:17.0.0' + + implementation 'com.cometchat:pro-android-chat-sdk:2.0.2' implementation 'androidx.recyclerview:recyclerview-selection:1.0.0' diff --git a/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/CallActivity.java b/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/CallActivity.java index ca14a6f2..b7ed5cc4 100755 --- a/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/CallActivity.java +++ b/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/CallActivity.java @@ -41,7 +41,6 @@ protected void onCreate(Bundle savedInstanceState) { if (getIntent().hasExtra(StringContract.IntentStrings.SESSION_ID)) { sessionId = getIntent().getStringExtra(StringContract.IntentStrings.SESSION_ID); Logger.error(TAG, " sessionId " + sessionId); - CometChat.startCall(CallActivity.this, sessionId, callView, new CometChat.OngoingCallListener() { @Override public void onUserJoined(User user) { diff --git a/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/CometChatActivity.java b/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/CometChatActivity.java index 43dfe456..07b91279 100755 --- a/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/CometChatActivity.java +++ b/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/CometChatActivity.java @@ -18,8 +18,10 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.widget.Toast; import com.cometchat.pro.core.CometChat; +import com.cometchat.pro.exceptions.CometChatException; import com.cometchat.pro.models.User; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.tabs.TabLayout; @@ -30,11 +32,15 @@ import com.inscripts.cometchatpulse.demo.Fragments.GroupListFragment; import com.inscripts.cometchatpulse.demo.Fragments.RecentsFragment; import com.inscripts.cometchatpulse.demo.Helper.FabIconAnimator; +import com.inscripts.cometchatpulse.demo.Helper.MyFirebaseMessagingService; import com.inscripts.cometchatpulse.demo.Helper.ScrollHelper; import com.inscripts.cometchatpulse.demo.Presenters.CometChatActivityPresenter; import com.inscripts.cometchatpulse.demo.R; +import com.inscripts.cometchatpulse.demo.Utils.CommonUtils; import com.inscripts.cometchatpulse.demo.Utils.FontUtils; import java.util.HashMap; +import java.util.Timer; +import java.util.TimerTask; public class CometChatActivity extends AppCompatActivity implements ScrollHelper, CometChatActivityContract.CometChatActivityView { @@ -74,9 +80,11 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_comet_chat); context = this; + MyFirebaseMessagingService.subscribeUser(CometChat.getLoggedInUser().getUid()); cometChatActivityPresenter = new CometChatActivityPresenter(); cometChatActivityPresenter.attach(this); initViewComponents(); + } private void initViewComponents() { @@ -121,13 +129,10 @@ public void onPageSelected(int i) { adapter.notifyDataSetChanged(); pageNumber=i; if (i==0) - { searchItem.setVisible(false); - } else - { searchItem.setVisible(true); - } + } @Override @@ -136,12 +141,12 @@ public void onPageScrollStateChanged(int i) { } }); - } @Override protected void onStart() { super.onStart(); + } @Override @@ -155,7 +160,6 @@ protected void onResume() { cometChatActivityPresenter.addCallEventListener(context, TAG); Log.d(TAG, "onResume: "); cometChatActivityPresenter.addMessageListener(CometChatActivity.this,TAG); - } @Override diff --git a/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/GroupChatActivity.java b/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/GroupChatActivity.java index 720426fc..e81851c2 100755 --- a/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/GroupChatActivity.java +++ b/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/GroupChatActivity.java @@ -41,6 +41,7 @@ import com.cometchat.pro.models.MessageReceipt; import com.cometchat.pro.models.TextMessage; import com.cometchat.pro.models.TypingIndicator; +import com.inscripts.cometchatpulse.demo.Helper.MyFirebaseMessagingService; import com.inscripts.cometchatpulse.demo.Helper.RecyclerTouchListener; import com.inscripts.cometchatpulse.demo.R; import com.inscripts.cometchatpulse.demo.Adapter.GroupMessageAdapter; @@ -75,7 +76,7 @@ public class GroupChatActivity extends AppCompatActivity implements GroupChatActivityContract.GroupChatView, TextWatcher, View.OnClickListener, ActionMode.Callback { - private static final int LIMIT = 10; + private static final int LIMIT = 30; private static final String TAG = "GroupChatActivity"; @@ -159,6 +160,8 @@ public class GroupChatActivity extends AppCompatActivity implements GroupChatAct private SearchView searchView; + private boolean searchBox = false; + @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); @@ -169,6 +172,7 @@ protected void onCreate(Bundle savedInstanceState) { groupChatPresenter = new GroupChatPresenter(); groupChatPresenter.attach(this); initViewComponent(); + MyFirebaseMessagingService.subscribeGroup(groupId); } @@ -274,25 +278,27 @@ private void initViewComponent() { new Thread(() -> groupChatPresenter.fetchGroupMembers(groupId)).start(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - setScrollListener(); - } else { - messageRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + if (!searchBox) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + setScrollListener(); + } else { + messageRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { - if (linearLayoutManager.findFirstVisibleItemPosition() == 0) { + if (!messageRecyclerView.canScrollVertically(-1)) { - groupChatPresenter.fetchPreviousMessage(groupId, LIMIT); + groupChatPresenter.fetchPreviousMessage(groupId, LIMIT); - } + } - //for toolbar elevation animation i.e stateListAnimator - toolbar.setSelected(recyclerView.canScrollVertically(-1)); + //for toolbar elevation animation i.e stateListAnimator + toolbar.setSelected(recyclerView.canScrollVertically(-1)); - } - }); + } + }); + } } KeyboardVisibilityEvent.setEventListener(this, var1 -> { @@ -340,7 +346,7 @@ private void setScrollListener() { public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { int temp = linearLayoutManager.findFirstVisibleItemPosition(); - if (temp < 5) { + if (!messageRecyclerView.canScrollVertically(-1)) { groupChatPresenter.fetchPreviousMessage(groupId, LIMIT); @@ -477,12 +483,14 @@ public boolean onQueryTextSubmit(String s) { @Override public boolean onQueryTextChange(String s) { + searchBox = true; groupChatPresenter.searchMessage(s,groupId); - return false; + return false; } }); searchView.setOnCloseListener(() -> { + searchBox = false; groupChatPresenter.fetchPreviousMessage(groupId,30); return false; }); @@ -568,16 +576,16 @@ protected void onResume() { super.onResume(); groupChatPresenter.addMessageReceiveListener(getResources().getString(R.string.group_message_listener), groupId, ownerId); groupChatPresenter.addGroupEventListener("action_message", groupId, ownerId); - groupChatPresenter.refreshList(groupId,ownerId,LIMIT); +// groupChatPresenter.refreshList(groupId,ownerId,LIMIT); groupChatPresenter.addCallListener("call_listener"); } @Override protected void onPause() { super.onPause(); - if (groupMessageAdapter!=null) { - groupMessageAdapter.stopPlayer(); - } + if (groupMessageAdapter!=null) { + groupMessageAdapter.stopPlayer(); + } groupChatPresenter.removeMessageReceiveListener(getResources().getString(R.string.group_message_listener)); groupChatPresenter.removeMessageReceiveListener("action_message"); groupChatPresenter.removeCallListener("call_listener"); @@ -668,6 +676,7 @@ public void setAdapter(List messageList) { } if (groupMessageAdapter == null) { groupMessageAdapter = new GroupMessageAdapter(messageList, context, groupId, ownerId); + messageRecyclerView.setAdapter(groupMessageAdapter); decor = new StickyHeaderDecoration(groupMessageAdapter); messageRecyclerView.addItemDecoration(decor, 0); @@ -709,26 +718,26 @@ public void addReceivedMessage(BaseMessage baseMessage) { @Override public void typingStarted(TypingIndicator typingIndicator) { - toolbarSubTitle.setText(typingIndicator.getSender().getName()+" "+getString(R.string.is_typing)); + toolbarSubTitle.setText(typingIndicator.getSender().getName()+" "+getString(R.string.is_typing)); } @Override public void typingEnded(TypingIndicator typingIndicator) { - toolbarSubTitle.setText(names); + toolbarSubTitle.setText(names); } @Override public void setDeliveryReceipt(MessageReceipt messageReceipt) { - if (groupMessageAdapter!=null){ - groupMessageAdapter.setDelivered(messageReceipt); - } +// if (groupMessageAdapter!=null){ +// groupMessageAdapter.setDelivered(messageReceipt); +// } } @Override public void onMessageRead(MessageReceipt messageReceipt) { - if (groupMessageAdapter!=null){ - groupMessageAdapter.setRead(messageReceipt); - } +// if (groupMessageAdapter!=null){ +// groupMessageAdapter.setRead(messageReceipt); +// } } @Override @@ -991,4 +1000,4 @@ private void addAttachment(int type) { } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/LoginActivity.java b/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/LoginActivity.java index 6e7c4b9a..afea27cb 100755 --- a/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/LoginActivity.java +++ b/app/src/main/java/com/inscripts/cometchatpulse/demo/Activity/LoginActivity.java @@ -13,6 +13,8 @@ import com.inscripts.cometchatpulse.demo.R; import com.inscripts.cometchatpulse.demo.Contracts.LoginActivityContract; import com.inscripts.cometchatpulse.demo.Presenters.LoginAcitivityPresenter; +import com.inscripts.cometchatpulse.demo.Utils.CommonUtils; + import java.util.ArrayList; import java.util.List; @@ -92,6 +94,6 @@ private List