This commit is contained in:
Lyndon
2018-07-04 13:41:35 +02:00
parent 1724c14ad3
commit 8bef7cf51a
24 changed files with 494 additions and 206 deletions

View File

@@ -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;
}
}
}

View File

@@ -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;

View File

@@ -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<MessageRealm> {
private long mGroupId;

View File

@@ -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<MessageRealm> toRealmQuery(Realm realm) {
return realm.where(MessageRealm.class)
.contains(MessageRealm.MESSAGE, mSearchText, Case.INSENSITIVE)
.equalTo(MessageRealm.GROUP_ID, mGroupId)
.equalTo(MessageRealm.USER_ID, mUserId);
}
}

View File

@@ -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";
}

View File

@@ -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<FileType> getFileTypes() {

View File

@@ -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);
}
}
}

View File

@@ -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<RecyclerView.ViewHol
if(!TextUtils.isEmpty(message.filePath)) {
viewHolder.messageTextView.setVisibility(View.GONE);
int maxWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, viewHolder.filenameTextView.getResources().getDisplayMetrics());
if(mDownloadProgressMap.containsKey(position)) {
viewHolder.fileImageView.setVisibility(View.GONE);
viewHolder.donutProgress.setVisibility(View.VISIBLE);
viewHolder.donutProgress.setProgress(mDownloadProgressMap.get(position));
viewHolder.donutProgress.setText(String.format(Locale.getDefault(), "%d %%", mDownloadProgressMap.get(position)));
if(!message.filePath.toLowerCase().endsWith(".png") && !message.filePath.toLowerCase().endsWith(".jpg")) {
if(!message.filePath.toLowerCase().endsWith(".png") && !message.filePath.toLowerCase().endsWith(".jpg") && !message.filePath.toLowerCase().endsWith(".gif")) {
viewHolder.filenameTextView.setVisibility(View.VISIBLE);
viewHolder.filenameTextView.setText(message.originalFilename);
viewHolder.filenameTextView.setMaxWidth(maxWidth);
} else {
viewHolder.filenameTextView.setVisibility(View.GONE);
}
} else {
viewHolder.donutProgress.setVisibility(View.GONE);
viewHolder.fileImageView.setVisibility(View.VISIBLE);
viewHolder.filenameTextView.setVisibility(View.GONE);
if(!message.filePath.toLowerCase().endsWith(".png") && !message.filePath.toLowerCase().endsWith(".jpg") && !message.filePath.toLowerCase().endsWith(".gif")) {
viewHolder.filenameTextView.setVisibility(View.VISIBLE);
viewHolder.filenameTextView.setText(message.originalFilename);
viewHolder.filenameTextView.setMaxWidth(maxWidth);
} else {
viewHolder.filenameTextView.setVisibility(View.GONE);
}
viewHolder.fileImageView.setImageDrawable(null);
GlideApp.with(viewHolder.fileImageView.getContext())
@@ -338,6 +350,7 @@ abstract class BaseChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
if(!TextUtils.isEmpty(message.message)) {
viewHolder.messageTextView.setVisibility(View.VISIBLE);
viewHolder.messageTextView.setMaxWidth(maxWidth);
viewHolder.messageTextView.setText(message.message);
}
} else {

View File

@@ -15,6 +15,7 @@ import de.beyondsoft.ownchat.data.repository.models.MessageRealm;
import de.beyondsoft.ownchat.data.repository.specifications.GroupByIdSpecification;
import de.beyondsoft.ownchat.data.repository.specifications.MessageByGroupIdSpecification;
import de.beyondsoft.ownchat.data.repository.specifications.MessageByIdSpecification;
import de.beyondsoft.ownchat.data.repository.specifications.MessagesByGroupAndSearchTextSpecification;
import de.beyondsoft.ownchat.di.scopes.ActivityScope;
import de.beyondsoft.ownchat.model.Group;
import de.beyondsoft.ownchat.model.Message;
@@ -122,7 +123,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
*/
@Override
public void loadMessagesFromServerByGroupId(long groupId) {
if (!mFetchMore) {
if(!mFetchMore) {
getView().hideMessagesLoading();
return;
}
@@ -135,7 +136,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
.flatMap(messageResponse -> {
ArrayList<Message> 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<ChatView> implements Cha
for(int i = 0; i < mMessageToUpdate.size(); i++) {
Pair<Message, String> messageToUpdate = mMessageToUpdate.get(i);
if (isAttached()) {
if(isAttached()) {
getView().lastMessageUpdated(messageToUpdate.first, messageToUpdate.second);
}
}
@@ -209,12 +210,12 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
* Send messages to view.
*/
private void fetchNewMessagesSuccess(List<Message> 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<ChatView> 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<ChatView> 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<ChatView> implements Cha
.subscribe(this::loadMessagesFromDBSuccessful, this::loadMessagesError);
}
/**
* Send messages to view.
*/
private void loadMessagesFromDBSuccessful(ArrayList<Message> 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<Message> 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<ChatView> 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<Message> 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<ChatView> implements Cha
}
private void loadMessagesError(Throwable throwable) {
if (!isAttached()) {
if(!isAttached()) {
return;
}
@@ -376,20 +445,20 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> 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<ChatView> 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<ChatView> implements Cha
false);
storeMessageLocally(message).subscribe(new Subscriber<Object>() {
@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<MessageResponse>() {
@Override
public void onCompleted() {
mChatService.sendFile(groupIdBody, body, textBody)
.compose(RxUtils.provideDefaultTransformer())
.flatMap(new ErrorHandlingResponseConverter<>())
.subscribe(new Subscriber<MessageResponse>() {
@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<String> 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<String> 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<ChatView> 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<ChatView> 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<ChatView> implements Cha
@Override
public void onNext(String fileType) {
if (!isAttached()) {
if(!isAttached()) {
return;
}
@@ -607,7 +676,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> 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<ChatView> 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<ChatView> 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<ChatView> implements Cha
.subscribe(new Subscriber<Object>() {
@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<ChatView> 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<ChatView> 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<ChatView> 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<ChatView> implements Cha
}
private void checkForEmptyMessageAndHideIt() {
if (mMessages.isEmpty()) {
if(mMessages.isEmpty()) {
getView().hideLoading();
}
}
@@ -901,7 +970,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> 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<ChatView> 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<ChatView> implements Cha
private Observable<Group> getGroupById(ArrayList<Group> 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<ChatView> 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<ChatView> 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<ChatView> 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<ChatView> 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<ChatView> 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<ChatView> 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<ChatView> implements Cha
private static String generateRandomId() {
return "_" + new Random().nextInt();
}
}

View File

@@ -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();

View File

@@ -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));
}

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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);
}
};

View File

@@ -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;

View File

@@ -2,6 +2,7 @@
<android.support.design.widget.AppBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/chat_app_bar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
@@ -49,8 +50,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginEnd="-45dp"
android:layout_toEndOf="@+id/chat_toolbar_image_view"
android:layout_toStartOf="@+id/chat_toolbar_extra_image"
android:layout_toStartOf="@+id/chatSearchView"
android:orientation="vertical">
<TextView
@@ -78,6 +80,20 @@
tools:text="Group title" />
</LinearLayout>
<android.support.v7.widget.SearchView
android:id="@+id/chatSearchView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="45dp"
android:layout_toStartOf="@id/chat_toolbar_extra_image"
android:paddingBottom="5dp"
android:paddingStart="5dp"
android:paddingEnd="0dp"
android:paddingTop="5dp"
app:iconifiedByDefault="true"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:theme="@style/AppTheme.Toolbar" />
<ImageView
android:id="@+id/chat_toolbar_extra_image"
android:layout_width="wrap_content"

View File

@@ -58,12 +58,13 @@
android:id="@+id/chat_item_file_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/chat_item_file"
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" />
<com.github.lzyzsd.circleprogress.DonutProgress
android:id="@+id/chat_item_progress"
@@ -80,15 +81,14 @@
<hani.momanii.supernova_emoji_library.Helper.EmojiconTextView
android:id="@+id/chat_item_message"
style="@style/BaseChatItemText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/chat_item_file_name"
android:layout_alignParentStart="true"
emojicon:emojiconSize="20sp"
style="@style/BaseChatItemText"
android:layout_below="@id/chat_item_file_name"
android:textColor="@color/colorLeftChat"
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."
/>
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." />
</RelativeLayout>

View File

@@ -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" />
<com.github.lzyzsd.circleprogress.DonutProgress
android:id="@+id/chat_item_progress"
@@ -118,6 +119,7 @@
<hani.momanii.supernova_emoji_library.Helper.EmojiconTextView
android:id="@+id/chat_item_message"
style="@style/BaseChatItemText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
@@ -125,9 +127,8 @@
android:padding="0dp"
android:textColor="@color/colorWhite"
emojicon:emojiconSize="20sp"
style="@style/BaseChatItemText"
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. www.google.com"
tools:visibility="visible"/>
tools:visibility="visible" />
</RelativeLayout>

View File

@@ -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" />
<com.github.lzyzsd.circleprogress.DonutProgress
android:id="@+id/chat_item_progress"
@@ -62,13 +63,14 @@
<hani.momanii.supernova_emoji_library.Helper.EmojiconTextView
android:id="@+id/chat_item_message"
style="@style/BaseChatItemText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
emojicon:emojiconSize="20sp"
android:textColor="@color/colorBlack"
android:layout_below="@id/chat_item_file_name"
style="@style/BaseChatItemText"
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." />
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" />
</RelativeLayout>
</RelativeLayout>

View File

@@ -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" />
<hani.momanii.supernova_emoji_library.Helper.EmojiconTextView
android:id="@+id/chat_item_message"
style="@style/BaseChatItemText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@id/chat_item_file_name"
android:textColor="@color/colorWhite"
android:visibility="gone"
emojicon:emojiconSize="20sp"
style="@style/BaseChatItemText"
android:textColor="@color/colorWhite"
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"
/>
tools:visibility="visible" />
</RelativeLayout>
</RelativeLayout>

View File

@@ -45,6 +45,8 @@
<string name="chat_file_received">Eine Datei wurde empfangen</string>
<string name="chat_reply_label">Antwort</string>
<string name="chat_you_name">Du</string>
<string name="chat_empty_search_message_1">Ihre Suche nach</string>
<string name="chat_empty_search_message_2">ergab keine Treffer.</string>
<!-- Error messages -->
<string name="error_no_internet_connection">Keine Internetverbindung</string>

View File

@@ -48,11 +48,12 @@
<item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
</style>
<!-- Profile style --><style name="AppTheme.Profile.Button" parent="AppTheme.Button">
<item name="android:textSize">@dimen/profile_avatar_change_text</item>
<item name="android:background">@drawable/btn_shape</item>
<item name="android:layout_height">@dimen/profile_avatar_change_height</item>
</style>
<!-- Profile style -->
<style name="AppTheme.Profile.Button" parent="AppTheme.Button">
<item name="android:textSize">@dimen/profile_avatar_change_text</item>
<item name="android:background">@drawable/btn_shape</item>
<item name="android:layout_height">@dimen/profile_avatar_change_height</item>
</style>
<style name="AppTheme.ProfileName">
<item name="android:textSize">@dimen/profile_name_text</item>
@@ -94,7 +95,6 @@
<style name="StyledDialog" parent="Theme.AppCompat.Light.Dialog.Alert" />
<!-- Chat -->
<style name="BaseChatItemText">
<item name="android:textSize">14sp</item>
<item name="android:autoLink">all</item>
@@ -110,7 +110,6 @@
</style>
<!-- File Picker -->
<style name="PickerTabLayout" parent="Widget.Design.TabLayout">
<item name="tabGravity">fill</item>
<item name="tabMaxWidth">0dp</item>
@@ -122,4 +121,12 @@
<item name="android:windowIsFloating">true</item>
</style>
<!-- SearchView -->
<style name="AppTheme.Toolbar" parent="AppTheme">
<!--This line changes the color of text in Toolbar-->
<item name="android:textColorPrimary">@color/colorBlack</item>
<!--This line changes the color of icons in toolbar (back, overflow menu icons)-->
<item name="android:textColorSecondary">@color/colorBlack</item>
</style>
</resources>