diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a94b93b..382babdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,12 @@ All notable changes to this project will be documented here. -## [0.9.14.0] -2021-11-15 +## [0.9.14.0] -2021-12-26 ### Added + ```SearchSystemMetadataRequest``` + ```startShareScreen``` callback ```onShareScreenStarted``` method @@ -35,6 +37,8 @@ All notable changes to this project will be documented here. Update podcall to 3.5.2 + Deprecated NosqlListMessageCriteriaVO + ## [0.9.13.0] -2021-10-18 diff --git a/app/build.gradle b/app/build.gradle index 2ba91166..af0eb9c4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,17 +28,17 @@ android { } flavorDimensions "default" - productFlavors{ + productFlavors { - withCall{ + withCall { versionName "1.3.0" versionCode 1 - matchingFallbacks = ["withCall","withoutCall"] + matchingFallbacks = ["withCall", "withoutCall"] } - withoutCall{ + withoutCall { versionName "0.0.1" versionCode 1 - matchingFallbacks = ["withoutCall","withCall"] + matchingFallbacks = ["withoutCall", "withCall"] } } @@ -53,9 +53,9 @@ android { def buildType = variant.buildType.name // e. g. debug def variantName = variant.name // e. g. withCallDebug - if(flavorName == "withCall"){ + if (flavorName == "withCall") { outputFileName = "PodCall-v${versionName}.apk" - }else if(flavorName=="withoutCall"){ + } else if (flavorName == "withoutCall") { outputFileName = "PodChat-v${versionName}.apk" } @@ -63,7 +63,6 @@ android { } - compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -90,18 +89,12 @@ dependencies { implementation 'com.android.support.constraint:constraint-layout:1.1.3' - //Test -// androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' - -// androidTestImplementation 'org.mockito:mockito-core:3.1.0' - // required if you want to use Mockito for Android tests -// androidTestImplementation 'org.mockito:mockito-android:3.1.0' - - testImplementation 'junit:junit:4.12' -// androidTestImplementation 'org.hamcrest:hamcrest-library:1.3' - -// androidTestImplementation 'com.android.support.test:rules:1.0.2' -// androidTestImplementation 'com.android.support.test:runner:1.0.2' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.mockito:mockito-core:4.1.0' + androidTestImplementation 'org.mockito:mockito-android:4.1.0' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test:rules:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' // implementation 'com.google.android.gms:play-services:12.0.1' implementation 'com.orhanobut:logger:2.2.0' @@ -124,7 +117,7 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.8.0' //placeholderview // implementation 'com.mindorks:placeholderview:0.7.1' - implementation ('com.mindorks:placeholderview:0.7.1') { + implementation('com.mindorks:placeholderview:0.7.1') { exclude group: 'com.android.support', module: 'recyclerview-v7' } diff --git a/app/src/androidTest/java/com/example/podchat/ChatTest.java b/app/src/androidTest/java/com/example/podchat/ChatTest.java index 31c9cce0..5739250b 100644 --- a/app/src/androidTest/java/com/example/podchat/ChatTest.java +++ b/app/src/androidTest/java/com/example/podchat/ChatTest.java @@ -17,7 +17,6 @@ import com.example.chat.application.chatexample.ChatPresenter; import com.fanap.podchat.ProgressHandler; import com.fanap.podchat.chat.Chat; -import com.fanap.podchat.chat.ChatAdapter; import com.fanap.podchat.chat.ChatListener; import com.fanap.podchat.chat.pin.pin_message.model.RequestPinMessage; import com.fanap.podchat.chat.user.profile.RequestUpdateProfile; @@ -52,7 +51,6 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Date; @@ -66,8 +64,9 @@ @RunWith(AndroidJUnit4.class) -public class ChatTest extends ChatAdapter { +public class ChatTest { + public static final boolean CACHE = false; private static ChatContract.presenter presenter; @Mock private static ChatContract.view view; @@ -109,63 +108,16 @@ public static void initial() { chat = Chat.init(appContext); -// chat.isCacheables(true); -// -// chat.isLoggable(true); -// chat.rawLog(true); -// chat.isSentryLogActive(true); -// chat.isSentryResponseLogActive(true); -// -// chat.setDownloadDirectory(appContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)); -// -// TimeoutConfig timeout = new TimeoutConfig() -// .newConfigBuilder() -// .withConnectTimeout(30, TimeUnit.SECONDS) -// .withWriteTimeout(30, TimeUnit.MINUTES) -// .withReadTimeout(30, TimeUnit.MINUTES) -// .build(); -// -// -// chat.setUploadTimeoutConfig(timeout); -// -// chat.setDownloadTimeoutConfig(timeout); -// -// NetworkPingSender.NetworkStateConfig build = new NetworkPingSender.NetworkStateConfig() -// .setHostName("msg.pod.ir") -// .setPort(443) -// .setDisConnectionThreshold(2) -// .setInterval(7000) -// .setConnectTimeout(10000) -// .build(); - - -// TimeoutConfig uploadConfig = new TimeoutConfig() -// .newConfigBuilder() -// .withConnectTimeout(120, TimeUnit.MINUTES) -// .withWriteTimeout(120, TimeUnit.MINUTES) -// .withReadTimeout(120, TimeUnit.MINUTES) -// .build(); -// -// TimeoutConfig downloadConfig = new TimeoutConfig() -// .newConfigBuilder() -// .withConnectTimeout(20, TimeUnit.SECONDS) -// .withWriteTimeout(0, TimeUnit.SECONDS) -// .withReadTimeout(5, TimeUnit.MINUTES) -// .build(); - -// chat.setNetworkStateConfig(build); -// -// chat.setUploadConfig(uploadConfig); -// -// chat.setDownloadConfig(downloadConfig); - - } @Before public void createChat() { Looper.prepare(); - MockitoAnnotations.initMocks(this); + + view = Mockito.mock(ChatContract.view.class); + + chatActivity = chatActivityRule.getActivity(); + presenter = new ChatPresenter(appContext, view, chatActivity); RequestConnect rc = new RequestConnect.Builder( socketAddress, @@ -192,37 +144,16 @@ public void onChatState(String state) { chat.connect(rc); + chat.isCacheables(CACHE); + pauseProcess(); } - @Before - public void setUp() { -// Looper.prepare(); -// appContext = InstrumentationRegistry.getTargetContext(); -// MockitoAnnotations.initMocks(this); - chatActivity = chatActivityRule.getActivity(); - presenter = new ChatPresenter(appContext, view, chatActivity); - -// RequestConnect rc = new RequestConnect.Builder( -// socketAddress, -// APP_ID, -// serverName, -// "f29512343de1472fa15d1e497e264c54", -// ssoHost, -// platformHost, -// fileServer, -// "podSpaceServer") -// .build(); - -// presenter.connect(rc); - - } final ArrayList threads = new ArrayList<>(); - //requests for list of threads @Test public void populateThreadsListFromServerOrCache() { @@ -234,7 +165,6 @@ public void onGetThread(String content, ChatResponse thread) { System.out.println("Received List: " + content); threads.addAll(thread.getResult().getThreads()); - resumeProcess(); } }; @@ -247,8 +177,10 @@ public void onGetThread(String content, ChatResponse thread) { presenter.getThreads(requestThread, null); - pauseProcess(); - System.out.println("Received List: " + threads.size()); + long t1 = System.currentTimeMillis(); + Mockito.verify(view, Mockito.after(10000).atLeastOnce()).onGetThreadList(Mockito.any(), Mockito.any()); + long t2 = System.currentTimeMillis(); + System.out.println("Received List: " + threads.size() + " after: " + (t2 - t1) + " ms"); } @@ -261,7 +193,7 @@ public void populateThreadsListFromServerOnly() { @Override public void onGetThread(String content, ChatResponse thread) { - if(!thread.isCache()){ + if (!thread.isCache()) { System.out.println("Received List: " + content); threads.addAll(thread.getResult().getThreads()); resumeProcess(); @@ -270,11 +202,12 @@ public void onGetThread(String content, ChatResponse thread) { } }; - chat.addListener(chatListeners); + chat.setListener(chatListeners); RequestThread requestThread = new RequestThread.Builder() .count(25) + .withNoCache() .build(); presenter.getThreads(requestThread, null); @@ -293,7 +226,7 @@ public void populateThreadsListFromCacheOnly() { @Override public void onGetThread(String content, ChatResponse thread) { - if(thread.isCache()){ + if (thread.isCache()) { System.out.println("Received List: " + content); threads.addAll(thread.getResult().getThreads()); resumeProcess(); @@ -316,32 +249,6 @@ public void onGetThread(String content, ChatResponse thread) { } - private void resumeProcess() { - synchronized (sync) { - sync.notify(); - } - } - - private void pauseProcess() { - synchronized (sync) { - try { - sync.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - } - -// @After -// public void closeChat() { -// if (chat != null) { -// chat.closeChat(); -// } else if (presenter != null) { -// presenter.closeChat(); -// } -// } - - @Test public void chatListeners() { @@ -529,7 +436,7 @@ public void sendALotOfMessageToThread() { long threadID = threads.get(0).getId(); for (Thread thread : new ArrayList<>(threads)) { if (!thread.isClosed() && - thread.getParticipantCount() > 1) { + thread.getParticipantCount() > 1) { threadID = thread.getId(); } } @@ -867,20 +774,8 @@ public void unpinMessage() { } - private void sleep(int i) { - try { - java.lang.Thread.sleep(i); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - @Override - public void onGetThread(String content, ChatResponse thread) { - super.onGetThread(content, thread); - - } @Test @MediumTest @@ -1325,4 +1220,27 @@ public void searchMap() { sleep(3000); Mockito.verify(view, Mockito.times(1)).onMapSearch(); } + + private void sleep(int i) { + try { + java.lang.Thread.sleep(i); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + private void resumeProcess() { + synchronized (sync) { + sync.notify(); + } + } + + private void pauseProcess() { + synchronized (sync) { + try { + sync.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } } diff --git a/app/src/androidTest/java/com/example/podchat/ChatTest.zip b/app/src/androidTest/java/com/example/podchat/ChatTest.zip deleted file mode 100644 index 482b0068..00000000 Binary files a/app/src/androidTest/java/com/example/podchat/ChatTest.zip and /dev/null differ diff --git a/app/src/androidTest/java/com/example/podchat/LocalChatTest.java b/app/src/androidTest/java/com/example/podchat/LocalChatTest.java index 9bf11e36..3c05ec0d 100644 --- a/app/src/androidTest/java/com/example/podchat/LocalChatTest.java +++ b/app/src/androidTest/java/com/example/podchat/LocalChatTest.java @@ -7,6 +7,7 @@ import android.support.test.filters.MediumTest; import android.support.test.runner.AndroidJUnit4; +import com.example.chat.application.chatexample.ChatActivity; import com.example.chat.application.chatexample.ChatContract; import com.example.chat.application.chatexample.ChatPresenter; import com.fanap.podchat.mainmodel.History; @@ -57,7 +58,7 @@ public class LocalChatTest { private static String TYPE_CODE = ""; - private ChatSandBoxActivity activy; + private ChatActivity activy; @Before public void setUp() { diff --git a/app/src/androidTest/java/com/example/podchat/SearchMetadataTest.java b/app/src/androidTest/java/com/example/podchat/SearchMetadataTest.java new file mode 100644 index 00000000..d560d52b --- /dev/null +++ b/app/src/androidTest/java/com/example/podchat/SearchMetadataTest.java @@ -0,0 +1,839 @@ +package com.example.podchat; + +import static com.example.chat.application.chatexample.ChatActivity.APP_ID; +import static com.fanap.podchat.util.ChatStateType.ChatSateConstant.CHAT_READY; + +import android.app.Activity; +import android.content.Context; +import android.os.Looper; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.LargeTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import com.example.chat.application.chatexample.BaseApplication; +import com.example.chat.application.chatexample.ChatActivity; +import com.example.chat.application.chatexample.ChatContract; +import com.example.chat.application.chatexample.ChatPresenter; +import com.fanap.podchat.chat.App; +import com.fanap.podchat.chat.Chat; +import com.fanap.podchat.chat.ChatListener; +import com.fanap.podchat.example.R; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; +import com.fanap.podchat.mainmodel.NosqlSearchMetadataCriteria; +import com.fanap.podchat.mainmodel.Thread; +import com.fanap.podchat.model.ChatResponse; +import com.fanap.podchat.model.ResultHistory; +import com.fanap.podchat.model.ResultMessage; +import com.fanap.podchat.model.ResultNewMessage; +import com.fanap.podchat.model.ResultThreads; +import com.fanap.podchat.requestobject.RequestConnect; +import com.fanap.podchat.requestobject.RequestMessage; +import com.fanap.podchat.requestobject.RequestThread; +import com.fanap.podchat.util.TextMessageType; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Random; + + +@RunWith(AndroidJUnit4.class) +public class SearchMetadataTest { + + public static final boolean CACHE = true; + private static ChatContract.presenter presenter; + @Mock + private static ChatContract.view view; + + + @Mock + private Activity activity; + private static Context appContext; + + private static String serverName = "chat-server"; + private static String appId = "POD-Chat"; + private static String ssoHost = BaseApplication.getInstance().getString(R.string.ssoHost); + private static String NAME = BaseApplication.getInstance().getString(R.string.sandbox_server_name); + private static String socketAddress = BaseApplication.getInstance().getString(R.string.sandbox_socketAddress); + private static String platformHost = BaseApplication.getInstance().getString(R.string.sandbox_platformHost); + private static String fileServer = BaseApplication.getInstance().getString(R.string.sandbox_fileServer); + private static String TOKEN = "cf06e0e5cc3f41fba837f4d05b9a4138"; + + + @Mock + ChatListener chatListeners; + + private ChatActivity chatActivity; + + + static Chat chat; + + static final Object sync = new Object(); + + @Rule + public ActivityTestRule chatActivityRule = new ActivityTestRule<>(ChatActivity.class); + + + @BeforeClass + public static void initial() { + + + appContext = InstrumentationRegistry.getTargetContext(); + + chat = Chat.init(appContext); + + } + + @Before + public void createChat() { + Looper.prepare(); + + view = Mockito.mock(ChatContract.view.class); + + chatActivity = chatActivityRule.getActivity(); + presenter = new ChatPresenter(appContext, view, chatActivity); + + RequestConnect rc = new RequestConnect.Builder( + socketAddress, + APP_ID, + serverName, + TOKEN, + ssoHost, + platformHost, + fileServer, + "podSpaceServer") + .build(); + + + chatListeners = new ChatListener() { + @Override + public void onChatState(String state) { + if (state.equals(CHAT_READY)) { + resumeProcess(); + } + } + }; + + chat.addListener(chatListeners); + + chat.connect(rc); + + chat.isCacheables(CACHE); + + pauseProcess(); + + + } + + + final ArrayList threads = new ArrayList<>(); + + //requests for list of threads + @Test + public void populateThreadsListFromServerOrCache() { + + + chatListeners = new ChatListener() { + @Override + public void onGetThread(String content, ChatResponse thread) { + + System.out.println("Received List: " + content); + threads.addAll(thread.getResult().getThreads()); + } + }; + + chat.addListener(chatListeners); + + RequestThread requestThread = + new RequestThread.Builder() + .count(25) + .build(); + + presenter.getThreads(requestThread, null); + + long t1 = System.currentTimeMillis(); + Mockito.verify(view, Mockito.after(10000).atLeastOnce()).onGetThreadList(Mockito.any(), Mockito.any()); + long t2 = System.currentTimeMillis(); + System.out.println("Received List: " + threads.size() + " after: " + (t2 - t1) + " ms"); + + } + + //requests for list of threads from server + @Test + public void populateThreadsListFromServerOnly() { + + + chatListeners = new ChatListener() { + @Override + public void onGetThread(String content, ChatResponse thread) { + + if (!thread.isCache()) { + System.out.println("Received List: " + content); + threads.addAll(thread.getResult().getThreads()); + resumeProcess(); + } + + } + }; + + chat.setListener(chatListeners); + + RequestThread requestThread = + new RequestThread.Builder() + .count(25) + .withNoCache() + .build(); + + presenter.getThreads(requestThread, null); + + pauseProcess(); + System.out.println("Received List: " + threads.size()); + + } + + //requests for list of threads from cache + @Test + public void populateThreadsListFromCacheOnly() { + + + chatListeners = new ChatListener() { + @Override + public void onGetThread(String content, ChatResponse thread) { + + if (thread.isCache()) { + System.out.println("Received List: " + content); + threads.addAll(thread.getResult().getThreads()); + resumeProcess(); + } + + } + }; + + chat.addListener(chatListeners); + + RequestThread requestThread = + new RequestThread.Builder() + .count(25) + .build(); + + presenter.getThreads(requestThread, null); + + pauseProcess(); + System.out.println("Received List: " + threads.size()); + + } + + @Test + public void chatListeners() { + + ChatListener listener1 = new ChatListener() { + @Override + public void onSent(String content, ChatResponse response) { + + } + }; + chat.addListener(listener1); + ChatListener listener2 = new ChatListener() { + @Override + public void onSent(String content, ChatResponse response) { + + } + }; + chat.addListener(listener2); + ChatListener listener3 = new ChatListener() { + @Override + public void onSent(String content, ChatResponse response) { + + } + }; + chat.addListener(listener3); + + chat.removeListener(listener2); + + Assert.assertFalse(chat.getListeners().contains(listener2)); + + } + + public static class DummyMetadataVO { + Integer count = 1; + String desc = "type"; + } + + @Test + @LargeTest + public void sendMessageWithMetadataTest() { + + populateThreadsListFromServerOnly(); + + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + + DummyMetadataVO dummyMetadataVO = new DummyMetadataVO(); + dummyMetadataVO.count = new Random().nextInt(); + dummyMetadataVO.desc = dummyMetadataVO.desc + "" + dummyMetadataVO.count; + String meta = App.getGson().toJson(dummyMetadataVO); + + RequestMessage request = + new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) + .messageType(TextMessageType.Constants.TEXT) + .jsonMetaData(meta) + .build(); + + chat.sendTextMessage(request, null); + + sleep(2000); + + for (int i = 0; i < 16; i++) { + dummyMetadataVO.count++; + dummyMetadataVO.desc = String.format("%s%d", dummyMetadataVO.desc, dummyMetadataVO.count); + String meta2 = App.getGson().toJson(dummyMetadataVO); + + request = + new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) + .messageType(TextMessageType.Constants.TEXT) + .jsonMetaData(meta2) + .build(); + + chat.sendTextMessage(request, null); + + sleep(6000); + } + + Mockito.verify(mTestListener, Mockito.after(2000).atLeastOnce()).onNewMessage(Mockito.any(), + Mockito.argThat((ChatResponse resp) -> resp.getResult().getMessageVO().getSystemMetadata().equals(meta))); + + Mockito.verify(mTestListener, Mockito.after(2000).atLeastOnce()).onNewMessage(Mockito.any(), + Mockito.argThat((ChatResponse resp) -> !resp.getResult().getMessageVO().getSystemMetadata().equals("I'm something else!"))); + + } + + + @Test + @LargeTest + public void searchHistoryWithMetadata_LT_Test() { + + populateThreadsListFromServerOnly(); + + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + NosqlSearchMetadataCriteria + metadataCriteria = + new NosqlSearchMetadataCriteria.Builder("count") + .lte("4") + .build(); + + SearchSystemMetadataRequest request = + new SearchSystemMetadataRequest.Builder(thread.getId()) + .metadataCriteria(metadataCriteria) + .count(50) + .build(); + + chat.searchHistory(request, null); + + Mockito.verify(mTestListener, Mockito.after(5000).atLeastOnce()) + .onGetHistory(Mockito.any(String.class), + Mockito.argThat((ChatResponse resp) -> resp.getResult().getHistory().size() > 0)); + } + + + @Test + @LargeTest + public void searchHistoryWithMetadata_GT_Test() { + + populateThreadsListFromServerOnly(); + + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + DummyMetadataVO dummyMetadataVO = new DummyMetadataVO(); + dummyMetadataVO.desc = "GT test"; + dummyMetadataVO.count = 12; + String meta = App.getGson().toJson(dummyMetadataVO); + + RequestMessage sendMessageWithMetadataRequest = + new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) + .messageType(TextMessageType.Constants.TEXT) + .jsonMetaData(meta) + .build(); + + chat.sendTextMessage(sendMessageWithMetadataRequest, null); + + sleep(6000); + + + NosqlSearchMetadataCriteria + metadataCriteria = + new NosqlSearchMetadataCriteria.Builder("count") + .gte("12") + .build(); + + SearchSystemMetadataRequest request = + new SearchSystemMetadataRequest.Builder(thread.getId()) + .metadataCriteria(metadataCriteria) + .count(50) + .build(); + + chat.searchHistory(request, null); + + + Mockito.verify(mTestListener, Mockito.after(5000).atLeastOnce()) + .onGetHistory(Mockito.any(String.class), Mockito.argThat((ChatResponse resp) -> resp.getResult().getHistory().size() > 0)); + + } + + + @Test + @LargeTest + public void searchHistoryWithMetadata_Has_Test() { + + populateThreadsListFromServerOnly(); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + + DummyMetadataVO dummyMetadataVO = new DummyMetadataVO(); + dummyMetadataVO.desc = "Find me before " + System.currentTimeMillis() + (1_000_000 * 6); + String meta = App.getGson().toJson(dummyMetadataVO); + + RequestMessage sendMessageWithMetadataRequest = + new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) + .messageType(TextMessageType.Constants.TEXT) + .jsonMetaData(meta) + .build(); + + chat.sendTextMessage(sendMessageWithMetadataRequest, null); + + sleep(6000); + + NosqlSearchMetadataCriteria + metadataCriteria = + new NosqlSearchMetadataCriteria.Builder("desc") + .has(" me ") + .build(); + + SearchSystemMetadataRequest request = + new SearchSystemMetadataRequest.Builder(thread.getId()) + .metadataCriteria(metadataCriteria) + .count(50) + .build(); + + chat.searchHistory(request, null); + + + Mockito.verify(mTestListener, Mockito.after(5000).atLeastOnce()) + .onGetHistory(Mockito.any(String.class), + Mockito.argThat((ChatResponse resp) -> + resp.getResult().getHistory().stream().anyMatch( + messageVO -> messageVO.getSystemMetadata().contains(dummyMetadataVO.desc)))); + + } + + + @Test + @LargeTest + public void searchHistoryWithMetadata_Is_StringTest() { + + populateThreadsListFromServerOnly(); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + DummyMetadataVO dummyMetadataVO = new DummyMetadataVO(); + + dummyMetadataVO.desc = "This is me!"; +// dummyMetadataVO.desc = UUID.randomUUID().toString(); + + String meta = App.getGson().toJson(dummyMetadataVO); + + RequestMessage sendMessageWithMetadataRequest = + new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) + .messageType(TextMessageType.Constants.TEXT) + .jsonMetaData(meta) + .build(); + + chat.sendTextMessage(sendMessageWithMetadataRequest, null); + + sleep(6000); + + NosqlSearchMetadataCriteria + metadataCriteria = + new NosqlSearchMetadataCriteria.Builder("desc") + .is(dummyMetadataVO.desc) + .build(); + + SearchSystemMetadataRequest request = + new SearchSystemMetadataRequest.Builder(thread.getId()) + .metadataCriteria(metadataCriteria) + .count(50) + .build(); + + chat.searchHistory(request, null); + + + Mockito.verify(mTestListener, Mockito.after(5000).atLeastOnce()) + .onGetHistory(Mockito.any(String.class), + Mockito.argThat((ChatResponse resp) -> + resp.getResult().getHistory().stream().anyMatch( + messageVO -> messageVO.getSystemMetadata().equals(meta)))); + + } + + + @Test + @LargeTest + public void searchHistoryWithMetadata_Is_NumberTest() { + + populateThreadsListFromServerOnly(); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + DummyMetadataVO dummyMetadataVO = new DummyMetadataVO(); + + dummyMetadataVO.desc = "876"; + + String meta = App.getGson().toJson(dummyMetadataVO); + + RequestMessage sendMessageWithMetadataRequest = + new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) + .messageType(TextMessageType.Constants.TEXT) + .jsonMetaData(meta) + .build(); + + chat.sendTextMessage(sendMessageWithMetadataRequest, null); + + sleep(6000); + + NosqlSearchMetadataCriteria + metadataCriteria = + new NosqlSearchMetadataCriteria.Builder("desc") + .is(dummyMetadataVO.desc) + .build(); + + SearchSystemMetadataRequest request = + new SearchSystemMetadataRequest.Builder(thread.getId()) + .metadataCriteria(metadataCriteria) + .count(50) + .build(); + + chat.searchHistory(request, null); + + + Mockito.verify(mTestListener, Mockito.after(5000).atLeastOnce()) + .onGetHistory(Mockito.any(String.class), + Mockito.argThat((ChatResponse resp) -> + resp.getResult().getHistory().stream().anyMatch( + messageVO -> messageVO.getSystemMetadata().equals(meta)))); + + } + + @Test + @LargeTest + public void searchHistoryWithMetadata_AND_Test() { + + populateThreadsListFromServerOnly(); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + + DummyMetadataVO dummyMetadataVO = new DummyMetadataVO(); + dummyMetadataVO.count = 1001; +// String meta = App.getGson().toJson(dummyMetadataVO); +// +// RequestMessage sendMessageWithMetadataRequest = +// new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) +// .messageType(TextMessageType.Constants.TEXT) +// .jsonMetaData(meta) +// .build(); +// +// chat.sendTextMessage(sendMessageWithMetadataRequest, null); +// +// sleep(6000); +// +// dummyMetadataVO.count = 1002; +// meta = App.getGson().toJson(dummyMetadataVO); +// +// sendMessageWithMetadataRequest.setJsonMetaData(meta); +// chat.sendTextMessage(sendMessageWithMetadataRequest, null); +// +// sleep(6000); + + +// NosqlSearchMetadataCriteria +// metadataCriteriaLB = +// new NosqlSearchMetadataCriteria.Builder("count") +// .gt("1000") +// .build(); + + NosqlSearchMetadataCriteria + metadataCriteriaUB = + new NosqlSearchMetadataCriteria.Builder("count") + .lte("1002") + .build(); + + List criteriaList = new ArrayList<>(); + +// criteriaList.add(metadataCriteriaLB); + criteriaList.add(metadataCriteriaUB); + + NosqlSearchMetadataCriteria + metadataCriteria = + new NosqlSearchMetadataCriteria.Builder("count") + .gt("1000") + .and(criteriaList) + .build(); + + SearchSystemMetadataRequest request = + new SearchSystemMetadataRequest.Builder(thread.getId()) + .metadataCriteria(metadataCriteria) + .count(50) + .build(); + + chat.searchHistory(request, null); + + + Mockito.verify(mTestListener, Mockito.after(5000).atLeastOnce()) + .onGetHistory(Mockito.any(String.class), + Mockito.argThat((ChatResponse resp) -> + resp.getResult().getHistory().stream().anyMatch( + messageVO -> messageVO.getSystemMetadata().contains(String.valueOf(dummyMetadataVO.count))))); + + } + + + @Test + @LargeTest + public void searchHistoryWithMetadata_OR_Test() { + + populateThreadsListFromServerOnly(); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + + DummyMetadataVO dummyMetadataVO = new DummyMetadataVO(); + int random1 = Math.abs(new Random().nextInt()); + dummyMetadataVO.count = random1; + String meta = App.getGson().toJson(dummyMetadataVO); + + RequestMessage sendMessageWithMetadataRequest = + new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) + .messageType(TextMessageType.Constants.TEXT) + .jsonMetaData(meta) + .build(); + + chat.sendTextMessage(sendMessageWithMetadataRequest, null); + + sleep(6000); + + int random2 = Math.abs(new Random().nextInt()); + dummyMetadataVO.count = random2; + meta = App.getGson().toJson(dummyMetadataVO); + + sendMessageWithMetadataRequest.setJsonMetaData(meta); + chat.sendTextMessage(sendMessageWithMetadataRequest, null); + + sleep(6000); + + +// NosqlSearchMetadataCriteria +// metadataCriteriaLB = +// new NosqlSearchMetadataCriteria.Builder("count") +// .is(String.valueOf(random1)) +// .build(); + + NosqlSearchMetadataCriteria + metadataCriteriaUB = + new NosqlSearchMetadataCriteria.Builder("count") + .is(String.valueOf(random2)) + .build(); + + List criteriaList = new ArrayList<>(); + +// criteriaList.add(metadataCriteriaLB); + criteriaList.add(metadataCriteriaUB); + + NosqlSearchMetadataCriteria + metadataCriteria = + new NosqlSearchMetadataCriteria.Builder("count") + .is(String.valueOf(random1)) + .or(criteriaList) + .build(); + + SearchSystemMetadataRequest request = + new SearchSystemMetadataRequest.Builder(thread.getId()) + .metadataCriteria(metadataCriteria) + .count(50) + .build(); + + chat.searchHistory(request, null); + + + Mockito.verify(mTestListener, Mockito.after(5000).atLeastOnce()) + .onGetHistory(Mockito.any(String.class), + Mockito.argThat((ChatResponse resp) -> + resp.getResult().getHistory().stream().anyMatch( + messageVO -> messageVO.getSystemMetadata().contains(String.valueOf(dummyMetadataVO.count))))); + + } + + @Test + @LargeTest + public void searchHistoryWithMetadata_NOT_Test() { + + populateThreadsListFromServerOnly(); + + ChatListener mTestListener = Mockito.mock(ChatListener.class); + + chat.setListener(mTestListener); + + + assert threads.size() > 0; + + Thread thread = threads.get(0); + + DummyMetadataVO dummyMetadataVO = new DummyMetadataVO(); + RequestMessage.Builder sendMessageWithMetadataRequest; + sendMessageWithMetadataRequest = new RequestMessage.Builder("Android Test " + new Date(), thread.getId()) + .messageType(TextMessageType.Constants.TEXT); + + + //Meta1 + int random1 = Math.abs(new Random().nextInt()); + dummyMetadataVO.count = random1; + String meta1 = App.getGson().toJson(dummyMetadataVO); + sendMessageWithMetadataRequest.jsonMetaData(meta1); + chat.sendTextMessage(sendMessageWithMetadataRequest.build(), null); + sleep(6000); + + + //Meta2 + int random2 = Math.abs(new Random().nextInt()); + dummyMetadataVO.count = random2; + String meta2 = App.getGson().toJson(dummyMetadataVO); + sendMessageWithMetadataRequest.jsonMetaData(meta2); + chat.sendTextMessage(sendMessageWithMetadataRequest.build(), null); + sleep(6000); + + + + NosqlSearchMetadataCriteria + metadataCriteriaUB = + new NosqlSearchMetadataCriteria.Builder("count") + .is(String.valueOf(random2)) + .build(); + + List criteriaList = new ArrayList<>(); + + criteriaList.add(metadataCriteriaUB); + + NosqlSearchMetadataCriteria + metadataCriteria = + new NosqlSearchMetadataCriteria.Builder("count") + .gte(String.valueOf(random1)) + .not(criteriaList) + .build(); + + SearchSystemMetadataRequest request = + new SearchSystemMetadataRequest.Builder(thread.getId()) + .metadataCriteria(metadataCriteria) + .count(50) + .build(); + + chat.searchHistory(request, null); + + + Mockito.verify(mTestListener, Mockito.after(5000).atLeastOnce()) + .onGetHistory(Mockito.any(String.class), + Mockito.argThat((ChatResponse resp) -> + resp.getResult().getHistory().stream().noneMatch( + messageVO -> messageVO.getSystemMetadata().contains(meta2)))); + + } + + + + private void resumeProcess() { + synchronized (sync) { + sync.notify(); + } + } + + private void pauseProcess() { + synchronized (sync) { + try { + sync.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + private void sleep(int i) { + try { + java.lang.Thread.sleep(i); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/app/src/main/java/com/example/chat/application/chatexample/ChatActivity.java b/app/src/main/java/com/example/chat/application/chatexample/ChatActivity.java index 29ec1009..3f2573b9 100644 --- a/app/src/main/java/com/example/chat/application/chatexample/ChatActivity.java +++ b/app/src/main/java/com/example/chat/application/chatexample/ChatActivity.java @@ -75,7 +75,7 @@ import com.fanap.podchat.mainmodel.FileUpload; import com.fanap.podchat.mainmodel.Invitee; import com.fanap.podchat.mainmodel.Inviter; -import com.fanap.podchat.mainmodel.NosqlListMessageCriteriaVO; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; import com.fanap.podchat.mainmodel.NosqlSearchMetadataCriteria; import com.fanap.podchat.mainmodel.RequestSearchContact; import com.fanap.podchat.mainmodel.RequestThreadInnerMessage; @@ -173,8 +173,7 @@ public class ChatActivity extends AppCompatActivity // Chat server config -// TOKEN = BaseApplication.getInstance().getString(R.string.Pooria_Pahlevani); - private String TOKEN = "91cf7327e2c148b78fb65230d5bba49a"; + private String TOKEN = BaseApplication.getInstance().getString(R.string.Ahmad_Sajadi); private static String ssoHost = BaseApplication.getInstance().getString(R.string.ssoHost); private static String serverName = "chat-server"; private static String appId = "POD-Chat"; @@ -194,7 +193,7 @@ public class ChatActivity extends AppCompatActivity private Map> categoryMap; private List movieList; private ExpandablePlaceHolderView expandablePlaceHolderView; - private final Enum serverType = ServerType.Main; + private final Enum serverType = ServerType.Sandbox; @Override protected void onCreate(Bundle savedInstanceState) { @@ -1525,7 +1524,7 @@ private void searchHistory() { .Builder("name") .is("sina") .build(); - NosqlListMessageCriteriaVO criteriaVO = new NosqlListMessageCriteriaVO.Builder(231) + SearchSystemMetadataRequest criteriaVO = new SearchSystemMetadataRequest.Builder(231) .count(10) .metadataCriteria(builderMeta) .build(); diff --git a/app/src/main/java/com/example/chat/application/chatexample/ChatContract.java b/app/src/main/java/com/example/chat/application/chatexample/ChatContract.java index 09674737..81cb5d6a 100644 --- a/app/src/main/java/com/example/chat/application/chatexample/ChatContract.java +++ b/app/src/main/java/com/example/chat/application/chatexample/ChatContract.java @@ -45,7 +45,7 @@ import com.fanap.podchat.chat.user.user_roles.model.ResultCurrentUserRoles; import com.fanap.podchat.mainmodel.History; import com.fanap.podchat.mainmodel.Invitee; -import com.fanap.podchat.mainmodel.NosqlListMessageCriteriaVO; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; import com.fanap.podchat.mainmodel.RequestSearchContact; import com.fanap.podchat.mainmodel.ThreadInfoVO; import com.fanap.podchat.model.ChatResponse; @@ -320,7 +320,7 @@ void connect(String serverAddress, String appId, String severName, String token, String getHistory(RequestGetHistory request, ChatHandler handler); String getHashTagList(RequestGetHashTagList request, ChatHandler handler); - void searchHistory(NosqlListMessageCriteriaVO messageCriteriaVO, ChatHandler handler); + void searchHistory(SearchSystemMetadataRequest messageCriteriaVO, ChatHandler handler); void getContact(Integer count, Long offset, ChatHandler handler); diff --git a/app/src/main/java/com/example/chat/application/chatexample/ChatPresenter.java b/app/src/main/java/com/example/chat/application/chatexample/ChatPresenter.java index c41afce4..143573b9 100644 --- a/app/src/main/java/com/example/chat/application/chatexample/ChatPresenter.java +++ b/app/src/main/java/com/example/chat/application/chatexample/ChatPresenter.java @@ -64,7 +64,7 @@ import com.fanap.podchat.example.R; import com.fanap.podchat.mainmodel.History; import com.fanap.podchat.mainmodel.Invitee; -import com.fanap.podchat.mainmodel.NosqlListMessageCriteriaVO; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; import com.fanap.podchat.mainmodel.RequestSearchContact; import com.fanap.podchat.mainmodel.ResultDeleteMessage; import com.fanap.podchat.mainmodel.Thread; @@ -787,7 +787,7 @@ public String getHashTagList(RequestGetHashTagList request, ChatHandler handler) } @Override - public void searchHistory(NosqlListMessageCriteriaVO builderListMessage, ChatHandler handler) { + public void searchHistory(SearchSystemMetadataRequest builderListMessage, ChatHandler handler) { chat.searchHistory(builderListMessage, handler); } diff --git a/podchat/build.gradle b/podchat/build.gradle index 5922cbd8..2cd0ddb5 100644 --- a/podchat/build.gradle +++ b/podchat/build.gradle @@ -5,8 +5,8 @@ apply plugin: 'com.kezong.fat-aar' apply plugin: 'com.google.gms.google-services' ext { - libraryVersion = '0.9.14.0-beta' - libraryVersionLight = '0.9.12.0' + libraryVersion = '0.9.14.0' + libraryVersionLight = '0.9.13.0' podcallVersion = '3.5.2' } android { @@ -15,7 +15,7 @@ android { defaultConfig { minSdkVersion 17 targetSdkVersion 29 - versionCode 184 + versionCode 185 versionName libraryVersion testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/podchat/src/main/java/com/fanap/podchat/chat/ChatCore.java b/podchat/src/main/java/com/fanap/podchat/chat/ChatCore.java index 0a56d0eb..35c3f975 100644 --- a/podchat/src/main/java/com/fanap/podchat/chat/ChatCore.java +++ b/podchat/src/main/java/com/fanap/podchat/chat/ChatCore.java @@ -121,6 +121,7 @@ import com.fanap.podchat.mainmodel.MapReverse; import com.fanap.podchat.mainmodel.MapRout; import com.fanap.podchat.mainmodel.MessageVO; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; import com.fanap.podchat.mainmodel.NosqlListMessageCriteriaVO; import com.fanap.podchat.mainmodel.Participant; import com.fanap.podchat.mainmodel.RequestSearchContact; @@ -6846,7 +6847,7 @@ private History getHistoryModelFromRequestGetHistory(RequestGetHistory request) .count(request.getCount()) .firstMessageId(request.getFirstMessageId()) .lastMessageId(request.getLastMessageId()) - .metadataCriteria(request.getMetadataCriteria()) + .offset(request.getOffset()) .fromTime(request.getFromTime()) .fromTimeNanos(request.getFromTimeNanos()) @@ -7082,6 +7083,7 @@ private List findEditedMessages(List oldMessages, List or * ------ List not **/ + @Deprecated public String searchHistory(NosqlListMessageCriteriaVO messageCriteriaVO, ChatHandler handler) { String uniqueId; uniqueId = generateUniqueId(); @@ -7089,7 +7091,7 @@ public String searchHistory(NosqlListMessageCriteriaVO messageCriteriaVO, ChatHa String asyncContent = SearchManager.prepareSearchRequest(messageCriteriaVO, uniqueId, getTypeCode(), getToken()); setCallBacks(null, null, null, true, Constants.GET_HISTORY, messageCriteriaVO.getOffset(), uniqueId); - sendAsyncMessage(asyncContent, AsyncAckType.Constants.WITHOUT_ACK, "SEND SEARCH0. HISTORY"); + sendAsyncMessage(asyncContent, AsyncAckType.Constants.WITHOUT_ACK, "SEND SEARCH HISTORY"); if (handler != null) { handler.onSearchHistory(uniqueId); } @@ -7099,6 +7101,25 @@ public String searchHistory(NosqlListMessageCriteriaVO messageCriteriaVO, ChatHa return uniqueId; } + public String searchHistory(SearchSystemMetadataRequest messageCriteriaVO, ChatHandler handler) { + String uniqueId; + uniqueId = generateUniqueId(); + + if (chatReady) { + String asyncContent = SearchManager.prepareSearchRequest(messageCriteriaVO, uniqueId, getTypeCode(), getToken()); + + setCallBacks(null, null, null, true, Constants.GET_HISTORY, messageCriteriaVO.getOffset(), uniqueId); + sendAsyncMessage(asyncContent, AsyncAckType.Constants.WITHOUT_ACK, "SEND SEARCH HISTORY"); + if (handler != null) { + handler.onSearchHistory(uniqueId); + } + } else { + captureError(ChatConstant.ERROR_CHAT_READY, ChatConstant.ERROR_CODE_CHAT_READY, uniqueId); + } + + return uniqueId; + } + /** * You an have Signal Type from ChatMessageType.SignalMsg{ * IS_TYPING = 1 ; diff --git a/podchat/src/main/java/com/fanap/podchat/chat/messge/SearchSystemMetadataRequest.java b/podchat/src/main/java/com/fanap/podchat/chat/messge/SearchSystemMetadataRequest.java new file mode 100644 index 00000000..c75bfa53 --- /dev/null +++ b/podchat/src/main/java/com/fanap/podchat/chat/messge/SearchSystemMetadataRequest.java @@ -0,0 +1,159 @@ +package com.fanap.podchat.chat.messge; + +import android.support.annotation.NonNull; + +import com.fanap.podchat.mainmodel.NosqlSearchMetadataCriteria; +import com.fanap.podchat.requestobject.BaseRequestObject; + +public class SearchSystemMetadataRequest extends BaseRequestObject { + private long messageThreadId; + private long userId; + private Long firstMessageId; + private Long lastMessageId; + private Long id; + private String query; + private NosqlSearchMetadataCriteria metadataCriteria; + private String order; + + public SearchSystemMetadataRequest(Builder builder) { + this.messageThreadId = builder.messageThreadId; + this.userId = builder.userId; + this.firstMessageId = builder.firstMessageId; + this.lastMessageId = builder.lastMessageId; + this.id = builder.id; + this.query = builder.query; + this.order = builder.order; + this.metadataCriteria = builder.metadataCriteria; + } + + public static class Builder extends BaseRequestObject.Builder { + private final long messageThreadId; + private long userId; + private Long firstMessageId; + private Long lastMessageId; + private Long id; + private String query; + private NosqlSearchMetadataCriteria metadataCriteria; + private String order; + + public Builder(long threadId) { + this.messageThreadId = threadId; + } + + @NonNull + public Builder userId(long userId) { + this.userId = userId; + return this; + } + + @NonNull + public Builder firstMessageId(Long firstMessageId) { + this.firstMessageId = firstMessageId; + return this; + } + + @NonNull + public Builder lastMessageId(Long lastMessageId) { + this.lastMessageId = lastMessageId; + return this; + } + + + @Override + protected Builder self() { + return this; + } + @NonNull + public Builder order(String order) { + this.order = order; + return this; + } + + @NonNull + public Builder id(Long id) { + this.id = id; + return this; + } + + @NonNull + public Builder query(String query) { + this.query = query; + return this; + } + + @NonNull + public Builder metadataCriteria(NosqlSearchMetadataCriteria metadataCriteria) { + this.metadataCriteria = metadataCriteria; + return this; + } + + @NonNull + public SearchSystemMetadataRequest build() { + return new SearchSystemMetadataRequest(this); + } + } + + public long getMessageThreadId() { + return messageThreadId; + } + + public void setMessageThreadId(long messageThreadId) { + this.messageThreadId = messageThreadId; + } + + public long getUserId() { + return userId; + } + + public void setUserId(long userId) { + this.userId = userId; + } + + public Long getFirstMessageId() { + return firstMessageId; + } + + public void setFirstMessageId(Long firstMessageId) { + this.firstMessageId = firstMessageId; + } + + public Long getLastMessageId() { + return lastMessageId; + } + + public void setLastMessageId(Long lastMessageId) { + this.lastMessageId = lastMessageId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } + + public NosqlSearchMetadataCriteria getMetadataCriteria() { + return metadataCriteria; + } + + public void setMetadataCriteria(NosqlSearchMetadataCriteria metadataCriteria) { + this.metadataCriteria = metadataCriteria; + } + + public String getOrder() { + return order; + } + + public void setOrder(String order) { + this.order = order; + } +} diff --git a/podchat/src/main/java/com/fanap/podchat/chat/search/SearchManager.java b/podchat/src/main/java/com/fanap/podchat/chat/search/SearchManager.java index 75ef036b..0e7a6d4c 100644 --- a/podchat/src/main/java/com/fanap/podchat/chat/search/SearchManager.java +++ b/podchat/src/main/java/com/fanap/podchat/chat/search/SearchManager.java @@ -2,6 +2,7 @@ import com.fanap.podchat.chat.App; import com.fanap.podchat.mainmodel.ChatMessage; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; import com.fanap.podchat.mainmodel.NosqlListMessageCriteriaVO; import com.fanap.podchat.util.ChatMessageType; import com.fanap.podchat.util.Util; @@ -9,7 +10,11 @@ public class SearchManager { - public static String prepareSearchRequest(NosqlListMessageCriteriaVO messageCriteriaVO,String uniqueId ,String typecode , String token){ + public static String prepareSearchRequest(SearchSystemMetadataRequest messageCriteriaVO, + String uniqueId , String typecode , String token){ + + if(messageCriteriaVO.getCount()==0) + messageCriteriaVO.setCount(25); String content = App.getGson().toJson(messageCriteriaVO); @@ -30,8 +35,36 @@ public static String prepareSearchRequest(NosqlListMessageCriteriaVO messageCrit jsonObject.addProperty("typeCode", typecode); } - String asyncContent = jsonObject.toString(); - return asyncContent; + return jsonObject.toString(); + + } + + public static String prepareSearchRequest(NosqlListMessageCriteriaVO messageCriteriaVO, + String uniqueId , String typecode , String token){ + + if(messageCriteriaVO.getCount()==0) + messageCriteriaVO.setCount(25); + + String content = App.getGson().toJson(messageCriteriaVO); + + ChatMessage chatMessage = new ChatMessage(); + chatMessage.setContent(content); + chatMessage.setType(ChatMessageType.Constants.GET_HISTORY); + chatMessage.setToken(token); + chatMessage.setTokenIssuer("1"); + chatMessage.setUniqueId(uniqueId); + chatMessage.setSubjectId(messageCriteriaVO.getMessageThreadId()); + + JsonObject jsonObject = (JsonObject) App.getGson().toJsonTree(chatMessage); + + if (Util.isNullOrEmpty(typecode)) { + jsonObject.remove("typeCode"); + } else { + jsonObject.remove("typeCode"); + jsonObject.addProperty("typeCode", typecode); + } + + return jsonObject.toString(); } } diff --git a/podchat/src/main/java/com/fanap/podchat/mainmodel/NosqlListMessageCriteriaVO.java b/podchat/src/main/java/com/fanap/podchat/mainmodel/NosqlListMessageCriteriaVO.java index c019e3e3..b67ab5b7 100644 --- a/podchat/src/main/java/com/fanap/podchat/mainmodel/NosqlListMessageCriteriaVO.java +++ b/podchat/src/main/java/com/fanap/podchat/mainmodel/NosqlListMessageCriteriaVO.java @@ -2,6 +2,7 @@ import android.support.annotation.NonNull; +@Deprecated public class NosqlListMessageCriteriaVO { private long messageThreadId; private long userId; diff --git a/podchat/src/main/java/com/fanap/podchat/persistance/AppDatabase.java b/podchat/src/main/java/com/fanap/podchat/persistance/AppDatabase.java index 8ef4bad6..4f485694 100644 --- a/podchat/src/main/java/com/fanap/podchat/persistance/AppDatabase.java +++ b/podchat/src/main/java/com/fanap/podchat/persistance/AppDatabase.java @@ -69,7 +69,7 @@ CacheMutualGroupVo.class, CacheTagVo.class, CacheTagParticipantVO.class, -}, version = 6, exportSchema = false) +}, version = 7, exportSchema = false) @TypeConverters({DataTypeConverter.class}) public abstract class AppDatabase extends RoomDatabase { diff --git a/podchat/src/main/java/com/fanap/podchat/persistance/MessageDatabaseHelper.java b/podchat/src/main/java/com/fanap/podchat/persistance/MessageDatabaseHelper.java index 218bd5af..0ab9e792 100644 --- a/podchat/src/main/java/com/fanap/podchat/persistance/MessageDatabaseHelper.java +++ b/podchat/src/main/java/com/fanap/podchat/persistance/MessageDatabaseHelper.java @@ -1,4 +1,4 @@ - package com.fanap.podchat.persistance; +package com.fanap.podchat.persistance; import android.arch.persistence.db.SimpleSQLiteQuery; import android.arch.persistence.db.SupportSQLiteDatabase; @@ -60,9 +60,11 @@ import com.fanap.podchat.mainmodel.History; import com.fanap.podchat.mainmodel.LinkedUser; import com.fanap.podchat.mainmodel.MessageVO; +import com.fanap.podchat.mainmodel.NosqlSearchMetadataCriteria; import com.fanap.podchat.mainmodel.Participant; import com.fanap.podchat.mainmodel.PinMessageVO; import com.fanap.podchat.mainmodel.RequestSearchContact; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; import com.fanap.podchat.mainmodel.Thread; import com.fanap.podchat.mainmodel.UserInfo; import com.fanap.podchat.model.ChatResponse; @@ -1331,6 +1333,71 @@ public Observable> getThreadHistory(@NonNull History } + public Observable> getThreadHistory(@NonNull SearchSystemMetadataRequest request) { + return rx.Observable.create(subscriber -> { + List messageVOS = new ArrayList<>(); + List cacheMessageVOS; + long offset = request.getOffset(); + long count = request.getCount(); + String order = request.getOrder(); + offset = offset >= 0 ? offset : 0; + count = count > 0 ? count : 50; + if (Util.isNullOrEmpty(order)) { + order = "desc"; + } + + String rawQuery = "SELECT * FROM CacheMessageVO WHERE threadVoId =" + request.getMessageThreadId(); + +// rawQuery = rawQuery + " AND system_metadata_" + request.getMetadataCriteria().getField() + " >= " + request.getMetadataCriteria().getGte(); + + long contentCount = messageDao.getHistoryContentCount(new SimpleSQLiteQuery(rawQuery.replaceFirst("SELECT \\* ", "SELECT COUNT(ID) "))); + + rawQuery = addOrderAndLimitAndOffset(offset, count, order, rawQuery); + + SupportSQLiteQuery sqLiteQuery = new SimpleSQLiteQuery(rawQuery); + + cacheMessageVOS = messageDao.getRawHistory(sqLiteQuery); + + prepareMessageVOs(messageVOS, cacheMessageVOS); + + List sendingList = getAllSendingQueueByThreadId(request.getMessageThreadId()); + + List uploadingList = getAllUploadingQueueByThreadId(request.getMessageThreadId()); + + List failedList = getAllWaitQueueCacheByThreadId(request.getMessageThreadId()); + + ChatResponse chatResponse = new ChatResponse<>(); + chatResponse.setCache(true); + + ResultHistory resultHistory = new ResultHistory(); + resultHistory.setHistory(messageVOS); + + resultHistory.setNextOffset(request.getOffset() + messageVOS.size()); + resultHistory.setContentCount(contentCount); + if (messageVOS.size() + request.getOffset() < contentCount) { + resultHistory.setHasNext(true); + } else { + resultHistory.setHasNext(false); + } + + resultHistory.setHistory(messageVOS); + + + resultHistory.setSending(sendingList); + resultHistory.setUploadingQueue(uploadingList); + resultHistory.setFailed(failedList); + chatResponse.setErrorCode(0); + chatResponse.setHasError(false); + chatResponse.setErrorMessage(""); + chatResponse.setResult(resultHistory); + chatResponse.setCache(true); + chatResponse.setSubjectId(request.getMessageThreadId()); + subscriber.onNext(chatResponse); + }); + + } + + private void prepareMessageVOs(List messageVOS, List cacheMessageVOS) { for (CacheMessageVO cacheMessageVO : cacheMessageVOS) { @@ -1508,6 +1575,46 @@ private String addMessageTypeIfExist(int messageType, String rawQuery) { return rawQuery; } + private String addSystemMetadataCriteriaIfExist(NosqlSearchMetadataCriteria metadataCriteria, + String rawQuery) { + + if (metadataCriteria != null) { + + String field = metadataCriteria.getField(); + rawQuery = rawQuery + " AND " + field; + + if (Util.isNotNullOrEmpty(metadataCriteria.getAnd())) { + + + } + if (Util.isNotNullOrEmpty(metadataCriteria.getOr())) { + + + } + if (Util.isNotNullOrEmpty(metadataCriteria.getNot())) { + + + } + + if (Util.isNotNullOrEmpty(metadataCriteria.getIs())) { + rawQuery = rawQuery + " IS " + metadataCriteria.getIs(); + return rawQuery; + } + if (Util.isNotNullOrEmpty(metadataCriteria.getHas())) { + rawQuery = rawQuery + " LIKE '%' || "+ metadataCriteria.getHas() +" || '%' "; + return rawQuery; + } + + if (Util.isNotNullOrEmpty(metadataCriteria.getGt())) { + rawQuery = rawQuery + " " + metadataCriteria.getAnd(); + return rawQuery; + } + + } + + return rawQuery; + } + private MessageVO cacheMessageVoToMessageVoMapper(Participant participant, ReplyInfoVO replyInfoVO, ForwardInfo forwardInfo, CacheMessageVO cacheMessageVO) { return new MessageVO( cacheMessageVO.getId(), @@ -1580,7 +1687,6 @@ private History getHistoryModelFromRequestGetHistory(RequestGetHistory request) .count(request.getCount()) .firstMessageId(request.getFirstMessageId()) .lastMessageId(request.getLastMessageId()) - .metadataCriteria(request.getMetadataCriteria()) .offset(request.getOffset()) .fromTime(request.getFromTime()) .fromTimeNanos(request.getFromTimeNanos()) @@ -1734,9 +1840,8 @@ public List getContacts(Integer count, Long offset, String username) th List cacheContacts = null; if (username != null) { - cacheContacts = messageDao.getRawContacts(count, offset,username); - } - else { + cacheContacts = messageDao.getRawContacts(count, offset, username); + } else { cacheContacts = messageDao.getContacts(count, offset); } @@ -3087,14 +3192,14 @@ public void getMutualThreads(long count, long offset, Long userId, OnWorkDone li List threads; if (messageDao.getMutualGroup(String.valueOf(userId)) != null) { List threadVos = messageDao.getMutualGroup(String.valueOf(userId)); - if(threadVos.size()>0) { + if (threadVos.size() > 0) { ArrayList threadids = new ArrayList(); for (String id : threadVos.get(0).getThreadids()) { threadids.add(Integer.parseInt(id)); } threads = getThreadsByThreadIds(threadids); Log.e(TAG, "getMutualThreads: " + threads); - }else + } else threads = new ArrayList<>(); } else { threads = new ArrayList<>(); @@ -3296,8 +3401,7 @@ public void saveThreads(@NonNull List threads) { if (thread.getId() > 0) prepareThreadVOAndSaveIt(thread); } catch (Exception e) { - if(Sentry.isEnabled()) - { + if (Sentry.isEnabled()) { Sentry.captureException(e); e.printStackTrace(); break; @@ -3319,7 +3423,7 @@ public void saveMutualThreads(@NonNull List threads, long userId) { for (Thread thread : threads) { if (thread.getId() > 0) { - threadids.add(String.valueOf(thread.getId()) ); + threadids.add(String.valueOf(thread.getId())); } } @@ -4444,7 +4548,7 @@ public Observable> getTagParticipantsVos(long tagId) { }); } - private List prepareTagList(){ + private List prepareTagList() { List tags = messageDao.getCacheTagVos(); List tagVos = new ArrayList<>(); @@ -4460,7 +4564,7 @@ private List prepareTagList(){ cache.setConversationVO(thread); //TODO it should be save in db. can save it when save tags on db - if(thread.getUnreadCount() > 0) + if (thread.getUnreadCount() > 0) allUnreadCount = allUnreadCount + thread.getUnreadCount(); } tagParticipants.add(cache); @@ -4506,7 +4610,7 @@ public void insertAssistantVo(List assistantVos) { public void deleteCacheAssistantVos(List assistantVos) { worker(() -> { - for (AssistantVo item : assistantVos) { + for (AssistantVo item : assistantVos) { messageDao.deleteCacheAssistantVo(item.getParticipantVO().getId()); } }); @@ -4548,7 +4652,7 @@ public void getCacheAssistantHistoryVos(GetAssistantHistoryRequest request, Func for (CacheAssistantHistoryVo item : list) { AssistantHistoryVo assistantHistoryVo = new AssistantHistoryVo(); assistantHistoryVo.setActionName(item.getActionName()); - assistantHistoryVo.setActionTime((int)item.getActionTime()); + assistantHistoryVo.setActionTime((int) item.getActionTime()); assistantHistoryVo.setActionType(item.getActionType()); Participant participant = cacheToParticipantMapper(messageDao.getParticipant(item.getParticipantVOId()), false, null); assistantHistoryVo.setParticipantVO(participant); @@ -4567,8 +4671,8 @@ public void updateCashAssistant(OnWorkDone listener, List response) messageDao.deleteAllCacheAssistantVo(); for (AssistantVo assistantVo : response) { CacheAssistantVo cacheFile = new CacheAssistantVo(); - cacheFile.setRoles(assistantVo.getRoles()); - cacheFile.setBlock(assistantVo.getBlock()); + cacheFile.setRoles(assistantVo.getRoles()); + cacheFile.setBlock(assistantVo.getBlock()); if (assistantVo.getParticipantVO() != null) { Participant participant = assistantVo.getParticipantVO(); String participantJson = App.getGson().toJson(participant); diff --git a/podchat/src/main/java/com/fanap/podchat/persistance/dao/MessageDao.java b/podchat/src/main/java/com/fanap/podchat/persistance/dao/MessageDao.java index 56dd8fc1..e8120d32 100644 --- a/podchat/src/main/java/com/fanap/podchat/persistance/dao/MessageDao.java +++ b/podchat/src/main/java/com/fanap/podchat/persistance/dao/MessageDao.java @@ -142,7 +142,7 @@ public interface MessageDao { void insertHistories(List messageVOS); /** - * Unread Messags + * Unread Messages */ @Query("SELECT sum(unreadCount) from threadvo where unreadCount > 0") diff --git a/podchat/src/main/java/com/fanap/podchat/repository/CacheDataSource.java b/podchat/src/main/java/com/fanap/podchat/repository/CacheDataSource.java index f33ba38d..86a5fb19 100644 --- a/podchat/src/main/java/com/fanap/podchat/repository/CacheDataSource.java +++ b/podchat/src/main/java/com/fanap/podchat/repository/CacheDataSource.java @@ -16,7 +16,7 @@ import com.fanap.podchat.mainmodel.Contact; import com.fanap.podchat.mainmodel.History; import com.fanap.podchat.mainmodel.MessageVO; -import com.fanap.podchat.mainmodel.Participant; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; import com.fanap.podchat.mainmodel.Thread; import com.fanap.podchat.model.Admin; import com.fanap.podchat.persistance.MessageDatabaseHelper; @@ -225,6 +225,11 @@ public void cancelMessage(String uniqueId) { databaseHelper.deleteWaitQueueMsgs(uniqueId); } + public Observable getMessagesSystemMetadataData(SearchSystemMetadataRequest request) { + return databaseHelper.getThreadHistory(request) + .map(data -> new MessageManager.HistoryResponse(data, DISK)); + } + //sending queue public void cacheSendingQueue(SendingQueueCache sendingQueue) { diff --git a/podchat/src/main/java/com/fanap/podchat/repository/ChatDataSource.java b/podchat/src/main/java/com/fanap/podchat/repository/ChatDataSource.java index dc302ed6..ce25048a 100644 --- a/podchat/src/main/java/com/fanap/podchat/repository/ChatDataSource.java +++ b/podchat/src/main/java/com/fanap/podchat/repository/ChatDataSource.java @@ -2,7 +2,6 @@ import android.support.annotation.Nullable; -import com.fanap.podchat.cachemodel.CacheAssistantVo; import com.fanap.podchat.cachemodel.CacheFile; import com.fanap.podchat.cachemodel.CacheMessageVO; import com.fanap.podchat.cachemodel.queue.Failed; @@ -10,7 +9,6 @@ import com.fanap.podchat.cachemodel.queue.SendingQueueCache; import com.fanap.podchat.cachemodel.queue.Uploading; import com.fanap.podchat.cachemodel.queue.UploadingQueueCache; -import com.fanap.podchat.chat.assistant.model.AssistantVo; import com.fanap.podchat.chat.contact.ContactManager; import com.fanap.podchat.chat.messge.MessageManager; import com.fanap.podchat.chat.thread.ThreadManager; @@ -18,6 +16,7 @@ import com.fanap.podchat.mainmodel.Contact; import com.fanap.podchat.mainmodel.History; import com.fanap.podchat.mainmodel.MessageVO; +import com.fanap.podchat.chat.messge.SearchSystemMetadataRequest; import com.fanap.podchat.mainmodel.Thread; import com.fanap.podchat.model.Admin; import com.fanap.podchat.persistance.RoomIntegrityException; @@ -333,6 +332,21 @@ public void cancelMessage(String uniqueId) { memoryDataSource.cancelMessage(uniqueId); } + public Observable getMessagesSystemMetadataData(SearchSystemMetadataRequest request) { + + + return getMessagesSystemMetadataFromCacheDataSource(request) + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.io()); + + + } + + private Observable getMessagesSystemMetadataFromCacheDataSource(SearchSystemMetadataRequest request) { + //get from disk cache and put in memory cache + return cacheDataSource.getMessagesSystemMetadataData(request).doOnNext(historyResponse -> saveMessageResultFromCache(historyResponse.getResponse().getResult().getHistory())); + } + //Sending Queue public void moveFromSendingToWaitingQueue(String uniqueId) { diff --git a/podchat/src/main/java/com/fanap/podchat/requestobject/RequestGetHistory.java b/podchat/src/main/java/com/fanap/podchat/requestobject/RequestGetHistory.java index 1297d9e3..367b9f74 100644 --- a/podchat/src/main/java/com/fanap/podchat/requestobject/RequestGetHistory.java +++ b/podchat/src/main/java/com/fanap/podchat/requestobject/RequestGetHistory.java @@ -15,7 +15,6 @@ public class RequestGetHistory extends BaseRequestObject { private long fromTimeNanos; private long toTime; private long toTimeNanos; - private NosqlSearchMetadataCriteria metadataCriteria; private long firstMessageId; private long lastMessageId; private String[] uniqueIds; @@ -34,7 +33,6 @@ public RequestGetHistory(@NonNull Builder builder) { this.fromTimeNanos = builder.fromTimeNanos; this.toTime = builder.toTime; this.toTimeNanos = builder.toTimeNanos; - this.metadataCriteria = builder.metadataCriteria; this.uniqueIds = builder.uniqueIds; this.messageType = builder.messageType; @@ -54,7 +52,6 @@ public static class Builder extends BaseRequestObject.Builder { private long toTime; private long toTimeNanos; private String[] uniqueIds; - private NosqlSearchMetadataCriteria metadataCriteria; public Builder(long threadId) { this.threadId = threadId; @@ -135,11 +132,6 @@ public Builder uniqueIds(String... uniqueIds) { return this; } - @NonNull - public Builder metadataCriteria(NosqlSearchMetadataCriteria metadataCriteria) { - this.metadataCriteria = metadataCriteria; - return this; - } public Builder setMessageType(int messageType) { this.messageType = messageType; @@ -218,13 +210,7 @@ public void setQuery(String query) { this.query = query; } - public NosqlSearchMetadataCriteria getMetadataCriteria() { - return metadataCriteria; - } - public void setMetadataCriteria(NosqlSearchMetadataCriteria metadataCriteria) { - this.metadataCriteria = metadataCriteria; - } public long getFromTime() { return fromTime;