From 8bef7cf51a8a96ff8d9b89cb16bc3a06db74aa9e Mon Sep 17 00:00:00 2001 From: Lyndon Date: Wed, 4 Jul 2018 13:41:35 +0200 Subject: [PATCH] . --- .../data/firebase/HandleMessagesService.java | 32 +- .../data/repository/models/MessageRealm.java | 1 + .../MessageByGroupIdSpecification.java | 3 - ...agesByGroupAndSearchTextSpecification.java | 30 ++ .../ownchat/filepicker/FilePickerConst.java | 1 + .../ownchat/filepicker/PickerManager.java | 3 + .../ownchat/page/chat/BaseChatActivity.java | 76 +++- .../ownchat/page/chat/BaseChatAdapter.java | 17 +- .../ownchat/page/chat/ChatPresenter.java | 330 +++++++++++------- .../ownchat/page/chat/ChatView.java | 8 + .../ownchat/page/chat/GroupChatActivity.java | 21 ++ .../ownchat/page/chat/GroupChatAdapter.java | 23 +- .../ownchat/page/chat/SingleChatActivity.java | 30 ++ .../ownchat/page/chat/SingleChatAdapter.java | 15 +- .../page/chatmembers/ChatMembersActivity.java | 9 +- .../page/contacts/ContactsFragment.java | 8 +- .../beyondsoft/ownchat/utils/FileUtils.java | 1 + .../app/src/main/res/layout/chat_toolbar.xml | 18 +- .../main/res/layout/item_group_chat_left.xml | 16 +- .../main/res/layout/item_group_chat_right.xml | 9 +- .../main/res/layout/item_single_chat_left.xml | 16 +- .../res/layout/item_single_chat_right.xml | 10 +- .../app/src/main/res/values/strings.xml | 2 + .../app/src/main/res/values/styles.xml | 21 +- 24 files changed, 494 insertions(+), 206 deletions(-) create mode 100644 BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/specifications/MessagesByGroupAndSearchTextSpecification.java diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/firebase/HandleMessagesService.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/firebase/HandleMessagesService.java index 0ec2e0d..a4566ca 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/firebase/HandleMessagesService.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/firebase/HandleMessagesService.java @@ -45,6 +45,7 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.app.RemoteInput; import android.support.v4.content.ContextCompat; import android.text.TextUtils; +import android.util.Log; import java.io.IOException; import java.net.HttpURLConnection; @@ -93,6 +94,8 @@ public class HandleMessagesService extends FirebaseMessagingService { @SuppressLint("StaticFieldLeak") private void getMessageSuccess(Message message) { + Log.i("FIREBASE_RECEIVER", "Message received"); + Bundle bundle = new Bundle(); bundle.putString(Constants.MESSAGE_ID, message.id); @@ -344,29 +347,36 @@ public class HandleMessagesService extends FirebaseMessagingService { Bitmap bitmap = decodeStream(connection.getInputStream()); - final int minSize = 240; + final double minSize = 240d; int outWidth, outHeight, x, y; - int inWidth = bitmap.getWidth(); - int inHeight = bitmap.getHeight(); + double inWidth = (double) bitmap.getWidth(); + double inHeight = (double) bitmap.getHeight(); if(inWidth > inHeight) { - outHeight = minSize; - outWidth = (minSize / inHeight) * inWidth; - x = (outWidth - minSize) / 2; + outHeight = (int) minSize; + outWidth = (int) ((minSize / inHeight) * inWidth); + x = (int) ((outWidth - minSize) / 2); y = 0; } else { - outWidth = minSize; - outHeight = (minSize / inWidth) * inHeight; + outWidth = (int) minSize; + outHeight = (int) ((minSize / inWidth) * inHeight); x = 0; - y = (outHeight - minSize) / 2; + y = (int) ((outHeight - minSize) / 2); + } + + if(x < 0) { + x = 0; + } + + if(y < 0) { + y = 0; } return Bitmap.createBitmap(Bitmap.createScaledBitmap(bitmap, outWidth, outHeight, false), x, y, 240, 240); } catch(IOException e) { e.printStackTrace(); + return null; } - - return null; } } } diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/models/MessageRealm.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/models/MessageRealm.java index 6574a6f..d64866b 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/models/MessageRealm.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/models/MessageRealm.java @@ -14,6 +14,7 @@ public class MessageRealm extends RealmObject { public static final String GROUP_ID = "groupId"; public static final String CREATED_AT = "createdAt"; public static final String USER_ID = "userId"; + public static final String MESSAGE = "message"; @PrimaryKey private String uniqueId; diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/specifications/MessageByGroupIdSpecification.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/specifications/MessageByGroupIdSpecification.java index e440369..07611c2 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/specifications/MessageByGroupIdSpecification.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/specifications/MessageByGroupIdSpecification.java @@ -5,9 +5,6 @@ import de.beyondsoft.ownchat.data.repository.models.MessageRealm; import io.realm.Realm; import io.realm.RealmQuery; -/** - * Created by Rares Teodorescu on 22/02/2017. - */ public class MessageByGroupIdSpecification implements RealmSpecification { private long mGroupId; diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/specifications/MessagesByGroupAndSearchTextSpecification.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/specifications/MessagesByGroupAndSearchTextSpecification.java new file mode 100644 index 0000000..1e2932c --- /dev/null +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/data/repository/specifications/MessagesByGroupAndSearchTextSpecification.java @@ -0,0 +1,30 @@ +package de.beyondsoft.ownchat.data.repository.specifications; + +import de.beyondsoft.ownchat.data.repository.models.MessageRealm; +import io.realm.Case; +import io.realm.Realm; +import io.realm.RealmQuery; + +public class MessagesByGroupAndSearchTextSpecification implements RealmSpecification { + private long mGroupId; + private String mSearchText; + private final long mUserId; + + public MessagesByGroupAndSearchTextSpecification(long userId) { + mUserId = userId; + } + + public void setGroupId(long groupId) { + mGroupId = groupId; + } + + public void setSearchText(String searchText) { mSearchText = searchText; } + + @Override + public RealmQuery toRealmQuery(Realm realm) { + return realm.where(MessageRealm.class) + .contains(MessageRealm.MESSAGE, mSearchText, Case.INSENSITIVE) + .equalTo(MessageRealm.GROUP_ID, mGroupId) + .equalTo(MessageRealm.USER_ID, mUserId); + } +} diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/filepicker/FilePickerConst.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/filepicker/FilePickerConst.java index 2e0aa6c..45e379f 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/filepicker/FilePickerConst.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/filepicker/FilePickerConst.java @@ -46,4 +46,5 @@ public class FilePickerConst { final static String DOC = "DOC"; final static String XLS = "XLS"; final static String TXT = "TXT"; + final static String ODS = "ODS"; } diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/filepicker/PickerManager.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/filepicker/PickerManager.java index 0017370..20bef67 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/filepicker/PickerManager.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/filepicker/PickerManager.java @@ -178,6 +178,9 @@ public class PickerManager { String[] txts = {"txt"}; fileTypes.add(new FileType(FilePickerConst.TXT, txts, R.drawable.document)); + + String[] ods = {"ods", "odt", "odp", "odc", "odf", "odg", "otp", "ots", "ott"}; + fileTypes.add(new FileType(FilePickerConst.ODS, ods, R.drawable.document)); } public ArrayList getFileTypes() { diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/BaseChatActivity.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/BaseChatActivity.java index ab0f179..a216216 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/BaseChatActivity.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/BaseChatActivity.java @@ -42,6 +42,7 @@ import android.os.Build; import android.os.Bundle; import android.os.CountDownTimer; import android.os.Environment; +import android.os.Handler; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.design.widget.CoordinatorLayout; @@ -86,7 +87,7 @@ import hani.momanii.supernova_emoji_library.Actions.EmojIconActions; import hani.momanii.supernova_emoji_library.Helper.EmojiconEditText; import okhttp3.MediaType; -abstract class BaseChatActivity extends RuntimePermissionActivity implements ChatView, BaseChatAdapter.MessageClickListener, LogoutNavigation { +abstract class BaseChatActivity extends RuntimePermissionActivity implements ChatView, BaseChatAdapter.MessageClickListener, LogoutNavigation, SearchView.OnQueryTextListener { private final static int STORAGE_REQUEST_CODE = 9999; private final static int SELECT_IMAGE_FILE = 233; @@ -242,6 +243,8 @@ abstract class BaseChatActivity extends RuntimePermissionActivity implements Cha protected abstract void loadMessages(); + protected abstract void loadSearchResult(String newText); + @Override public void setCallback(Callback callback) { mCallback = callback; @@ -333,6 +336,8 @@ abstract class BaseChatActivity extends RuntimePermissionActivity implements Cha @Override public void hideMessagesLoading() { + isSearching = false; + mBaseChatAdapter.setLoading(false); if(mIsComingFromSharingActivity.get()) { @@ -566,6 +571,7 @@ abstract class BaseChatActivity extends RuntimePermissionActivity implements Cha @Override protected void onResume() { + refreshSearchView(); super.onResume(); } @@ -853,4 +859,72 @@ abstract class BaseChatActivity extends RuntimePermissionActivity implements Cha super.onNewIntent(intent); } + + + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + public boolean isSearching = false; + + private String mSearchText; + + @Override + public String getSearchText() { + return mSearchText; + } + + @Override + public void resetSearchText() { + mSearchText = null; + isSearching = false; + } + + @Override + public void showEmptySearchResultMessage(String text) { + String emptyText = getString(R.string.chat_empty_search_message_1) + " \"" + text + "\" " + getString(R.string.chat_empty_search_message_2); + + mEmptyLayout.setEmptyText(emptyText); + mEmptyLayout.showEmpty(); + + isSearching = false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if(isSearching && !TextUtils.isEmpty(newText)) { + return false; + } + + Handler mHandler = new Handler(); + + mHandler.removeCallbacksAndMessages(null); + + mHandler.postDelayed(() -> { + if(mCallback != null) { + mCallback.resetMessages(); + } + + isSearching = true; + + if(TextUtils.isEmpty(newText)) { + loadMessages(); + } else { + mSearchText = newText; + + messagesLoaded(new ArrayList<>(), true); + loadSearchResult(newText); + } + }, 300); + + return true; + } + + private void refreshSearchView() { + if(mChatSearchView != null && !mChatSearchView.isIconified()) { + mChatSearchView.setQuery(null, false); + mChatSearchView.setIconified(false); + } + } } \ No newline at end of file diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/BaseChatAdapter.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/BaseChatAdapter.java index f527648..1c5da1b 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/BaseChatAdapter.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/BaseChatAdapter.java @@ -5,6 +5,7 @@ import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; +import android.util.TypedValue; import android.view.View; import android.widget.ImageView; import android.widget.ProgressBar; @@ -310,22 +311,33 @@ abstract class BaseChatAdapter extends RecyclerView.Adapter implements Cha */ @Override public void loadMessagesFromServerByGroupId(long groupId) { - if (!mFetchMore) { + if(!mFetchMore) { getView().hideMessagesLoading(); return; } @@ -135,7 +136,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha .flatMap(messageResponse -> { ArrayList messages = messageResponse.response.messages; - for (int i = 0, size = messages.size(); i < size; i++) { + for(int i = 0, size = messages.size(); i < size; i++) { messages.get(i).status = Message.Status.DELIVERED; messages.get(i).isRead = true; messages.get(i).userId = mUserIdPreference.get(); @@ -178,7 +179,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha for(int i = 0; i < mMessageToUpdate.size(); i++) { Pair messageToUpdate = mMessageToUpdate.get(i); - if (isAttached()) { + if(isAttached()) { getView().lastMessageUpdated(messageToUpdate.first, messageToUpdate.second); } } @@ -209,12 +210,12 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha * Send messages to view. */ private void fetchNewMessagesSuccess(List messages) { - if (messages == null) { + if(messages == null) { return; } - for (int i = 0; i < messages.size(); i++) { - if (!isAttached()) { + for(int i = 0; i < messages.size(); i++) { + if(!isAttached()) { break; } @@ -231,11 +232,11 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha private void fetchNewMessagesError(Throwable throwable) { Log.e("fetchNewMessages", "onError", throwable); - if (!isAttached()) { + if(!isAttached()) { return; } - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { getView().showError(R.string.error_no_internet_connection); return; } @@ -282,7 +283,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha getView().hideLoading(); getView().hideMessagesLoading(); - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { getView().showError(R.string.error_no_internet_connection); return; } @@ -308,23 +309,37 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha .subscribe(this::loadMessagesFromDBSuccessful, this::loadMessagesError); } - /** - * Send messages to view. - */ - private void loadMessagesFromDBSuccessful(ArrayList messages) { - if (!isAttached()) { + public void searchMessagesFromDBByGroupIdAndText(long groupId, String text) { + MessagesByGroupAndSearchTextSpecification messagesByGroupAndSearchTextSpecification = new MessagesByGroupAndSearchTextSpecification(mUserIdPreference.get()); + messagesByGroupAndSearchTextSpecification.setGroupId(groupId); + messagesByGroupAndSearchTextSpecification.setSearchText(text); + + mMessageRealmRepository.queryForAll(messagesByGroupAndSearchTextSpecification) + .map(ArrayList::new) + .compose(RxUtils.provideDefaultTransformer()) + .subscribe(this::searchMessagesFromDBSuccessful, this::loadMessagesError); + } + + private void searchMessagesFromDBSuccessful(ArrayList messages) { + if(!isAttached()) { return; } mMessages.clear(); mMessages.addAll(messages); mLoading = false; + getView().hideLoading(); getView().hideMessagesLoading(); - if (!mMessages.isEmpty()) { + String searchText = getView().getSearchText(); + + getView().resetSearchText(); + + if(!mMessages.isEmpty()) { int endOffset = mOffset + LIMIT > mMessages.size() ? mMessages.size() : mOffset + LIMIT; - if (mOffset > endOffset) { + if(mOffset > endOffset) { + Log.i("", ""); return; } @@ -332,7 +347,61 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha getView().messagesLoaded(new ArrayList<>(mMessages.subList(mOffset, endOffset)), isFirstPage); - if (isFirstPage && mSystemUtils.isNetworkUnavailable()) { + if(isFirstPage && mSystemUtils.isNetworkUnavailable()) { + Message firstMessage = mMessages.get(0); + Message message = new Message(firstMessage.id, + firstMessage.groupId, + firstMessage.createdAt / 1000, + firstMessage.message, + firstMessage.filePath, + firstMessage.smallerImage, + firstMessage.originalFilename, + firstMessage.uri, + firstMessage.senderId, + firstMessage.senderName, + firstMessage.senderAvatar, + firstMessage.status, + true, + firstMessage.userId, + firstMessage.fileDownloaded); + storeGroupLocally(mGroupId, message); + } + + mPage++; + mOffset += LIMIT; + + return; + } + + getView().showEmptySearchResultMessage(searchText); + } + + /** + * Send messages to view. + */ + private void loadMessagesFromDBSuccessful(ArrayList messages) { + if(!isAttached()) { + return; + } + + mMessages.clear(); + mMessages.addAll(messages); + mLoading = false; + + getView().hideLoading(); + getView().hideMessagesLoading(); + + if(!mMessages.isEmpty()) { + int endOffset = mOffset + LIMIT > mMessages.size() ? mMessages.size() : mOffset + LIMIT; + if(mOffset > endOffset) { + return; + } + + boolean isFirstPage = mPage == FIRST_PAGE; + + getView().messagesLoaded(new ArrayList<>(mMessages.subList(mOffset, endOffset)), isFirstPage); + + if(isFirstPage && mSystemUtils.isNetworkUnavailable()) { Message firstMessage = mMessages.get(0); Message message = new Message(firstMessage.id, firstMessage.groupId, @@ -362,7 +431,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha } private void loadMessagesError(Throwable throwable) { - if (!isAttached()) { + if(!isAttached()) { return; } @@ -376,20 +445,20 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha */ @Override public void fetchMoreMessagesByGroupId() { - if (mMessages.size() < 25) { + if(mMessages.size() < 25) { getView().hideMessagesLoading(); return; } mLoading = true; - if (mPage == FIRST_PAGE) { + if(mPage == FIRST_PAGE) { getView().showLoading(); } else { getView().showMessagesLoading(); } - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { loadMessagesFromDBByGroupId(); getView().showError(R.string.error_no_internet_connection); return; @@ -413,7 +482,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha final String mimeType = FileUtils.getMimeType(file); - if (file == null || !file.exists()) { + if(file == null || !file.exists()) { getView().showToastMessage(R.string.error_file_not_found); return; } @@ -450,95 +519,95 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha false); storeMessageLocally(message).subscribe(new Subscriber() { - @Override - public void onCompleted() { - if (mSystemUtils.isNetworkUnavailable()) { - getView().showError(R.string.error_no_internet_connection); - message.status = Message.Status.FAILED; - message.isRead = true; - storeMessageLocally(message, message.id, true); - storeGroupLocally(mGroupId, message); - return; - } + @Override + public void onCompleted() { + if(mSystemUtils.isNetworkUnavailable()) { + getView().showError(R.string.error_no_internet_connection); + message.status = Message.Status.FAILED; + message.isRead = true; + storeMessageLocally(message, message.id, true); + storeGroupLocally(mGroupId, message); + return; + } - checkForEmptyMessageAndHideIt(); - message.createdAt *= 1000; - getView().addOneMessage(message); + checkForEmptyMessageAndHideIt(); + message.createdAt *= 1000; + getView().addOneMessage(message); - // create RequestBody instance from file - RequestBody requestFile = RequestBody.create(getView().getMediaType(mimeType), fileToSend); + // create RequestBody instance from file + RequestBody requestFile = RequestBody.create(getView().getMediaType(mimeType), fileToSend); - // MultipartBody.Part is used to send also the actual file name - MultipartBody.Part body = MultipartBody.Part.createFormData("file", fileToSend.getName(), requestFile); + // MultipartBody.Part is used to send also the actual file name + MultipartBody.Part body = MultipartBody.Part.createFormData("file", fileToSend.getName(), requestFile); - // add another part within the multipart request - String groupIdString = String.valueOf(mGroupId); - RequestBody groupIdBody = RequestBody.create(okhttp3.MultipartBody.FORM, groupIdString); + // add another part within the multipart request + String groupIdString = String.valueOf(mGroupId); + RequestBody groupIdBody = RequestBody.create(okhttp3.MultipartBody.FORM, groupIdString); - RequestBody textBody = RequestBody.create(okhttp3.MultipartBody.FORM, message.message == null ? "" : message.message); + RequestBody textBody = RequestBody.create(okhttp3.MultipartBody.FORM, message.message == null ? "" : message.message); - mChatService.sendFile(groupIdBody, body, textBody) - .compose(RxUtils.provideDefaultTransformer()) - .flatMap(new ErrorHandlingResponseConverter<>()) - .subscribe(new Subscriber() { - @Override - public void onCompleted() { + mChatService.sendFile(groupIdBody, body, textBody) + .compose(RxUtils.provideDefaultTransformer()) + .flatMap(new ErrorHandlingResponseConverter<>()) + .subscribe(new Subscriber() { + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable e) { + FileUtils.clearTmpFilesDir(mContext); + Log.e("sendFile", "onError", e); + @SuppressWarnings("UnnecessaryLocalVariable") Message newMessage = message; + newMessage.createdAt /= 1000; + newMessage.status = Message.Status.FAILED; + newMessage.isRead = true; + storeMessageLocally(newMessage, message.id, false); + storeGroupLocally(mGroupId, message); + + if(!isAttached()) { + return; + } + + if(mSystemUtils.isNetworkUnavailable()) { + getView().showError(R.string.error_no_internet_connection); + return; + } + + getView().showError(R.string.error_something_went_wrong); + } + + @Override + public void onNext(MessageResponse baseResponse) { + FileUtils.clearTmpFilesDir(mContext); + deleteLocalMessage(message); + baseResponse.response.message.status = Message.Status.DELIVERED; + baseResponse.response.message.isRead = true; + storeMessageLocally(baseResponse.response.message, message.id, false); + storeGroupLocally(mGroupId, baseResponse.response.message); + + List splitUriAsList = Arrays.asList(fileUri.toString().split("/")); + + if(splitUriAsList.contains(Constants.AUDIO_RECORDINGS_DIR)) { + File f = getView().getFile(fileUri); + if(f != null && f.exists()) { + f.delete(); } + } + } + }); + } - @Override - public void onError(Throwable e) { - FileUtils.clearTmpFilesDir(mContext); - Log.e("sendFile", "onError", e); - @SuppressWarnings("UnnecessaryLocalVariable") Message newMessage = message; - newMessage.createdAt /= 1000; - newMessage.status = Message.Status.FAILED; - newMessage.isRead = true; - storeMessageLocally(newMessage, message.id, false); - storeGroupLocally(mGroupId, message); + @Override + public void onError(Throwable e) { + Log.e("sendFile", "onError", e); + } - if(!isAttached()) { - return; - } + @Override + public void onNext(Object o) { - if(mSystemUtils.isNetworkUnavailable()) { - getView().showError(R.string.error_no_internet_connection); - return; - } - - getView().showError(R.string.error_something_went_wrong); - } - - @Override - public void onNext(MessageResponse baseResponse) { - FileUtils.clearTmpFilesDir(mContext); - deleteLocalMessage(message); - baseResponse.response.message.status = Message.Status.DELIVERED; - baseResponse.response.message.isRead = true; - storeMessageLocally(baseResponse.response.message, message.id, false); - storeGroupLocally(mGroupId, baseResponse.response.message); - - List splitUriAsList = Arrays.asList(fileUri.toString().split("/")); - - if(splitUriAsList.contains(Constants.AUDIO_RECORDINGS_DIR)) { - File f = getView().getFile(fileUri); - if(f != null && f.exists()) { - f.delete(); - } - } - } - }); - } - - @Override - public void onError(Throwable e) { - Log.e("sendFile", "onError", e); - } - - @Override - public void onNext(Object o) { - - } - }); + } + }); } /** @@ -546,7 +615,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha */ @Override public void downloadFile(Message message, String filePath, int itemPosition) { - if (message.fileDownloaded) { + if(message.fileDownloaded) { getView().stopItemProgress(itemPosition); getView().fileDownloadedSuccessfully(filePath, FileUtils.getFileTypeFromFilePath(filePath)); return; @@ -564,13 +633,13 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha public void onError(Throwable e) { Log.e("ChatPresenter", "downloadFile", e); - if (!isAttached()) { + if(!isAttached()) { return; } getView().stopItemProgress(itemPosition); - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { getView().showError(R.string.error_no_internet_connection); return; } @@ -580,7 +649,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha @Override public void onNext(String fileType) { - if (!isAttached()) { + if(!isAttached()) { return; } @@ -607,7 +676,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha Uri fileUri = Uri.parse(message.uri); File file = getView().getFile(fileUri); - if (file == null || !file.exists()) { + if(file == null || !file.exists()) { getView().showError(R.string.error_file_does_not_exist_anymore); return; } @@ -651,13 +720,13 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha Log.e("resendMessage", "onError", e); - if (!isAttached()) { + if(!isAttached()) { return; } getView().enableMessageRetry(message.id); - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { getView().showError(R.string.error_no_internet_connection); return; } @@ -690,11 +759,11 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha @Override public void onError(Throwable e) { Log.e("resendMessage", "onError", e); - if (!isAttached()) { + if(!isAttached()) { return; } getView().enableMessageRetry(message.id); - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { getView().showError(R.string.error_no_internet_connection); return; } @@ -733,7 +802,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha .subscribe(new Subscriber() { @Override public void onCompleted() { - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { getView().showError(R.string.error_no_internet_connection); message.status = Message.Status.FAILED; message.isRead = true; @@ -764,11 +833,11 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha storeMessageLocally(newMessage, message.id, false); storeGroupLocally(mGroupId, message); - if (!isAttached()) { + if(!isAttached()) { return; } - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { getView().showError(R.string.error_no_internet_connection); return; } @@ -809,13 +878,13 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha @Override public void onCompleted() { newMessage.createdAt *= 1000; - if (!queryLocalDBWhenFinished) { + if(!queryLocalDBWhenFinished) { Message messageToDelete = new Message(); messageToDelete.id = oldMessageId; messageToDelete.removeFromList(mMessages); mMessages.add(newMessage); - if (!isAttached()) { + if(!isAttached()) { mMessageToUpdate.add(new Pair<>(newMessage, oldMessageId)); return; } @@ -867,7 +936,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha public void saveMessage(Message message) { storeMessageLocally(message) .subscribe(() -> { - if (!isAttached()) { + if(!isAttached()) { return; } checkForEmptyMessageAndHideIt(); @@ -879,7 +948,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha } private void checkForEmptyMessageAndHideIt() { - if (mMessages.isEmpty()) { + if(mMessages.isEmpty()) { getView().hideLoading(); } } @@ -901,7 +970,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha group.lastMessage = message; mGroupRealmRepository.updateGroupMessage(group, new GroupByIdSpecification(mUserIdPreference.get())) .subscribe(() -> { - if (!isAttached()) { + if(!isAttached()) { EventBus.getDefault().post(new GroupUpdatedEvent()); } }); @@ -924,7 +993,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha @Override public void onNext(Group group) { - if (group != null) { + if(group != null) { getView().setGroup(group); return; } @@ -947,8 +1016,8 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha private Observable getGroupById(ArrayList groups) { Group group = null; - for (Group group1 : groups) { - if (group1.id == mGroupId) { + for(Group group1 : groups) { + if(group1.id == mGroupId) { group = group1; break; } @@ -958,7 +1027,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha private void groupsError(Throwable throwable) { Log.e(ChatPresenter.class.getSimpleName(), throwable.getMessage(), throwable); - if (mSystemUtils.isNetworkUnavailable()) { + if(mSystemUtils.isNetworkUnavailable()) { getView().showError(R.string.error_no_internet_connection); return; } @@ -1004,7 +1073,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha InputStream inputStream; File file = new File(filePath); - if (file.length() > 0) { + if(file.length() > 0) { urlConnection.setRequestProperty("Range", "bytes=" + file.length() + "-"); //this will be used to append the downloaded data into the file already existing fileOutput = new FileOutputStream(file, true); @@ -1019,7 +1088,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha //this is the total size of the file int totalSize = urlConnection.getContentLength(); - if (file.length() == totalSize || totalSize == -1) { + if(file.length() == totalSize || totalSize == -1) { subscriber.onNext(FileUtils.getFileTypeFromFilePath(filePath)); subscriber.onCompleted(); return; @@ -1039,15 +1108,15 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha int percentage = 0; //now, read through the input buffer and write the contents to the file - while ((bufferLength = inputStream.read(buffer, 0, 1024)) >= 0) { + while((bufferLength = inputStream.read(buffer, 0, 1024)) >= 0) { //add the data in the buffer to the file in the file output stream (the file on the sd card fileOutput.write(buffer, 0, bufferLength); //add up the size so we know how much is downloaded downloadedSize += bufferLength; percentage = (int) (downloadedSize * 100 / totalSize); - if (percentage - lastPercentage > 1) { + if(percentage - lastPercentage > 1) { lastPercentage = percentage; - if (isAttached()) { + if(isAttached()) { getView().showItemProgress(itemPosition, percentage); } } @@ -1058,7 +1127,7 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha subscriber.onNext(FileUtils.getFileTypeFromFilePath(filePath)); subscriber.onCompleted(); - } catch (IOException e) { + } catch(IOException e) { e.printStackTrace(); //noinspection ResultOfMethodCallIgnored subscriber.onError(e); @@ -1074,9 +1143,9 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha Realm realm = realmProvider.provide(); realm.beginTransaction(); boolean goOn = true; - while (goOn) { + while(goOn) { MessageRealm messageRealm = messageByIdSpecification.toRealmQuery(realm).findFirst(); - if (messageRealm == null) { + if(messageRealm == null) { goOn = false; } else { randomId = generateRandomId(); @@ -1091,5 +1160,4 @@ public class ChatPresenter extends MVPAbstractPresenter implements Cha private static String generateRandomId() { return "_" + new Random().nextInt(); } - } \ No newline at end of file diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/ChatView.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/ChatView.java index d5cf39c..942bf71 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/ChatView.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/ChatView.java @@ -55,12 +55,20 @@ interface ChatView extends MVPView { void showToastMessage(@StringRes int message); + void showEmptySearchResultMessage(String searchText); + + String getSearchText(); + + void resetSearchText(); + interface Callback { void loadMessagesFromServerByGroupId(long groupId); void loadMessagesFromDBByGroupId(long groupId, boolean fetchWhenFinished); + void searchMessagesFromDBByGroupIdAndText(long groupId, String text); + void fetchMoreMessagesByGroupId(); boolean isLoading(); diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/GroupChatActivity.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/GroupChatActivity.java index 7b2f12f..17920fc 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/GroupChatActivity.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/GroupChatActivity.java @@ -118,6 +118,13 @@ public class GroupChatActivity extends BaseChatActivity { super.onResume(); } + @Override + protected void loadSearchResult(String newText) { + if(mGroup != null && newText != null) { + mCallback.searchMessagesFromDBByGroupIdAndText(mGroup.id, newText); + } + } + @Override protected void loadMessages() { if(mSystemUtils.isNetworkUnavailable()) { @@ -146,6 +153,20 @@ public class GroupChatActivity extends BaseChatActivity { mChatImageView.setImageResource(mGroup.isHelpGroup() ? R.drawable.avatar_help_group : R.drawable.avatar_team_group); + mChatSearchView.setOnQueryTextListener(this); + mChatSearchView.setOnSearchClickListener(view -> { + mGroupMembersTextView.setVisibility(View.INVISIBLE); + mGroupTitleTextView.setVisibility(View.INVISIBLE); + mChatImageView.setVisibility(View.INVISIBLE); + }); + + mChatSearchView.setOnCloseListener(() -> { + mGroupMembersTextView.setVisibility(View.VISIBLE); + mGroupTitleTextView.setVisibility(View.VISIBLE); + mChatImageView.setVisibility(View.VISIBLE); + return false; + }); + mGroupTitleTextView.setText(mGroup.name); mGroupTitleTextView.setTextColor(ContextCompat.getColor(this, mGroup.isHelpGroup() ? R.color.colorHelpGroup : R.color.colorTeamGroup)); } diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/GroupChatAdapter.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/GroupChatAdapter.java index 5dae092..6ca00cd 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/GroupChatAdapter.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/GroupChatAdapter.java @@ -5,6 +5,7 @@ import de.beyondsoft.ownchat.model.Message; import de.beyondsoft.ownchat.utils.DateUtils; import de.beyondsoft.ownchat.utils.ui.ViewUtils; +import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.Gravity; import android.view.LayoutInflater; @@ -13,26 +14,24 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ProgressBar; -/** - * Created by Rares Teodorescu on 21/02/2017. - */ class GroupChatAdapter extends BaseChatAdapter { GroupChatAdapter(long userId) { super(userId); } + @NonNull @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == LEFT_CHAT_TYPE) { + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if(viewType == LEFT_CHAT_TYPE) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_group_chat_left, parent, false); return new MessageViewHolder(view); - } else if (viewType == RIGHT_CHAT_TYPE) { + } else if(viewType == RIGHT_CHAT_TYPE) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_group_chat_right, parent, false); return new MessageViewHolder(view); - } else if (viewType == DATE_TYPE) { + } else if(viewType == DATE_TYPE) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_date, parent, false); return new DateViewHolder(view); @@ -53,10 +52,10 @@ class GroupChatAdapter extends BaseChatAdapter { @SuppressWarnings("ConstantConditions") @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { int viewType = getItemViewType(position); - - switch (viewType) { + + switch(viewType) { case LOADING_TYPE: break; case DATE_TYPE: @@ -74,12 +73,12 @@ class GroupChatAdapter extends BaseChatAdapter { MessageViewHolder rightMessageViewHolder = (MessageViewHolder) holder; setGroupMessage(rightMessageViewHolder, rightMessage, position, false); - if (rightMessage.status == Message.Status.DELIVERED) { + if(rightMessage.status == Message.Status.DELIVERED) { rightMessageViewHolder.statusProgressBar.setVisibility(View.GONE); rightMessageViewHolder.statusImageView.setVisibility(View.VISIBLE); rightMessageViewHolder.statusImageView.setImageResource(R.drawable.delivered); rightMessageViewHolder.sendingFailedTextView.setVisibility(View.GONE); - } else if (rightMessage.status == Message.Status.FAILED) { + } else if(rightMessage.status == Message.Status.FAILED) { rightMessageViewHolder.statusProgressBar.setVisibility(View.GONE); rightMessageViewHolder.statusImageView.setVisibility(View.VISIBLE); rightMessageViewHolder.statusImageView.setImageResource(R.drawable.failed); diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/SingleChatActivity.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/SingleChatActivity.java index d3d3840..e03f79e 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/SingleChatActivity.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/SingleChatActivity.java @@ -10,12 +10,15 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.text.TextUtils; +import android.util.Log; import android.view.View; +import android.view.ViewGroup; import android.widget.EditText; import com.bumptech.glide.load.engine.DiskCacheStrategy; @@ -88,6 +91,13 @@ public class SingleChatActivity extends BaseChatActivity { super.onPause(); } + @Override + protected void loadSearchResult(String newText) { + if(mGroup != null && newText != null) { + mCallback.searchMessagesFromDBByGroupIdAndText(mGroup.id, newText); + } + } + @Override protected void loadMessages() { if(!TextUtils.isEmpty(mGroup.mobile)) { @@ -109,6 +119,26 @@ public class SingleChatActivity extends BaseChatActivity { mSingleChatTitleTextView.setText(mGroup.name); mSingleChatTitleTextView.setTextColor(ContextCompat.getColor(this, mGroup.onlyEmployees ? de.beyondsoft.ownchat.R.color.colorBlack : de.beyondsoft.ownchat.R.color.colorHelpGroup)); + mChatSearchView.setOnQueryTextListener(this); + mChatSearchView.setOnSearchClickListener(view -> { + mSingleChatTitleTextView.setVisibility(View.INVISIBLE); + mChatImageView.setVisibility(View.INVISIBLE); + }); + + mChatSearchView.setOnCloseListener(() -> { + mSingleChatTitleTextView.setVisibility(View.VISIBLE); + mChatImageView.setVisibility(View.VISIBLE); + return false; + }); + + Drawable drawable = mExtraImageView.getDrawable(); + + if(drawable == null) { + ViewGroup.LayoutParams layoutParams = mExtraImageView.getLayoutParams(); + layoutParams.width = 0; + mExtraImageView.setLayoutParams(layoutParams); + } + if(TextUtils.isEmpty(mGroup.avatar)) { mChatImageView.setImageResource(mGroup.onlyEmployees ? de.beyondsoft.ownchat.R.drawable.avatar : R.drawable.avatar_help); } else { diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/SingleChatAdapter.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/SingleChatAdapter.java index 54edb75..2a76d9b 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/SingleChatAdapter.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chat/SingleChatAdapter.java @@ -13,9 +13,6 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ProgressBar; -/** - * Created by Rares Teodorescu on 21/02/2017. - */ class SingleChatAdapter extends BaseChatAdapter { SingleChatAdapter(long userId) { @@ -24,15 +21,15 @@ class SingleChatAdapter extends BaseChatAdapter { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == LEFT_CHAT_TYPE) { + if(viewType == LEFT_CHAT_TYPE) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_single_chat_left, parent, false); return new MessageViewHolder(view); - } else if (viewType == RIGHT_CHAT_TYPE) { + } else if(viewType == RIGHT_CHAT_TYPE) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_single_chat_right, parent, false); return new MessageViewHolder(view); - } else if (viewType == DATE_TYPE) { + } else if(viewType == DATE_TYPE) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_date, parent, false); return new DateViewHolder(view); @@ -54,7 +51,7 @@ class SingleChatAdapter extends BaseChatAdapter { @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int viewType = getItemViewType(position); - switch (viewType) { + switch(viewType) { case LOADING_TYPE: break; case DATE_TYPE: @@ -74,12 +71,12 @@ class SingleChatAdapter extends BaseChatAdapter { setSingleMessage(rightChatHolder, rightMessage, position, false); - if (rightMessage.status == Message.Status.DELIVERED) { + if(rightMessage.status == Message.Status.DELIVERED) { rightChatHolder.statusProgressBar.setVisibility(View.GONE); rightChatHolder.statusImageView.setVisibility(View.VISIBLE); rightChatHolder.statusImageView.setImageResource(R.drawable.delivered); rightChatHolder.sendingFailedTextView.setVisibility(View.GONE); - } else if (rightMessage.status == Message.Status.FAILED) { + } else if(rightMessage.status == Message.Status.FAILED) { rightChatHolder.statusProgressBar.setVisibility(View.GONE); rightChatHolder.statusImageView.setVisibility(View.VISIBLE); rightChatHolder.statusImageView.setImageResource(R.drawable.failed); diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chatmembers/ChatMembersActivity.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chatmembers/ChatMembersActivity.java index 51a3f31..112e805 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chatmembers/ChatMembersActivity.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/chatmembers/ChatMembersActivity.java @@ -12,6 +12,7 @@ import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.SearchView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -20,9 +21,6 @@ import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; -/** - * Created by imarneanu on 2/24/17. - */ public class ChatMembersActivity extends AppCompatActivity { protected final static String GROUP_ARG = "group_arg"; @@ -41,6 +39,9 @@ public class ChatMembersActivity extends AppCompatActivity { @BindView(R.id.chat_members_recycler_view) RecyclerView mChatMembersRecyclerView; + @BindView(R.id.chatSearchView) + SearchView mChatSearchView; + private RecyclerView.ItemDecoration mHorizontalDividerItemDecoration; public static Intent createIntent(Context context, Group group) { @@ -63,6 +64,8 @@ public class ChatMembersActivity extends AppCompatActivity { ChatMembersAdapter contactsAdapter = new ChatMembersAdapter(group.users); mChatMembersRecyclerView.setAdapter(contactsAdapter); + + mChatSearchView.setVisibility(View.GONE); } private void setToolbar(Group group) { diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/contacts/ContactsFragment.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/contacts/ContactsFragment.java index 0847432..6432781 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/contacts/ContactsFragment.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/page/contacts/ContactsFragment.java @@ -232,24 +232,27 @@ public class ContactsFragment extends BaseFragment implements ContactsView, Cont } else { mCallback.loadGroupsContainingName(newText); } + return false; } @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) public void onInvalidToken(GroupUpdatedEvent groupUpdatedEvent) { - if (mCallback == null) { + if(mCallback == null) { mContactsPresenter.attachView(this); } + mCallback.loadGroupsFromDB(); } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (mCallback == null) { + if(mCallback == null) { return; } + Bundle bundle = intent.getBundleExtra(Constants.MESSAGE); Message message = new Message(bundle.getString(Constants.MESSAGE_ID), bundle.getLong(Constants.GROUP_ID), @@ -266,6 +269,7 @@ public class ContactsFragment extends BaseFragment implements ContactsView, Cont false, mUserIdPreference.get(), false); + mCallback.storeGroupLocally(bundle.getLong(Constants.GROUP_ID), message); } }; diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/utils/FileUtils.java b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/utils/FileUtils.java index 5defe1f..5ac99d4 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/utils/FileUtils.java +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/java/de/beyondsoft/ownchat/utils/FileUtils.java @@ -39,6 +39,7 @@ import java.io.IOException; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Comparator; import java.util.Date; diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/chat_toolbar.xml b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/chat_toolbar.xml index 6304ff9..61ba287 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/chat_toolbar.xml +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/chat_toolbar.xml @@ -2,6 +2,7 @@ + + + tools:text="MyFile.txt" + tools:visibility="visible" /> + emojicon:emojiconSize="20sp" + tools:text="Meine Freundin, die Maschine. Als sie mein Herz für sich gewann. Mit ihren ganzen kleinen Geschwistern, mit denen man alles machen kann." /> diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_group_chat_right.xml b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_group_chat_right.xml index 6b63c92..e564dee 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_group_chat_right.xml +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_group_chat_right.xml @@ -100,10 +100,11 @@ android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_below="@+id/chat_item_file" + android:maxWidth="200dp" android:textColor="@color/colorBlack" android:visibility="gone" - tools:visibility="visible" - tools:text="MyFile.txt"/> + tools:text="MyFile.txt" + tools:visibility="visible" /> + tools:visibility="visible" /> diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_single_chat_left.xml b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_single_chat_left.xml index c9aa461..91b84de 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_single_chat_left.xml +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_single_chat_left.xml @@ -43,11 +43,12 @@ android:id="@+id/chat_item_file_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:visibility="gone" android:layout_below="@+id/chat_item_file" + android:maxWidth="200dp" android:textColor="@color/colorBlack" - tools:visibility="visible" - tools:text="MyFile.txt"/> + android:visibility="gone" + tools:text="MyFileMyFileMyFileMyFileMyFileMyFileMyFileMyFileMyFileMyFileMyFileMyFileMyFileMyFile.txt" + tools:visibility="visible" /> + android:textColor="@color/colorBlack" + emojicon:emojiconSize="20sp" + tools:text="Meine Freundin, die Maschine. Als sie mein Herz für sich gewann. Mit ihren ganzen kleinen Geschwistern, mit denen man alles machen kann." + tools:visibility="visible" /> \ No newline at end of file diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_single_chat_right.xml b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_single_chat_right.xml index 14e7dbe..9d6619e 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_single_chat_right.xml +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/layout/item_single_chat_right.xml @@ -101,24 +101,24 @@ android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_below="@+id/chat_item_file" + android:maxWidth="200dp" android:textColor="@color/colorBlack" android:visibility="gone" tools:text="MyFile.txt" - tools:visibility="visible"/> + tools:visibility="visible" /> + tools:visibility="visible" /> \ No newline at end of file diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/values/strings.xml b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/values/strings.xml index 3d90efb..c854f17 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/values/strings.xml +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/values/strings.xml @@ -45,6 +45,8 @@ Eine Datei wurde empfangen Antwort Du + Ihre Suche nach + ergab keine Treffer. Keine Internetverbindung diff --git a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/values/styles.xml b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/values/styles.xml index 9107a32..3b171f0 100644 --- a/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/values/styles.xml +++ b/BeWoPlanerChat/bewoplaner-chat-android/app/src/main/res/values/styles.xml @@ -48,11 +48,12 @@ ?android:attr/textAppearanceSmall - + + - + + +