Push loads the received message via its id
This commit is contained in:
@@ -18,4 +18,5 @@ public interface AppPrefsConstants {
|
||||
String UPLOAD_MAX_SIZE = "upload_max_size";
|
||||
String IS_EMPLOYEE = "is_employee";
|
||||
String SHOW_LOGIN_AGAIN = "show_login_again";
|
||||
String LAST_ACCOUNT_NO = "last_account_no";
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package de.beyondsoft.ownchat.data.api.services;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
import de.beyondsoft.ownchat.data.api.responses.GroupResponse;
|
||||
import de.beyondsoft.ownchat.data.api.responses.MessageResponse;
|
||||
import de.beyondsoft.ownchat.data.api.responses.MessagesResponse;
|
||||
@@ -12,6 +14,7 @@ import retrofit2.http.GET;
|
||||
import retrofit2.http.Multipart;
|
||||
import retrofit2.http.POST;
|
||||
import retrofit2.http.Part;
|
||||
import retrofit2.http.Path;
|
||||
import retrofit2.http.Query;
|
||||
import rx.Observable;
|
||||
|
||||
@@ -26,6 +29,9 @@ public interface ChatService {
|
||||
Observable<MessagesResponse> getMessages(@Query("groupid") long groupId,
|
||||
@Query("page") int page);
|
||||
|
||||
@GET("api/chat/message/{oid}")
|
||||
Observable<JsonObject> getMessage(@Path("oid") String messageId);
|
||||
|
||||
@Multipart
|
||||
@POST("api/chat/messages/send")
|
||||
Observable<MessageResponse> sendFile(
|
||||
|
||||
@@ -14,12 +14,6 @@ import rx.Observable;
|
||||
* Created by laszloffiferenc on 2/21/17.
|
||||
*/
|
||||
public interface LoginService {
|
||||
@FormUrlEncoded
|
||||
@POST("api/user/login")
|
||||
Observable<ProfileResponse> login(
|
||||
@Field("username") String username,
|
||||
@Field("password") String password
|
||||
);
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST("api/user/loginwithchatcode")
|
||||
|
||||
@@ -2,9 +2,11 @@ package de.beyondsoft.ownchat.data.firebase;
|
||||
|
||||
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||
import com.google.firebase.messaging.RemoteMessage;
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
import de.beyondsoft.ownchat.R;
|
||||
import de.beyondsoft.ownchat.data.AppPrefsConstants;
|
||||
import de.beyondsoft.ownchat.data.api.services.ChatService;
|
||||
import de.beyondsoft.ownchat.data.prefs.LongPreference;
|
||||
import de.beyondsoft.ownchat.data.repository.GroupRealmRepository;
|
||||
import de.beyondsoft.ownchat.data.repository.MessageRealmRepository;
|
||||
@@ -16,6 +18,8 @@ import de.beyondsoft.ownchat.model.Message;
|
||||
import de.beyondsoft.ownchat.page.main.MainActivity;
|
||||
import de.beyondsoft.ownchat.utils.Constants;
|
||||
import de.beyondsoft.ownchat.utils.LoggedOutUtils;
|
||||
import de.beyondsoft.ownchat.utils.rx.RxUtils;
|
||||
import rx.Subscriber;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Notification;
|
||||
@@ -55,6 +59,9 @@ import static de.beyondsoft.ownchat.utils.Constants.CHAT_IS_ALREADY_OPEN;
|
||||
*/
|
||||
public class HandleMessagesService extends FirebaseMessagingService {
|
||||
|
||||
@Inject
|
||||
ChatService mChatService;
|
||||
|
||||
@Inject
|
||||
MessageRealmRepository mMessageRealmRepository;
|
||||
|
||||
@@ -93,23 +100,52 @@ public class HandleMessagesService extends FirebaseMessagingService {
|
||||
}
|
||||
}
|
||||
|
||||
private void customizeNotification(Map<String, String> data) {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(Constants.MESSAGE_ID, data.get(Constants.MESSAGE_ID));
|
||||
bundle.putLong(Constants.GROUP_ID, Long.parseLong(data.get(Constants.GROUP_ID)));
|
||||
bundle.putLong(Constants.CREATED_AT, Long.parseLong(data.get(Constants.CREATED_AT)));
|
||||
bundle.putString(Constants.MESSAGE_TEXT, data.get(Constants.MESSAGE_TEXT));
|
||||
bundle.putString(Constants.FILE, data.get(Constants.FILE));
|
||||
bundle.putString(Constants.SMALLER_IMAGE, data.get(Constants.SMALLER_IMAGE));
|
||||
bundle.putString(Constants.FILENAME, data.get(Constants.FILENAME));
|
||||
bundle.putLong(Constants.USER_ID, Long.parseLong(data.get(Constants.USER_ID)));
|
||||
bundle.putString(Constants.USERNAME, data.get(Constants.USERNAME));
|
||||
bundle.putString(Constants.USER_AVATAR, data.get(Constants.USER_AVATAR));
|
||||
private void customizeNotification(Map<String, String> dataMap) {
|
||||
String messageId = dataMap.get(Constants.MESSAGE_ID);
|
||||
|
||||
final Bitmap bitmap = getBitmapFromUrl(data.get(Constants.USER_AVATAR));
|
||||
mChatService.getMessage(messageId)
|
||||
.compose(RxUtils.provideDefaultTransformer())
|
||||
.subscribe(new Subscriber<JsonObject>() {
|
||||
@Override
|
||||
public void onCompleted() {}
|
||||
|
||||
@Override
|
||||
public void onError(Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNext(JsonObject remoteMessage) {
|
||||
notifyTheUser(remoteMessage);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private String getJsonString(JsonObject object, String memberName) {
|
||||
return object.get(memberName).isJsonNull() ? null : object.get(memberName).getAsString();
|
||||
}
|
||||
|
||||
private void notifyTheUser(JsonObject remoteMessage) {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(Constants.MESSAGE_ID, getJsonString(remoteMessage, Constants.MESSAGE_ID));
|
||||
bundle.putLong(Constants.GROUP_ID, remoteMessage.get(Constants.GROUP_ID).getAsLong());
|
||||
bundle.putLong(Constants.CREATED_AT, remoteMessage.get(Constants.CREATED_AT).getAsLong());
|
||||
bundle.putString(Constants.MESSAGE_TEXT, getJsonString(remoteMessage, Constants.MESSAGE_TEXT));
|
||||
bundle.putString(Constants.FILE, getJsonString(remoteMessage, Constants.FILE));
|
||||
|
||||
bundle.putString(Constants.SMALLER_IMAGE, getJsonString(remoteMessage, Constants.SMALLER_IMAGE));
|
||||
|
||||
bundle.putString(Constants.FILENAME, getJsonString(remoteMessage, Constants.FILENAME));
|
||||
|
||||
bundle.putLong(Constants.USER_ID, remoteMessage.get(Constants.USER_ID).getAsLong());
|
||||
bundle.putString(Constants.USERNAME, getJsonString(remoteMessage, Constants.USERNAME));
|
||||
bundle.putString(Constants.USER_AVATAR, getJsonString(remoteMessage, Constants.USER_AVATAR));
|
||||
|
||||
final Bitmap bitmap = getBitmapFromUrl(remoteMessage.get(Constants.USER_AVATAR).getAsString());
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra(Constants.MESSAGE, bundle);
|
||||
intent.setAction(Constants.NOTIFICATION_BROADCAST);
|
||||
|
||||
sendOrderedBroadcast(intent, null, new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
@@ -117,7 +153,7 @@ public class HandleMessagesService extends FirebaseMessagingService {
|
||||
|
||||
if (!results.getBoolean(CHAT_IS_ALREADY_OPEN, false)) {
|
||||
int groupId = (int) bundle.getLong(Constants.GROUP_ID);
|
||||
int numberOfUsers = Integer.parseInt(data.get(Constants.GROUP_NR_USERS));
|
||||
int numberOfUsers = remoteMessage.get(Constants.GROUP_NR_USERS).getAsInt();
|
||||
intent = MainActivity.createIntent(context, bundle, numberOfUsers, groupId);
|
||||
|
||||
PendingIntent pendingIntent = PendingIntent.getActivity(context,
|
||||
@@ -134,10 +170,10 @@ public class HandleMessagesService extends FirebaseMessagingService {
|
||||
|
||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
|
||||
.setSmallIcon(getNotificationIcon())
|
||||
.setContentTitle(setNotificationTitle(data, numberOfUsers))
|
||||
.setContentText(getTextFromNotification(data))
|
||||
.setContentTitle(remoteMessage.get(Constants.USERNAME).getAsString() + (numberOfUsers > 2 ? " @ " +remoteMessage.get(Constants.GROUP_NAME).getAsString() : ""))
|
||||
.setContentText(getTextFromNotification(remoteMessage))
|
||||
.setAutoCancel(true)
|
||||
.setStyle(new NotificationCompat.BigTextStyle().bigText(getTextFromNotification(data)))
|
||||
.setStyle(new NotificationCompat.BigTextStyle().bigText(getTextFromNotification(remoteMessage)))
|
||||
.setPriority(Notification.PRIORITY_MAX)
|
||||
.setContentIntent(pendingIntent)
|
||||
.setLargeIcon(getCircleBitmap(bitmapToDisplay))
|
||||
@@ -242,14 +278,17 @@ public class HandleMessagesService extends FirebaseMessagingService {
|
||||
.build();
|
||||
}
|
||||
|
||||
private String getTextFromNotification(Map<String, String> data) {
|
||||
private String getTextFromNotification(JsonObject jsonObject) {
|
||||
String message = null;
|
||||
if (data.get(Constants.MESSAGE_TEXT) != null) {
|
||||
message = String.valueOf(data.get(Constants.MESSAGE_TEXT));
|
||||
|
||||
if (!jsonObject.get(Constants.MESSAGE_TEXT).isJsonNull()) {
|
||||
message = jsonObject.get(Constants.MESSAGE_TEXT).getAsString();
|
||||
}
|
||||
if (!data.get(Constants.FILE).equals("")) {
|
||||
|
||||
if (!jsonObject.get(Constants.FILE).isJsonNull() && !jsonObject.get(Constants.FILE).getAsString().equals("")) {
|
||||
message = getString(R.string.chat_file_received);
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,13 @@ public class AppPrefsModule {
|
||||
return new StringPreference(sharedPreferences, AppPrefsConstants.ACCOUNT_NO);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@ApplicationScope
|
||||
@Named(AppPrefsConstants.LAST_ACCOUNT_NO)
|
||||
StringPreference provideLastAccountNumber(@AppPrefs SecurePreferences sharedPreferences) {
|
||||
return new StringPreference(sharedPreferences, AppPrefsConstants.LAST_ACCOUNT_NO);
|
||||
}
|
||||
|
||||
@Provides
|
||||
@ApplicationScope
|
||||
@Named(AppPrefsConstants.USER_ID)
|
||||
|
||||
@@ -58,6 +58,9 @@ public interface ApplicationComponent {
|
||||
@Named(AppPrefsConstants.ACCOUNT_NO)
|
||||
StringPreference provideAccountNumber();
|
||||
|
||||
@Named(AppPrefsConstants.LAST_ACCOUNT_NO)
|
||||
StringPreference provideLastAccountNumber();
|
||||
|
||||
@Named(AppPrefsConstants.USER_ID)
|
||||
LongPreference provideUserId();
|
||||
|
||||
|
||||
@@ -108,6 +108,7 @@ public class Message {
|
||||
if (status == null) {
|
||||
return STATUS_DELIVERED;
|
||||
}
|
||||
|
||||
switch (status) {
|
||||
case DELIVERED:
|
||||
return STATUS_DELIVERED;
|
||||
@@ -116,6 +117,7 @@ public class Message {
|
||||
case PENDING:
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -150,6 +152,7 @@ public class Message {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
@@ -159,42 +162,54 @@ public class Message {
|
||||
if (senderId != message1.senderId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (groupId != message1.groupId) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (createdAt != message1.createdAt && createdAt != message1.createdAt * 1000 && createdAt * 1000 != message1.createdAt) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!id.equals(message1.id)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (uri != null ? !uri.equals(message1.uri) : message1.uri != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (senderName != null ? !senderName.equals(message1.senderName) : message1.senderName != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (senderAvatar != null ? !senderAvatar.equals(message1.senderAvatar) : message1.senderAvatar != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (message != null ? !message.equals(message1.message) : message1.message != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (filePath != null ? !filePath.equals(message1.filePath) : message1.filePath != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (smallerImage != null ? !smallerImage.equals(message1.smallerImage) : message1.smallerImage != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isRead != ((Message) o).isRead) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return status == message1.status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = id.hashCode();
|
||||
|
||||
result = 31 * result + (int) (senderId ^ (senderId >>> 32));
|
||||
result = 31 * result + (senderName != null ? senderName.hashCode() : 0);
|
||||
result = 31 * result + (senderAvatar != null ? senderAvatar.hashCode() : 0);
|
||||
@@ -205,6 +220,7 @@ public class Message {
|
||||
result = 31 * result + (smallerImage != null ? smallerImage.hashCode() : 0);
|
||||
result = 31 * result + (int) (createdAt ^ (createdAt >>> 32));
|
||||
result = 31 * result + (status != null ? status.hashCode() : 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -233,6 +249,7 @@ public class Message {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,11 +155,14 @@ abstract class BaseChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||
mMessages.addAll(currentMessages);
|
||||
|
||||
Calendar lastDay = Calendar.getInstance();
|
||||
|
||||
if (mMessages.size() > 1) {
|
||||
lastDay.setTimeInMillis(mMessages.get(1).createdAt);
|
||||
}
|
||||
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTimeInMillis(message.createdAt);
|
||||
|
||||
if (calendar.get(Calendar.DAY_OF_YEAR) != lastDay.get(Calendar.DAY_OF_YEAR)) {
|
||||
// New date inserted
|
||||
setMessages(new ArrayList<>(mMessages));
|
||||
@@ -180,13 +183,16 @@ abstract class BaseChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||
|
||||
List<Integer> currentDatePositions = new ArrayList<>();
|
||||
boolean newDateAdded = false;
|
||||
|
||||
if (calendar.get(Calendar.DAY_OF_YEAR) != lastDay.get(Calendar.DAY_OF_YEAR)) {
|
||||
currentDatePositions.add(1);
|
||||
newDateAdded = true;
|
||||
}
|
||||
|
||||
for (int i = 0, size = mDatePositions.size(); i < size; i++) {
|
||||
currentDatePositions.add(mDatePositions.get(i) + (newDateAdded ? 2 : 1));
|
||||
}
|
||||
|
||||
mDatePositions.clear();
|
||||
mDatePositions.addAll(currentDatePositions);
|
||||
|
||||
@@ -300,13 +306,14 @@ abstract class BaseChatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||
} else {
|
||||
viewHolder.filenameTextView.setVisibility(View.GONE);
|
||||
}
|
||||
} else if (message.filePath.toLowerCase().endsWith(".png") || message.filePath.toLowerCase().endsWith(".jpg")) {
|
||||
} else if (message.filePath.toLowerCase().endsWith(".png") || message.filePath.toLowerCase().endsWith(".jpg") || message.filePath.toLowerCase().endsWith(".gif")) {
|
||||
viewHolder.donutProgress.setVisibility(View.GONE);
|
||||
viewHolder.fileImageView.setVisibility(View.VISIBLE);
|
||||
viewHolder.filenameTextView.setVisibility(View.GONE);
|
||||
viewHolder.fileImageView.setImageDrawable(null);
|
||||
Log.d("FILE_PATH", message.toString());
|
||||
Glide.with(viewHolder.fileImageView.getContext())
|
||||
.load(message.smallerImage)
|
||||
.load(message.filePath)
|
||||
.placeholder(R.drawable.document)
|
||||
.dontAnimate()
|
||||
.override(500, 500)
|
||||
|
||||
@@ -117,7 +117,9 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
getView().hideMessagesLoading();
|
||||
return;
|
||||
}
|
||||
|
||||
mGroupId = groupId;
|
||||
|
||||
Subscription subscription = mChatService.getMessages(groupId, mPage)
|
||||
.compose(RxUtils.provideDefaultTransformer())
|
||||
.flatMap(new ErrorHandlingResponseConverter<>())
|
||||
@@ -125,12 +127,15 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
@Override
|
||||
public Observable<ArrayList<Message>> call(MessagesResponse messageResponse) {
|
||||
ArrayList<Message> messages = messageResponse.response.messages;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
mFetchMore = messageResponse.response.hasMorePages;
|
||||
|
||||
return Observable.just(messageResponse.response.messages);
|
||||
}
|
||||
})
|
||||
@@ -204,27 +209,34 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
if (messages == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < messages.size(); i++) {
|
||||
if (!isAttached()) {
|
||||
break;
|
||||
}
|
||||
|
||||
Message message = messages.get(i);
|
||||
mMessages.add(message);
|
||||
|
||||
getView().addOneMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send error messages to view.
|
||||
*/
|
||||
private void fetchNewMessagesError(Throwable throwable) {
|
||||
Log.e("fetchNewMessages", "onError", throwable);
|
||||
|
||||
if (!isAttached()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mSystemUtils.isNetworkUnavailable()) {
|
||||
getView().showError(R.string.error_no_internet_connection);
|
||||
return;
|
||||
}
|
||||
|
||||
getView().showError(R.string.error_something_went_wrong);
|
||||
}
|
||||
|
||||
@@ -300,18 +312,23 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
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,
|
||||
@@ -331,10 +348,13 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
firstMessage.fileDownloaded);
|
||||
storeGroupLocally(mGroupId, message);
|
||||
}
|
||||
|
||||
mPage++;
|
||||
mOffset += LIMIT;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
getView().showEmptyMessage();
|
||||
}
|
||||
|
||||
@@ -342,6 +362,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
if (!isAttached()) {
|
||||
return;
|
||||
}
|
||||
|
||||
mLoading = false;
|
||||
getView().hideLoading();
|
||||
getView().hideMessagesLoading();
|
||||
@@ -356,17 +377,21 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
getView().hideMessagesLoading();
|
||||
return;
|
||||
}
|
||||
|
||||
mLoading = true;
|
||||
|
||||
if (mPage == FIRST_PAGE) {
|
||||
getView().showLoading();
|
||||
} else {
|
||||
getView().showMessagesLoading();
|
||||
}
|
||||
|
||||
if (mSystemUtils.isNetworkUnavailable()) {
|
||||
loadMessagesFromDBByGroupId();
|
||||
getView().showError(R.string.error_no_internet_connection);
|
||||
return;
|
||||
}
|
||||
|
||||
loadMessagesFromServerByGroupId(mGroupId);
|
||||
}
|
||||
|
||||
@@ -496,6 +521,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
getView().fileDownloadedSuccessfully(filePath, FileUtils.getFileTypeFromFilePath(filePath));
|
||||
return;
|
||||
}
|
||||
|
||||
downloadFileFromUrl(message.filePath, filePath, itemPosition)
|
||||
.compose(RxUtils.provideDefaultTransformer())
|
||||
.subscribe(new Subscriber<String>() {
|
||||
@@ -523,10 +549,13 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
if (!isAttached()) {
|
||||
return;
|
||||
}
|
||||
|
||||
getView().stopItemProgress(itemPosition);
|
||||
getView().fileDownloadedSuccessfully(filePath, fileType);
|
||||
|
||||
message.fileDownloaded = true;
|
||||
message.createdAt /= 1000;
|
||||
|
||||
storeMessageLocally(message).subscribe();
|
||||
}
|
||||
});
|
||||
@@ -593,6 +622,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
mChatService.sendMessage(message.groupId, message.message)
|
||||
.compose(RxUtils.provideDefaultTransformer())
|
||||
.flatMap(new ErrorHandlingResponseConverter<>())
|
||||
@@ -642,6 +672,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
true,
|
||||
mUserIdPreference.get(),
|
||||
false);
|
||||
|
||||
storeMessageLocally(message)
|
||||
.subscribe(new Subscriber<Object>() {
|
||||
@Override
|
||||
@@ -654,6 +685,7 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
storeGroupLocally(mGroupId, message);
|
||||
return;
|
||||
}
|
||||
|
||||
checkForEmptyMessageAndHideIt();
|
||||
message.createdAt *= 1000;
|
||||
getView().addOneMessage(message);
|
||||
@@ -675,13 +707,16 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -723,13 +758,17 @@ public class ChatPresenter extends MVPAbstractPresenter<ChatView> implements Cha
|
||||
messageToDelete.id = oldMessageId;
|
||||
messageToDelete.removeFromList(mMessages);
|
||||
mMessages.add(newMessage);
|
||||
|
||||
if (!isAttached()) {
|
||||
mMessageToUpdate.add(new Pair<>(newMessage, oldMessageId));
|
||||
return;
|
||||
}
|
||||
|
||||
getView().lastMessageUpdated(newMessage, oldMessageId);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
mPage = FIRST_PAGE;
|
||||
mOffset = 0;
|
||||
loadMessagesFromDBByGroupId();
|
||||
|
||||
@@ -34,12 +34,14 @@ class GroupChatAdapter extends BaseChatAdapter {
|
||||
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_date, parent, false);
|
||||
return new DateViewHolder(view);
|
||||
}
|
||||
|
||||
ProgressBar progressBar = new ProgressBar(parent.getContext());
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
|
||||
params.gravity = Gravity.CENTER;
|
||||
params.setMargins(0, (int) parent.getContext().getResources().getDimension(R.dimen.messages_progress_top_margin), 0, 0);
|
||||
progressBar.setLayoutParams(params);
|
||||
ViewUtils.setProgressBarColor(progressBar, R.color.colorWhite);
|
||||
|
||||
return new ProgressViewHolder(progressBar);
|
||||
}
|
||||
|
||||
@@ -62,6 +64,7 @@ class GroupChatAdapter extends BaseChatAdapter {
|
||||
final Message rightMessage = mMessages.get(position - mPositionOffset.get(position));
|
||||
MessageViewHolder rightMessageViewHolder = (MessageViewHolder) holder;
|
||||
setGroupMessage(rightMessageViewHolder, rightMessage, position, false);
|
||||
|
||||
if (rightMessage.status == Message.Status.DELIVERED) {
|
||||
rightMessageViewHolder.statusProgressBar.setVisibility(View.GONE);
|
||||
rightMessageViewHolder.statusImageView.setVisibility(View.VISIBLE);
|
||||
@@ -78,6 +81,7 @@ class GroupChatAdapter extends BaseChatAdapter {
|
||||
rightMessageViewHolder.sendingFailedTextView.setVisibility(View.GONE);
|
||||
rightMessageViewHolder.statusImageView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,8 +37,7 @@ class ChatMembersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_member, parent,
|
||||
false);
|
||||
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_chat_member, parent, false);
|
||||
return new ContactViewHolder(view);
|
||||
}
|
||||
|
||||
@@ -47,13 +46,14 @@ class ChatMembersAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||
ContactViewHolder viewHolder = (ContactViewHolder) holder;
|
||||
User user = mUsers.get(position);
|
||||
viewHolder.contactTextView.setText(String.format(Locale.getDefault(), "%s %s", user.firstName, user.lastName));
|
||||
viewHolder.contactTextView.setTextColor(ContextCompat.getColor(viewHolder.contactTextView.getContext(),
|
||||
user.isEmployee ? R.color.colorBlack : R.color.colorHelpGroup));
|
||||
viewHolder.contactTextView.setTextColor(ContextCompat.getColor(viewHolder.contactTextView.getContext(), user.isEmployee ? R.color.colorBlack : R.color.colorHelpGroup));
|
||||
viewHolder.phoneImageView.setVisibility(TextUtils.isEmpty(user.mobile) ? View.GONE : View.VISIBLE);
|
||||
|
||||
if (TextUtils.isEmpty(user.avatar)) {
|
||||
viewHolder.avatarCircleImageView.setImageResource(R.drawable.avatar_list);
|
||||
return;
|
||||
}
|
||||
|
||||
Glide.with(viewHolder.avatarCircleImageView.getContext())
|
||||
.load(user.avatar)
|
||||
.placeholder(R.drawable.avatar)
|
||||
|
||||
@@ -92,6 +92,10 @@ public class LoginPresenter extends MVPAbstractPresenter<LoginView> implements L
|
||||
@Named(AppPrefsConstants.ACCOUNT_NO)
|
||||
StringPreference mAccountNumberPreference;
|
||||
|
||||
@Inject
|
||||
@Named(AppPrefsConstants.LAST_ACCOUNT_NO)
|
||||
StringPreference mLastAccountNumberPreference;
|
||||
|
||||
@Inject
|
||||
@Named(AppPrefsConstants.AVATAR)
|
||||
StringPreference mAvatarPreference;
|
||||
@@ -229,6 +233,14 @@ public class LoginPresenter extends MVPAbstractPresenter<LoginView> implements L
|
||||
* @param user {@code User} the current logged in user.
|
||||
*/
|
||||
private void loginSuccess(User user) {
|
||||
String accountNumber = mAccountNumberPreference.get();
|
||||
String lastAccountNumber = mLastAccountNumberPreference.get();
|
||||
|
||||
if(!accountNumber.equals(lastAccountNumber)) {
|
||||
//deleteData(true);
|
||||
deleteData2();
|
||||
}
|
||||
|
||||
mIsEmployee.set(user.isEmployee);
|
||||
mChatCodePreference.set(mLastVoucher);
|
||||
mLoginTokenPreference.set(user.token);
|
||||
@@ -295,6 +307,8 @@ public class LoginPresenter extends MVPAbstractPresenter<LoginView> implements L
|
||||
*/
|
||||
@Override
|
||||
public void checkTypeAndCustomerId(String customerId, String password, boolean isChecked) {
|
||||
mLastAccountNumberPreference.set(mAccountNumberPreference.get());
|
||||
|
||||
mAccountNumberPreference.set(customerId);
|
||||
mSavePasswordPreference.set(isChecked);
|
||||
|
||||
@@ -529,6 +543,7 @@ public class LoginPresenter extends MVPAbstractPresenter<LoginView> implements L
|
||||
Observable.create(subscriber -> mGlide.clearDiskCache())
|
||||
.subscribeOn(Schedulers.io())
|
||||
.subscribe();
|
||||
|
||||
mGlide.clearMemory();
|
||||
mSharedPreferences.edit().clear().apply();
|
||||
mAccountNumberPreference.deleteFromSecurePreference();
|
||||
@@ -570,6 +585,45 @@ public class LoginPresenter extends MVPAbstractPresenter<LoginView> implements L
|
||||
}
|
||||
}
|
||||
|
||||
private void deleteData2() {
|
||||
// Observable.create(subscriber -> mGlide.clearDiskCache())
|
||||
// .subscribeOn(Schedulers.io())
|
||||
// .subscribe();
|
||||
//
|
||||
// mGlide.clearMemory();
|
||||
|
||||
File dir = mContext.getExternalFilesDir(null);
|
||||
|
||||
if (dir != null) {
|
||||
if (dir.isDirectory()) {
|
||||
String[] children = dir.list();
|
||||
|
||||
for (String aChildren : children) {
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
new File(dir, aChildren).delete();
|
||||
}
|
||||
} else {
|
||||
Log.e("deleteData", dir.getAbsolutePath() + " is not a directory!");
|
||||
}
|
||||
} else {
|
||||
dir = new File(Environment.getExternalStorageDirectory(), "BeWoPlaner");
|
||||
|
||||
if (dir.isDirectory()) {
|
||||
String[] children = dir.list();
|
||||
|
||||
for (String aChildren : children) {
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
new File(dir, aChildren).delete();
|
||||
}
|
||||
} else {
|
||||
Log.e("deleteData", dir.getAbsolutePath() + " is not a directory!");
|
||||
}
|
||||
}
|
||||
|
||||
Realm realm = mRealmProvider.provide();
|
||||
realm.executeTransaction(realm1 -> realm1.deleteAll());
|
||||
}
|
||||
|
||||
private boolean checkPassword(String password) {
|
||||
if (password.length() >= 1) {
|
||||
return true;
|
||||
|
||||
@@ -261,7 +261,6 @@ public class MainActivity extends AppCompatActivity implements MainNavigation, L
|
||||
@SuppressWarnings("unused")
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onInvalidToken(InvalidTokenEvent invalidTokenEvent) {
|
||||
Log.d("INVALID TOKEN", " invalid token event fired");
|
||||
mLoginPresenter.verifyChatCode(this);
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:contentDescription="@null"
|
||||
android:scaleType="centerCrop"
|
||||
tools:src="@drawable/avatar" />
|
||||
|
||||
<RelativeLayout
|
||||
|
||||
Reference in New Issue
Block a user