From d62ba559c25b0edeeef9e79e0e2edf92b695de02 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 4 Mar 2019 16:29:11 +0500 Subject: [PATCH 01/97] Refactoring --- .../preferences/ChannelSettingsFragment.java | 79 +------------------ .../NotificationsSettingsFragment.java | 74 +++++++++-------- 2 files changed, 43 insertions(+), 110 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java b/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java index 621bb39a99..405c737344 100644 --- a/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java @@ -1,99 +1,22 @@ package com.xabber.android.ui.preferences; -import android.app.AlertDialog; import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.content.Context; -import android.content.DialogInterface; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Build; -import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; -import android.preference.PreferenceFragment; import android.preference.RingtonePreference; import android.support.annotation.RequiresApi; import android.support.annotation.StringRes; -import android.widget.Toast; import com.xabber.android.R; -import com.xabber.android.data.SettingsManager; import com.xabber.android.data.notification.MessageNotificationCreator; import com.xabber.android.data.notification.NotificationChannelUtils; -import com.xabber.android.data.notification.custom_notification.CustomNotifyPrefsManager; - -import static com.xabber.android.data.SettingsManager.NOTIFICATION_PREFERENCES; @RequiresApi(api = Build.VERSION_CODES.O) -public class ChannelSettingsFragment extends PreferenceFragment { - - private NotificationManager notificationManager; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - getPreferenceManager().setSharedPreferencesName(NOTIFICATION_PREFERENCES); - addPreferencesFromResource(R.xml.preference_notifications); - notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE); - - Preference resetPreference = getPreferenceScreen().findPreference(getString(R.string.events_reset_key)); - if (resetPreference != null) { - resetPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(R.string.events_reset_alert) - .setPositiveButton(R.string.category_reset, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Toast.makeText(getActivity(), R.string.events_reset_toast, Toast.LENGTH_SHORT).show(); - SettingsManager.resetPreferences(getActivity(), NOTIFICATION_PREFERENCES); - NotificationChannelUtils.resetMessageChannels(notificationManager); - ((NotificationsSettings) getActivity()).restartFragment(); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - builder.create().show(); - return true; - } - }); - } - - Preference removeCustomNotifPreference = getPreferenceScreen() - .findPreference(getString(R.string.events_remove_all_custom_key)); - if (removeCustomNotifPreference != null) { - removeCustomNotifPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(R.string.events_remove_all_custom_summary) - .setPositiveButton(R.string.remove, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Toast.makeText(getActivity(), R.string.events_reset_toast, Toast.LENGTH_SHORT).show(); - CustomNotifyPrefsManager.getInstance().deleteAllNotifyPrefs(notificationManager); - ((NotificationsSettings) getActivity()).restartFragment(); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - builder.create().show(); - return true; - } - }); - } - } +public class ChannelSettingsFragment extends NotificationsSettingsFragment { @Override public void onResume() { diff --git a/xabber/src/main/java/com/xabber/android/ui/preferences/NotificationsSettingsFragment.java b/xabber/src/main/java/com/xabber/android/ui/preferences/NotificationsSettingsFragment.java index fbc7f9e47d..e73f4c036d 100644 --- a/xabber/src/main/java/com/xabber/android/ui/preferences/NotificationsSettingsFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/preferences/NotificationsSettingsFragment.java @@ -5,29 +5,41 @@ import android.app.NotificationManager; import android.content.Context; import android.content.DialogInterface; +import android.os.Build; import android.os.Bundle; import android.preference.Preference; import android.widget.Toast; import com.xabber.android.R; import com.xabber.android.data.SettingsManager; +import com.xabber.android.data.notification.NotificationChannelUtils; import com.xabber.android.data.notification.custom_notification.CustomNotifyPrefsManager; import com.xabber.android.ui.activity.PreferenceSummaryHelperActivity; import static com.xabber.android.data.SettingsManager.NOTIFICATION_PREFERENCES; public class NotificationsSettingsFragment extends android.preference.PreferenceFragment { + + protected NotificationManager notificationManager; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getPreferenceManager().setSharedPreferencesName(NOTIFICATION_PREFERENCES); - addPreferencesFromResource(R.xml.preference_notifications); + notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE); PreferenceSummaryHelperActivity.updateSummary(getPreferenceScreen()); - Preference resetPreference = (Preference) getPreferenceScreen().findPreference(getString(R.string.events_reset_key)); - resetPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + Preference resetPreference = getPreferenceScreen().findPreference(getString(R.string.events_reset_key)); + if (resetPreference != null) setupResetPreferences(resetPreference, notificationManager); + + Preference removeCustomNotifPreference = getPreferenceScreen().findPreference(getString(R.string.events_remove_all_custom_key)); + if (removeCustomNotifPreference != null) setupRemoveCustomNotifPreferences(removeCustomNotifPreference, notificationManager); + } + + protected void setupResetPreferences(Preference preference, final NotificationManager notificationManager) { + preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); @@ -37,6 +49,8 @@ public boolean onPreferenceClick(Preference preference) { public void onClick(DialogInterface dialog, int which) { Toast.makeText(getActivity(), R.string.events_reset_toast, Toast.LENGTH_SHORT).show(); SettingsManager.resetPreferences(getActivity(), NOTIFICATION_PREFERENCES); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + NotificationChannelUtils.resetMessageChannels(notificationManager); ((NotificationsSettings) getActivity()).restartFragment(); } }) @@ -50,35 +64,31 @@ public void onClick(DialogInterface dialog, int which) { return true; } }); + } - Preference removeCustomNotifPreference = getPreferenceScreen() - .findPreference(getString(R.string.events_remove_all_custom_key)); - if (removeCustomNotifPreference != null) { - removeCustomNotifPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(R.string.events_remove_all_custom_summary) - .setPositiveButton(R.string.remove, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - NotificationManager notificationManager = (NotificationManager) - getActivity().getSystemService(Context.NOTIFICATION_SERVICE); - Toast.makeText(getActivity(), R.string.events_reset_toast, Toast.LENGTH_SHORT).show(); - CustomNotifyPrefsManager.getInstance().deleteAllNotifyPrefs(notificationManager); - ((NotificationsSettings) getActivity()).restartFragment(); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - builder.create().show(); - return true; - } - }); - } + protected void setupRemoveCustomNotifPreferences(Preference preference, final NotificationManager notificationManager) { + preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage(R.string.events_remove_all_custom_summary) + .setPositiveButton(R.string.remove, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Toast.makeText(getActivity(), R.string.events_reset_toast, Toast.LENGTH_SHORT).show(); + CustomNotifyPrefsManager.getInstance().deleteAllNotifyPrefs(notificationManager); + ((NotificationsSettings) getActivity()).restartFragment(); + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + return true; + } + }); } } From 58a262fbbe373f6217262c24604d6638dbef255c Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 4 Mar 2019 16:41:35 +0500 Subject: [PATCH 02/97] Fixed java.util.concurrent.RejectedExecutionException on saving message --- .../android/data/message/AbstractChat.java | 26 ++++----- .../message/BackpressureMessageSaver.java | 54 ++++++++++++++++++ .../android/data/message/MessageManager.java | 56 +++++++++---------- 3 files changed, 92 insertions(+), 44 deletions(-) create mode 100644 xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 1c5db16099..375a9fe7fd 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -314,19 +314,19 @@ protected void createAndSaveFileMessage(boolean ui, String uid, Resourcepart res } public void saveMessageItem(boolean ui, final MessageItem messageItem) { - final long startTime = System.currentTimeMillis(); - Realm realm; - if (ui) realm = MessageDatabaseManager.getInstance().getRealmUiThread(); - else realm = MessageDatabaseManager.getInstance().getNewBackgroundRealm(); - - realm.executeTransactionAsync(new Realm.Transaction() { - @Override - public void execute(Realm realm) { - realm.copyToRealm(messageItem); - LogManager.d("REALM", Thread.currentThread().getName() - + " save message item: " + (System.currentTimeMillis() - startTime)); - } - }); + if (ui) BackpressureMessageSaver.getInstance().saveMessageItem(messageItem); + else { + final long startTime = System.currentTimeMillis(); + Realm realm = MessageDatabaseManager.getInstance().getNewBackgroundRealm(); + realm.executeTransactionAsync(new Realm.Transaction() { + @Override + public void execute(Realm realm) { + realm.copyToRealm(messageItem); + LogManager.d("REALM", Thread.currentThread().getName() + + " save message item: " + (System.currentTimeMillis() - startTime)); + } + }); + } } protected MessageItem createMessageItem(Resourcepart resource, String text, ChatAction action, diff --git a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java new file mode 100644 index 0000000000..3c36206136 --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java @@ -0,0 +1,54 @@ +package com.xabber.android.data.message; + +import com.xabber.android.data.database.MessageDatabaseManager; +import com.xabber.android.data.database.messagerealm.MessageItem; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.realm.Realm; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.subjects.PublishSubject; + + +/** Groups messages to save. It is necessary to avoid + * java.util.concurrent.RejectedExecutionException error, + * which can occur if you frequently save messages one at a time in Realm. + * + * Issue in crashlytics: https://www.fabric.io/redsolution/android/apps/com.xabber.android/issues/5c55e9edf8b88c29636f3fd3 + * */ +public class BackpressureMessageSaver { + + private static BackpressureMessageSaver instance; + private PublishSubject subject = PublishSubject.create(); + + public static BackpressureMessageSaver getInstance() { + if (instance == null) { + instance = new BackpressureMessageSaver(); + } + return instance; + } + + public BackpressureMessageSaver() { + subject.buffer(500, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1>() { + @Override + public void call(final List messageItems) { + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + realm.executeTransactionAsync(new Realm.Transaction() { + @Override + public void execute(Realm realm) { + realm.copyToRealm(messageItems); + } + }); + } + }); + } + + public void saveMessageItem(MessageItem messageItem) { + subject.onNext(messageItem); + } + +} diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index 4e1fbba776..ea2a806e3f 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -787,37 +787,31 @@ public void processCarbonsMessage(AccountJid account, final Message message, Car final AbstractChat finalChat = chat; - MessageDatabaseManager.getInstance().getRealmUiThread() - .executeTransactionAsync(new Realm.Transaction() { - @Override - public void execute(Realm realm) { - String text = body; - String uid = UUID.randomUUID().toString(); - RealmList forwardIds = finalChat.parseForwardedMessage(false, message, uid); - String originalStanza = message.toXML().toString(); - String originalFrom = message.getFrom().toString(); - String forwardComment = ForwardManager.parseForwardComment(message); - if (forwardComment != null) text = forwardComment; - - MessageItem newMessageItem = finalChat.createNewMessageItem(text); - newMessageItem.setStanzaId(message.getStanzaId()); - newMessageItem.setSent(true); - newMessageItem.setForwarded(true); - - // forwarding - if (forwardIds != null) newMessageItem.setForwardedIds(forwardIds); - newMessageItem.setOriginalStanza(originalStanza); - newMessageItem.setOriginalFrom(originalFrom); - - // attachments - RealmList attachments = HttpFileUploadManager.parseFileMessage(message); - if (attachments.size() > 0) - newMessageItem.setAttachments(attachments); - - realm.copyToRealm(newMessageItem); - EventBus.getDefault().post(new NewMessageEvent()); - } - }); + String text = body; + String uid = UUID.randomUUID().toString(); + RealmList forwardIds = finalChat.parseForwardedMessage(false, message, uid); + String originalStanza = message.toXML().toString(); + String originalFrom = message.getFrom().toString(); + String forwardComment = ForwardManager.parseForwardComment(message); + if (forwardComment != null) text = forwardComment; + + MessageItem newMessageItem = finalChat.createNewMessageItem(text); + newMessageItem.setStanzaId(message.getStanzaId()); + newMessageItem.setSent(true); + newMessageItem.setForwarded(true); + + // forwarding + if (forwardIds != null) newMessageItem.setForwardedIds(forwardIds); + newMessageItem.setOriginalStanza(originalStanza); + newMessageItem.setOriginalFrom(originalFrom); + + // attachments + RealmList attachments = HttpFileUploadManager.parseFileMessage(message); + if (attachments.size() > 0) + newMessageItem.setAttachments(attachments); + + BackpressureMessageSaver.getInstance().saveMessageItem(newMessageItem); + EventBus.getDefault().post(new NewMessageEvent()); return; } From e1d70d3bbd322bae25ebeb3604919342141e60bf Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 5 Mar 2019 17:12:23 +0500 Subject: [PATCH 03/97] Start work on new message statuses --- .../data/database/MessageDatabaseManager.java | 9 ++++++++- .../database/messagerealm/MessageItem.java | 13 ++++++++++++ .../ui/contactlist/viewobjects/ContactVO.java | 17 ++++++++-------- .../contactlist/viewobjects/ExtContactVO.java | 10 +++++++--- .../ui/adapter/CustomMessageMenuAdapter.java | 5 +++++ .../ui/adapter/chat/OutgoingMessageVH.java | 20 +++++++++---------- .../android/ui/fragment/ChatFragment.java | 2 ++ .../drawable/ic_message_acknowledged_14dp.xml | 2 +- .../drawable/ic_message_delivered_14dp.xml | 2 +- .../res/drawable/ic_message_displayed.xml | 4 ++++ xabber/src/main/res/values/chat_viewer.xml | 1 + 11 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 xabber/src/main/res/drawable/ic_message_displayed.xml diff --git a/xabber/src/main/java/com/xabber/android/data/database/MessageDatabaseManager.java b/xabber/src/main/java/com/xabber/android/data/database/MessageDatabaseManager.java index f43f64a1ba..e5792aa139 100644 --- a/xabber/src/main/java/com/xabber/android/data/database/MessageDatabaseManager.java +++ b/xabber/src/main/java/com/xabber/android/data/database/MessageDatabaseManager.java @@ -31,7 +31,7 @@ public class MessageDatabaseManager { private static final String REALM_MESSAGE_DATABASE_NAME = "xabber.realm"; - static final int REALM_MESSAGE_DATABASE_VERSION = 17; + static final int REALM_MESSAGE_DATABASE_VERSION = 18; private final RealmConfiguration realmConfiguration; private static MessageDatabaseManager instance; @@ -300,6 +300,13 @@ public void migrate(DynamicRealm realm1, long oldVersion, long newVersion) { oldVersion++; } + if (oldVersion == 17) { + schema.get(MessageItem.class.getSimpleName()) + .addField(MessageItem.Fields.DISPLAYED, boolean.class); + + oldVersion++; + } + } }) .build(); diff --git a/xabber/src/main/java/com/xabber/android/data/database/messagerealm/MessageItem.java b/xabber/src/main/java/com/xabber/android/data/database/messagerealm/MessageItem.java index 10f43c8cfb..b9fddff349 100644 --- a/xabber/src/main/java/com/xabber/android/data/database/messagerealm/MessageItem.java +++ b/xabber/src/main/java/com/xabber/android/data/database/messagerealm/MessageItem.java @@ -54,6 +54,7 @@ public static class Fields { public static final String ERROR = "error"; public static final String ERROR_DESCR = "errorDescription"; public static final String DELIVERED = "delivered"; + public static final String DISPLAYED = "displayed"; public static final String SENT = "sent"; public static final String READ = "read"; public static final String STANZA_ID = "stanzaId"; @@ -131,6 +132,10 @@ public static class Fields { * Receipt was received for sent message. */ private boolean delivered; + /** + * Chat marker was received for sent message. + */ + private boolean displayed; /** * Message was sent. */ @@ -336,6 +341,14 @@ public void setDelivered(boolean delivered) { this.delivered = delivered; } + public boolean isDisplayed() { + return displayed; + } + + public void setDisplayed(boolean displayed) { + this.displayed = displayed; + } + public boolean isSent() { return sent; } diff --git a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java index 4304b79ad8..67f0499cd1 100644 --- a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java +++ b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java @@ -197,18 +197,17 @@ public static ContactVO convert(AbstractContact contact, ContactClickListener li messageOwner = lastMessage.getResource().toString(); // message status - if (lastMessage.isForwarded()) { + if (lastMessage.isDisplayed() || lastMessage.isReceivedFromMessageArchive()) { messageStatus = 1; - } else if (lastMessage.isReceivedFromMessageArchive()) { + } else if (lastMessage.isDelivered() || lastMessage.isForwarded()) { messageStatus = 2; - } else if (lastMessage.isError()) { + } else if (lastMessage.isAcknowledged()) { messageStatus = 3; - } else if (!lastMessage.isDelivered()) { - if (lastMessage.isAcknowledged()) { - messageStatus = 4; - } else { - messageStatus = 5; - } + } else if (lastMessage.isError()) { + messageStatus = 4; + } else if (!MessageItem.isUploadFileMessage(lastMessage) && !lastMessage.isSent() + && System.currentTimeMillis() - lastMessage.getTimestamp() > 1000) { + messageStatus = 5; } // forwarded diff --git a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ExtContactVO.java b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ExtContactVO.java index 47ddc972ac..f7a79371ca 100644 --- a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ExtContactVO.java +++ b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ExtContactVO.java @@ -110,14 +110,18 @@ public void bindViewHolder(FlexibleAdapter adapter, ViewHolder viewHolder, int p viewHolder.ivMessageStatus.setVisibility(text.isEmpty() ? View.INVISIBLE : View.VISIBLE); switch (getMessageStatus()) { - case 0: + + case 1: + viewHolder.ivMessageStatus.setImageResource(R.drawable.ic_message_displayed); + break; + case 2: viewHolder.ivMessageStatus.setImageResource(R.drawable.ic_message_delivered_14dp); break; case 3: - viewHolder.ivMessageStatus.setImageResource(R.drawable.ic_message_has_error_14dp); + viewHolder.ivMessageStatus.setImageResource(R.drawable.ic_message_acknowledged_14dp); break; case 4: - viewHolder.ivMessageStatus.setImageResource(R.drawable.ic_message_acknowledged_14dp); + viewHolder.ivMessageStatus.setImageResource(R.drawable.ic_message_has_error_14dp); break; default: viewHolder.ivMessageStatus.setVisibility(View.GONE); diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/CustomMessageMenuAdapter.java b/xabber/src/main/java/com/xabber/android/ui/adapter/CustomMessageMenuAdapter.java index 8160b0b6fc..a3045a75d3 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/CustomMessageMenuAdapter.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/CustomMessageMenuAdapter.java @@ -22,6 +22,7 @@ public class CustomMessageMenuAdapter extends BaseAdapter { public final static String STATUS_ACK = "status_acknowledged"; public final static String STATUS_DELIVERED = "status_delivered"; + public final static String STATUS_DISPLAYED = "status_displayed"; public final static String STATUS_ERROR = "status_error"; public final static String STATUS_FORWARDED = "status_forwarded"; public final static String STATUS_SYNCED = "status_synced"; @@ -75,6 +76,10 @@ public View getView(int position, View convertView, ViewGroup parent) { textView.setText(R.string.message_status_delivered); ivStatus.setImageResource(R.drawable.ic_message_delivered_14dp); break; + case STATUS_DISPLAYED: + textView.setText(R.string.message_status_displayed); + ivStatus.setImageResource(R.drawable.ic_message_displayed); + break; case STATUS_SYNCED: textView.setText(R.string.message_status_synced); ivStatus.setImageResource(R.drawable.ic_message_synced_14dp); diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/OutgoingMessageVH.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/OutgoingMessageVH.java index b5aa1678cb..240e680714 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/OutgoingMessageVH.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/OutgoingMessageVH.java @@ -105,21 +105,21 @@ private void setStatusIcon(MessageItem messageItem) { if (isFileUploadInProgress) progressBar.setVisibility(View.VISIBLE); - int messageIcon = R.drawable.ic_message_delivered_14dp; - if (messageItem.isForwarded()) { - messageIcon = R.drawable.ic_message_forwarded_14dp; - } else if (messageItem.isReceivedFromMessageArchive()) { - messageIcon = R.drawable.ic_message_synced_14dp; + int messageIcon = 0; + + if (messageItem.isDisplayed() || messageItem.isReceivedFromMessageArchive()) { + messageIcon = R.drawable.ic_message_displayed; + } else if (messageItem.isDelivered() || messageItem.isForwarded()) { + messageIcon = R.drawable.ic_message_delivered_14dp; + } else if (messageItem.isAcknowledged()) { + messageIcon = R.drawable.ic_message_acknowledged_14dp; } else if (messageItem.isError()) { messageIcon = R.drawable.ic_message_has_error_14dp; } else if (!isFileUploadInProgress && !messageItem.isSent() && System.currentTimeMillis() - messageItem.getTimestamp() > 1000) { messageIcon = R.drawable.ic_message_not_sent_14dp; - } else if (!messageItem.isDelivered()) { - if (messageItem.isAcknowledged()) - messageIcon = R.drawable.ic_message_acknowledged_14dp; - else statusIcon.setVisibility(View.GONE); } - statusIcon.setImageResource(messageIcon); + if (messageIcon != 0) statusIcon.setImageResource(messageIcon); + else statusIcon.setVisibility(View.INVISIBLE); } } diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 3237d7d02e..c387e54aa6 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -1173,6 +1173,8 @@ public void showCustomMenu(View anchor) { CustomMessageMenu.addMenuItem(menuItems, "action_message_status", CustomMessageMenuAdapter.STATUS_ERROR); } else if (!clickedMessageItem.isSent()) { CustomMessageMenu.addMenuItem(menuItems, "action_message_status", CustomMessageMenuAdapter.STATUS_NOT_SEND); + } else if (clickedMessageItem.isDisplayed()) { + CustomMessageMenu.addMenuItem(menuItems, "action_message_status", CustomMessageMenuAdapter.STATUS_DISPLAYED); } else if (clickedMessageItem.isDelivered()) { CustomMessageMenu.addMenuItem(menuItems, "action_message_status", CustomMessageMenuAdapter.STATUS_DELIVERED); } else if (clickedMessageItem.isAcknowledged()) { diff --git a/xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml b/xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml index edffcca84d..568be17e22 100644 --- a/xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml +++ b/xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml @@ -1,4 +1,4 @@ - + diff --git a/xabber/src/main/res/drawable/ic_message_delivered_14dp.xml b/xabber/src/main/res/drawable/ic_message_delivered_14dp.xml index 020ff956be..edffcca84d 100644 --- a/xabber/src/main/res/drawable/ic_message_delivered_14dp.xml +++ b/xabber/src/main/res/drawable/ic_message_delivered_14dp.xml @@ -1,4 +1,4 @@ - + diff --git a/xabber/src/main/res/drawable/ic_message_displayed.xml b/xabber/src/main/res/drawable/ic_message_displayed.xml new file mode 100644 index 0000000000..020ff956be --- /dev/null +++ b/xabber/src/main/res/drawable/ic_message_displayed.xml @@ -0,0 +1,4 @@ + + + diff --git a/xabber/src/main/res/values/chat_viewer.xml b/xabber/src/main/res/values/chat_viewer.xml index a0a4167d3b..dc6a529d46 100644 --- a/xabber/src/main/res/values/chat_viewer.xml +++ b/xabber/src/main/res/values/chat_viewer.xml @@ -100,6 +100,7 @@ Error description: Sent Delivered + Displayed Received from history Error Sent from another device From 96bf092c632723d4ef379b385cd4b1d5011b1c4a Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 5 Mar 2019 17:27:45 +0500 Subject: [PATCH 04/97] Work on chat markers --- .../com/xabber/android/data/Application.java | 2 + .../chat_markers/ChatMarkerManager.java | 68 +++++++ .../chat_markers/ChatMarkersElements.java | 182 ++++++++++++++++++ .../chat_markers/ChatMarkersState.java | 22 +++ 4 files changed, 274 insertions(+) create mode 100644 xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java create mode 100644 xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkersElements.java create mode 100644 xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkersState.java diff --git a/xabber/src/main/java/com/xabber/android/data/Application.java b/xabber/src/main/java/com/xabber/android/data/Application.java index c2bfdc0be5..6cd0bf4f21 100644 --- a/xabber/src/main/java/com/xabber/android/data/Application.java +++ b/xabber/src/main/java/com/xabber/android/data/Application.java @@ -41,6 +41,7 @@ import com.xabber.android.data.extension.blocking.BlockingManager; import com.xabber.android.data.extension.capability.CapabilitiesManager; import com.xabber.android.data.extension.carbons.CarbonManager; +import com.xabber.android.data.extension.chat_markers.ChatMarkerManager; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager; import com.xabber.android.data.extension.mam.MamManager; @@ -376,6 +377,7 @@ private void addManagers() { addManager(NetworkManager.getInstance()); addManager(ReconnectionManager.getInstance()); addManager(ReceiptManager.getInstance()); + addManager(ChatMarkerManager.getInstance()); addManager(SSNManager.getInstance()); addManager(AttentionManager.getInstance()); addManager(CarbonManager.getInstance()); diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java new file mode 100644 index 0000000000..bfb6bf69e2 --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -0,0 +1,68 @@ +package com.xabber.android.data.extension.chat_markers; + +import com.xabber.android.data.connection.ConnectionItem; +import com.xabber.android.data.connection.listeners.OnPacketListener; +import com.xabber.android.data.database.MessageDatabaseManager; +import com.xabber.android.data.database.messagerealm.MessageItem; +import com.xabber.android.data.entity.UserJid; +import com.xabber.android.data.message.MessageUpdateEvent; + +import org.greenrobot.eventbus.EventBus; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.packet.Stanza; +import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; + +import io.realm.Realm; +import io.realm.RealmResults; + +public class ChatMarkerManager implements OnPacketListener { + + private static ChatMarkerManager instance; + + public static ChatMarkerManager getInstance() { + if (instance == null) instance = new ChatMarkerManager(); + return instance; + } + + @Override + public void onStanza(ConnectionItem connection, Stanza packet) { + if (packet instanceof Message) { + final Message message = (Message) packet; + + if (ChatMarkersElements.MarkableExtension.from(message) != null) { + // markable + } else if (ChatMarkersElements.ReceivedExtension.from(message) != null) { + // received + } else if (ChatMarkersElements.DisplayedExtension.from(message) != null) { + markAsDisplayed(ChatMarkersElements.DisplayedExtension.from(message).getId()); + } else if (ChatMarkersElements.AcknowledgedExtension.from(message) != null) { + // acknowledged + } + } + } + + private void markAsDisplayed(final String messageID) { + // TODO: 05.03.19 optimizations + // if (have subscription) + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + MessageItem first = realm.where(MessageItem.class) + .equalTo(MessageItem.Fields.STANZA_ID, messageID).findFirst(); + + if (first != null) { + UserJid jid = first.getUser(); + RealmResults results = realm.where(MessageItem.class) + .equalTo(MessageItem.Fields.USER, jid.toString()) + .equalTo(MessageItem.Fields.INCOMING, false) + .equalTo(MessageItem.Fields.DISPLAYED, false).findAll(); + + if (results != null) { + realm.beginTransaction(); + for (MessageItem item : results) { + item.setDisplayed(true); + } + realm.commitTransaction(); + EventBus.getDefault().post(new MessageUpdateEvent()); + } + } + } +} diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkersElements.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkersElements.java new file mode 100644 index 0000000000..cceef1a677 --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkersElements.java @@ -0,0 +1,182 @@ +package com.xabber.android.data.extension.chat_markers; + +import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.util.StringUtils; +import org.jivesoftware.smack.util.XmlStringBuilder; + + +public class ChatMarkersElements { + + public static final String NAMESPACE = "urn:xmpp:chat-markers:0"; + + /** + * Markable extension class. + * + * @see XEP-0333: Chat + * Markers + * @author Fernando Ramirez + * + */ + public static final class MarkableExtension implements ExtensionElement { + + public static final MarkableExtension INSTANCE = new MarkableExtension(); + + /** + * markable element. + */ + public static final String ELEMENT = ChatMarkersState.markable.toString(); + + private MarkableExtension() { + } + + @Override + public String getElementName() { + return ELEMENT; + } + + @Override + public String getNamespace() { + return NAMESPACE; + } + + @Override + public CharSequence toXML() { + XmlStringBuilder xml = new XmlStringBuilder(this); + xml.closeEmptyElement(); + return xml; + } + + public static MarkableExtension from(Message message) { + return (MarkableExtension) message.getExtension(ELEMENT, NAMESPACE); + } + } + + protected abstract static class ChatMarkerExtensionWithId implements ExtensionElement { + protected final String id; + + protected ChatMarkerExtensionWithId(String id) { + this.id = StringUtils.requireNotNullOrEmpty(id, "Message ID must not be null"); + } + + /** + * Get the id. + * + * @return the id + */ + public final String getId() { + return id; + } + + @Override + public final XmlStringBuilder toXML() { + XmlStringBuilder xml = new XmlStringBuilder(this); + xml.attribute("id", id); + xml.closeEmptyElement(); + return xml; + } + } + + /** + * Received extension class. + * + * @see XEP-0333: Chat + * Markers + * @author Fernando Ramirez + * + */ + public static class ReceivedExtension extends ChatMarkerExtensionWithId { + + /** + * received element. + */ + public static final String ELEMENT = ChatMarkersState.received.toString(); + + public ReceivedExtension(String id) { + super(id); + } + + @Override + public String getElementName() { + return ELEMENT; + } + + @Override + public String getNamespace() { + return NAMESPACE; + } + + public static ReceivedExtension from(Message message) { + return (ReceivedExtension) message.getExtension(ELEMENT, NAMESPACE); + } + } + + /** + * Displayed extension class. + * + * @see XEP-0333: Chat + * Markers + * @author Fernando Ramirez + * + */ + public static class DisplayedExtension extends ChatMarkerExtensionWithId { + + /** + * displayed element. + */ + public static final String ELEMENT = ChatMarkersState.displayed.toString(); + + public DisplayedExtension(String id) { + super(id); + } + + @Override + public String getElementName() { + return ELEMENT; + } + + @Override + public String getNamespace() { + return NAMESPACE; + } + + public static DisplayedExtension from(Message message) { + return (DisplayedExtension) message.getExtension(ELEMENT, NAMESPACE); + } + } + + /** + * Acknowledged extension class. + * + * @see XEP-0333: Chat + * Markers + * @author Fernando Ramirez + * + */ + public static class AcknowledgedExtension extends ChatMarkerExtensionWithId { + + /** + * acknowledged element. + */ + public static final String ELEMENT = ChatMarkersState.acknowledged.toString(); + + public AcknowledgedExtension(String id) { + super(id); + } + + @Override + public String getElementName() { + return ELEMENT; + } + + @Override + public String getNamespace() { + return NAMESPACE; + } + + public static AcknowledgedExtension from(Message message) { + return (AcknowledgedExtension) message.getExtension(ELEMENT, NAMESPACE); + } + } + +} diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkersState.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkersState.java new file mode 100644 index 0000000000..3fe061e3e0 --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkersState.java @@ -0,0 +1,22 @@ +package com.xabber.android.data.extension.chat_markers; + +public enum ChatMarkersState { + /** + * Indicates that a message can be marked with a Chat Marker and is therefore + * a "markable message". + */ + markable, + /** + * The message has been received by a client. + */ + received, + /** + * The message has been displayed to a user in a active chat and not in a system notification. + */ + displayed, + /** + * The message has been acknowledged by some user interaction e.g. pressing an + * acknowledgement button. + */ + acknowledged +} \ No newline at end of file From 0adcd6a96f095e18d802ddce6cc88a336e24b1ee Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 6 Mar 2019 14:31:39 +0500 Subject: [PATCH 05/97] Fixed sending chat receipts --- .../java/com/xabber/android/data/message/ReceiptManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xabber/src/main/java/com/xabber/android/data/message/ReceiptManager.java b/xabber/src/main/java/com/xabber/android/data/message/ReceiptManager.java index 803c95f1fb..7682657cec 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/ReceiptManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/ReceiptManager.java @@ -108,6 +108,7 @@ public void run() { receipt.addExtension(new DeliveryReceipt(id)); // the key problem is Thread - smack does not keep it in auto reply receipt.setThread(message.getThread()); + receipt.setType(Message.Type.chat); try { StanzaSender.sendStanza(account, receipt); } catch (NetworkException e) { From 6c3f52bd1b7ebe8b22e665df5a08ba88d61b08bb Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 6 Mar 2019 15:52:57 +0500 Subject: [PATCH 06/97] Work on new chat markers --- .../chat_markers/ChatMarkerManager.java | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index bfb6bf69e2..164bbbf64d 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -1,19 +1,25 @@ package com.xabber.android.data.extension.chat_markers; +import com.xabber.android.data.NetworkException; import com.xabber.android.data.connection.ConnectionItem; +import com.xabber.android.data.connection.StanzaSender; import com.xabber.android.data.connection.listeners.OnPacketListener; import com.xabber.android.data.database.MessageDatabaseManager; import com.xabber.android.data.database.messagerealm.MessageItem; +import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.entity.UserJid; +import com.xabber.android.data.log.LogManager; import com.xabber.android.data.message.MessageUpdateEvent; import org.greenrobot.eventbus.EventBus; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Stanza; import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; +import org.jxmpp.jid.Jid; import io.realm.Realm; import io.realm.RealmResults; +import io.realm.Sort; public class ChatMarkerManager implements OnPacketListener { @@ -31,9 +37,12 @@ public void onStanza(ConnectionItem connection, Stanza packet) { if (ChatMarkersElements.MarkableExtension.from(message) != null) { // markable + sendReceived(message, connection.getAccount()); } else if (ChatMarkersElements.ReceivedExtension.from(message) != null) { // received + markAsDelivered(message.getFrom(), ChatMarkersElements.ReceivedExtension.from(message).getId()); } else if (ChatMarkersElements.DisplayedExtension.from(message) != null) { + // displayed markAsDisplayed(ChatMarkersElements.DisplayedExtension.from(message).getId()); } else if (ChatMarkersElements.AcknowledgedExtension.from(message) != null) { // acknowledged @@ -41,6 +50,48 @@ public void onStanza(ConnectionItem connection, Stanza packet) { } } + public void sendDisplayedIfNeed(AccountJid account, UserJid user) { + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + RealmResults results = realm.where(MessageItem.class) + .equalTo(MessageItem.Fields.USER, user.toString()) + .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) + .equalTo(MessageItem.Fields.INCOMING, true) + .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); + MessageItem lastIncomingMessage = results.last(); + if (!lastIncomingMessage.isRead()) { + sendDisplayed(lastIncomingMessage); + realm.beginTransaction(); + lastIncomingMessage.setRead(true); + realm.commitTransaction(); + } + } + + private void sendDisplayed(MessageItem messageItem) { + Message displayed = new Message(messageItem.getUser().getJid()); + displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); + //displayed.setThread(messageItem.getThread()); + displayed.setType(Message.Type.chat); + + try { + StanzaSender.sendStanza(messageItem.getAccount(), displayed); + } catch (NetworkException e) { + LogManager.exception(this, e); + } + } + + private void sendReceived(Message message, AccountJid account) { + Message received = new Message(message.getFrom()); + received.addExtension(new ChatMarkersElements.ReceivedExtension(message.getStanzaId())); + received.setThread(message.getThread()); + received.setType(Message.Type.chat); + + try { + StanzaSender.sendStanza(account, received); + } catch (NetworkException e) { + LogManager.exception(this, e); + } + } + private void markAsDisplayed(final String messageID) { // TODO: 05.03.19 optimizations // if (have subscription) @@ -65,4 +116,17 @@ private void markAsDisplayed(final String messageID) { } } } + + private void markAsDelivered(final Jid toJid, final String stanzaID) { + Realm realm = MessageDatabaseManager.getInstance().getNewBackgroundRealm(); + realm.beginTransaction(); + MessageItem first = realm.where(MessageItem.class) + .equalTo(MessageItem.Fields.STANZA_ID, stanzaID).findFirst(); + if (first != null) { + first.setDelivered(true); + } + realm.commitTransaction(); + realm.close(); + EventBus.getDefault().post(new MessageUpdateEvent()); + } } From a8a6fcc847d9ec3ed81afb0cfc048c71cd9310e5 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 6 Mar 2019 16:17:02 +0500 Subject: [PATCH 07/97] Disable request for delivery receipts --- .../java/com/xabber/android/data/message/ReceiptManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/ReceiptManager.java b/xabber/src/main/java/com/xabber/android/data/message/ReceiptManager.java index 7682657cec..fe2601f2a9 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/ReceiptManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/ReceiptManager.java @@ -69,7 +69,7 @@ private ReceiptManager() { @Override public void connectionCreated(final XMPPConnection connection) { DeliveryReceiptManager.getInstanceFor(connection).addReceiptReceivedListener(ReceiptManager.this); - DeliveryReceiptManager.getInstanceFor(connection).autoAddDeliveryReceiptRequests(); + //DeliveryReceiptManager.getInstanceFor(connection).autoAddDeliveryReceiptRequests(); } }); From eaa77c060602b466224b636f45f77b39454c5f3a Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 6 Mar 2019 16:19:41 +0500 Subject: [PATCH 08/97] Fixed marking messages as delivered --- .../extension/chat_markers/ChatMarkerManager.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 164bbbf64d..c9bad06d0f 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -40,7 +40,7 @@ public void onStanza(ConnectionItem connection, Stanza packet) { sendReceived(message, connection.getAccount()); } else if (ChatMarkersElements.ReceivedExtension.from(message) != null) { // received - markAsDelivered(message.getFrom(), ChatMarkersElements.ReceivedExtension.from(message).getId()); + markAsDelivered(ChatMarkersElements.ReceivedExtension.from(message).getId()); } else if (ChatMarkersElements.DisplayedExtension.from(message) != null) { // displayed markAsDisplayed(ChatMarkersElements.DisplayedExtension.from(message).getId()); @@ -117,16 +117,17 @@ private void markAsDisplayed(final String messageID) { } } - private void markAsDelivered(final Jid toJid, final String stanzaID) { - Realm realm = MessageDatabaseManager.getInstance().getNewBackgroundRealm(); - realm.beginTransaction(); + private void markAsDelivered(final String stanzaID) { + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + MessageItem first = realm.where(MessageItem.class) .equalTo(MessageItem.Fields.STANZA_ID, stanzaID).findFirst(); + if (first != null) { + realm.beginTransaction(); first.setDelivered(true); + realm.commitTransaction(); } - realm.commitTransaction(); - realm.close(); EventBus.getDefault().post(new MessageUpdateEvent()); } } From c7f158fcc7fe5dae7ed1e94ffdd78f41054c5a5b Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 6 Mar 2019 17:18:30 +0500 Subject: [PATCH 09/97] Work on send displayed tag --- .../chat_markers/ChatMarkerManager.java | 1 + .../android/data/message/AbstractChat.java | 4 ++-- .../android/data/message/MessageManager.java | 24 +------------------ .../android/data/message/RegularChat.java | 6 +++++ .../MessageNotificationManager.java | 2 +- .../android/ui/fragment/ChatFragment.java | 2 +- 6 files changed, 12 insertions(+), 27 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index c9bad06d0f..3cc13b1c30 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -61,6 +61,7 @@ public void sendDisplayedIfNeed(AccountJid account, UserJid user) { if (!lastIncomingMessage.isRead()) { sendDisplayed(lastIncomingMessage); realm.beginTransaction(); + // TODO: 06.03.19 отмечать все предыдущие как read? lastIncomingMessage.setRead(true); realm.commitTransaction(); } diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 375a9fe7fd..9fcd8eb8a6 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -422,7 +422,7 @@ protected MessageItem createMessageItem(String uid, Resourcepart resource, Strin // unread message count if (!visible && action == null) { if (incoming && !fromMAM) increaseUnreadMessageCount(); - else resetUnreadMessageCount(); + else resetUnreadMessageCount(false); } // remove notifications if get outgoing message with 2 sec delay @@ -796,7 +796,7 @@ public void increaseUnreadMessageCount() { ChatManager.getInstance().saveOrUpdateChatDataToRealm(this); } - public void resetUnreadMessageCount() { + public void resetUnreadMessageCount(boolean needSentDisplayed) { this.unreadMessageCount = 0; ChatManager.getInstance().saveOrUpdateChatDataToRealm(this); } diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index ea2a806e3f..8819099ae5 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -511,30 +511,8 @@ public void closeChat(AccountJid account, UserJid user) { */ public void setVisibleChat(BaseEntity visibleChat) { AbstractChat chat = getChat(visibleChat.getAccount(), visibleChat.getUser()); - if (chat == null) { + if (chat == null) chat = createChat(visibleChat.getAccount(), visibleChat.getUser()); - } else { - final AccountJid account = chat.getAccount(); - final UserJid user = chat.getUser(); - - MessageDatabaseManager.getInstance() - .getRealmUiThread().executeTransactionAsync(new Realm.Transaction() { - @Override - public void execute(Realm realm) { - RealmResults unreadMessages = realm.where(MessageItem.class) - .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) - .equalTo(MessageItem.Fields.USER, user.toString()) - .equalTo(MessageItem.Fields.READ, false) - .findAll(); - - List unreadMessagesList = new ArrayList<>(unreadMessages); - - for (MessageItem messageItem : unreadMessagesList) { - messageItem.setRead(true); - } - } - }); - } this.visibleChat = chat; } diff --git a/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java b/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java index c9f608588f..c148b0fe2f 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java @@ -25,6 +25,7 @@ import com.xabber.android.data.database.messagerealm.MessageItem; import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.entity.UserJid; +import com.xabber.android.data.extension.chat_markers.ChatMarkerManager; import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager; import com.xabber.android.data.extension.muc.MUCManager; import com.xabber.android.data.extension.otr.OTRManager; @@ -307,4 +308,9 @@ protected void onComplete() { sendMessages(); } + @Override + public void resetUnreadMessageCount(boolean needSentDisplayed) { + super.resetUnreadMessageCount(needSentDisplayed); + if (needSentDisplayed) ChatMarkerManager.getInstance().sendDisplayedIfNeed(account, user); + } } diff --git a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java index 1c02d8cd46..4867f8af65 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java @@ -114,7 +114,7 @@ public void onNotificationMarkedAsRead(int notificationId) { AbstractChat chat = MessageManager.getInstance().getChat( chatNotif.getAccountJid(), chatNotif.getUserJid()); if (chat != null) { - chat.resetUnreadMessageCount(); + chat.resetUnreadMessageCount(true); callUiUpdate(); } } diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index c387e54aa6..5869670678 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -1467,7 +1467,7 @@ private void increaseUnreadMessageCountIfNeed() { private void resetUnreadMessageCount() { AbstractChat chat = getChat(); if (chat != null) { - chat.resetUnreadMessageCount(); + chat.resetUnreadMessageCount(true); updateNewReceivedMessageCounter(0); ((ChatActivity)getActivity()).updateRecentChats(); } From 42e557816f28d503e8bea71749f59a7e00186f4f Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 6 Mar 2019 18:03:12 +0500 Subject: [PATCH 10/97] Added markable tag to outgoing chat messages --- .../chat_markers/ChatMarkerManager.java | 33 +++++++++++- .../EligibleForChatMarkerFilter.java | 50 +++++++++++++++++++ .../filter/ChatMarkersFilter.java | 15 ++++++ 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 xabber/src/main/java/com/xabber/android/data/extension/chat_markers/EligibleForChatMarkerFilter.java create mode 100644 xabber/src/main/java/com/xabber/android/data/extension/chat_markers/filter/ChatMarkersFilter.java diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 3cc13b1c30..5df7c0bf69 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -8,14 +8,23 @@ import com.xabber.android.data.database.messagerealm.MessageItem; import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.entity.UserJid; +import com.xabber.android.data.extension.chat_markers.filter.ChatMarkersFilter; import com.xabber.android.data.log.LogManager; import com.xabber.android.data.message.MessageUpdateEvent; import org.greenrobot.eventbus.EventBus; +import org.jivesoftware.smack.ConnectionCreationListener; +import org.jivesoftware.smack.StanzaListener; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPConnectionRegistry; +import org.jivesoftware.smack.filter.AndFilter; +import org.jivesoftware.smack.filter.MessageTypeFilter; +import org.jivesoftware.smack.filter.MessageWithBodiesFilter; +import org.jivesoftware.smack.filter.NotFilter; +import org.jivesoftware.smack.filter.StanzaFilter; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Stanza; import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; -import org.jxmpp.jid.Jid; import io.realm.Realm; import io.realm.RealmResults; @@ -23,6 +32,13 @@ public class ChatMarkerManager implements OnPacketListener { + private static final StanzaFilter OUTGOING_MESSAGE_FILTER = new AndFilter( + MessageTypeFilter.NORMAL_OR_CHAT, + MessageWithBodiesFilter.INSTANCE, + new NotFilter(ChatMarkersFilter.INSTANCE), + EligibleForChatMarkerFilter.INSTANCE + ); + private static ChatMarkerManager instance; public static ChatMarkerManager getInstance() { @@ -30,6 +46,21 @@ public static ChatMarkerManager getInstance() { return instance; } + public ChatMarkerManager() { + XMPPConnectionRegistry.addConnectionCreationListener(new ConnectionCreationListener() { + @Override + public void connectionCreated(final XMPPConnection connection) { + connection.addPacketInterceptor(new StanzaListener() { + @Override + public void processStanza(Stanza packet) { + Message message = (Message) packet; + message.addExtension(new ChatMarkersElements.MarkableExtension()); + } + }, OUTGOING_MESSAGE_FILTER); + } + }); + } + @Override public void onStanza(ConnectionItem connection, Stanza packet) { if (packet instanceof Message) { diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/EligibleForChatMarkerFilter.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/EligibleForChatMarkerFilter.java new file mode 100644 index 0000000000..cc18070328 --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/EligibleForChatMarkerFilter.java @@ -0,0 +1,50 @@ +package com.xabber.android.data.extension.chat_markers; + +import org.jivesoftware.smack.filter.StanzaExtensionFilter; +import org.jivesoftware.smack.packet.ExtensionElement; +import org.jivesoftware.smack.packet.Stanza; +import org.jivesoftware.smackx.chatstates.ChatState; +import org.jivesoftware.smackx.chatstates.ChatStateManager; + +public final class EligibleForChatMarkerFilter extends StanzaExtensionFilter { + + public static final EligibleForChatMarkerFilter INSTANCE = new EligibleForChatMarkerFilter(ChatStateManager.NAMESPACE); + + private EligibleForChatMarkerFilter(String namespace) { + super(namespace); + } + + /** + * From XEP-0333, Protocol Format: The Chat Marker MUST have an 'id' which is the 'id' of the + * message being marked.
+ * In order to make Chat Markers works together with XEP-0085 as it said in + * 8.5 Interaction with Chat States, only messages with active chat + * state are accepted. + * + * @param message to be analyzed. + * @return true if the message contains a stanza Id. + * @see XEP-0333: Chat Markers + */ + @Override + public boolean accept(Stanza message) { + if (!message.hasStanzaIdSet()) { + return false; + } + + if (super.accept(message)) { + ExtensionElement extension = message.getExtension(ChatStateManager.NAMESPACE); + String chatStateElementName = extension.getElementName(); + + ChatState state; + try { + state = ChatState.valueOf(chatStateElementName); + return (state == ChatState.active); + } + catch (Exception ex) { + return false; + } + } + + return true; + } +} diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/filter/ChatMarkersFilter.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/filter/ChatMarkersFilter.java new file mode 100644 index 0000000000..880bc6d28d --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/filter/ChatMarkersFilter.java @@ -0,0 +1,15 @@ +package com.xabber.android.data.extension.chat_markers.filter; + +import com.xabber.android.data.extension.chat_markers.ChatMarkersElements; + +import org.jivesoftware.smack.filter.StanzaExtensionFilter; +import org.jivesoftware.smack.filter.StanzaFilter; + +public final class ChatMarkersFilter extends StanzaExtensionFilter { + + public static final StanzaFilter INSTANCE = new ChatMarkersFilter(ChatMarkersElements.NAMESPACE); + + private ChatMarkersFilter(String namespace) { + super(namespace); + } +} From 9dc2ebabe5dcb397bf38e30fe17da523d24db283 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 7 Mar 2019 14:58:22 +0500 Subject: [PATCH 11/97] Work on chat markers --- .../chat_markers/ChatMarkerManager.java | 69 ++++++++++++++----- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 5df7c0bf69..bb7f6d3212 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -1,6 +1,8 @@ package com.xabber.android.data.extension.chat_markers; import com.xabber.android.data.NetworkException; +import com.xabber.android.data.account.AccountItem; +import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.connection.ConnectionItem; import com.xabber.android.data.connection.StanzaSender; import com.xabber.android.data.connection.listeners.OnPacketListener; @@ -11,20 +13,29 @@ import com.xabber.android.data.extension.chat_markers.filter.ChatMarkersFilter; import com.xabber.android.data.log.LogManager; import com.xabber.android.data.message.MessageUpdateEvent; +import com.xabber.android.data.roster.RosterManager; import org.greenrobot.eventbus.EventBus; import org.jivesoftware.smack.ConnectionCreationListener; +import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.StanzaListener; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPConnectionRegistry; +import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.filter.AndFilter; import org.jivesoftware.smack.filter.MessageTypeFilter; import org.jivesoftware.smack.filter.MessageWithBodiesFilter; import org.jivesoftware.smack.filter.NotFilter; import org.jivesoftware.smack.filter.StanzaFilter; import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Stanza; import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; +import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; +import org.jivesoftware.smackx.disco.packet.DiscoverInfo; +import org.jxmpp.jid.Jid; + +import java.util.List; import io.realm.Realm; import io.realm.RealmResults; @@ -50,6 +61,7 @@ public ChatMarkerManager() { XMPPConnectionRegistry.addConnectionCreationListener(new ConnectionCreationListener() { @Override public void connectionCreated(final XMPPConnection connection) { + ServiceDiscoveryManager.getInstanceFor(connection).addFeature(ChatMarkersElements.NAMESPACE); connection.addPacketInterceptor(new StanzaListener() { @Override public void processStanza(Stanza packet) { @@ -82,20 +94,45 @@ public void onStanza(ConnectionItem connection, Stanza packet) { } public void sendDisplayedIfNeed(AccountJid account, UserJid user) { - Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); - RealmResults results = realm.where(MessageItem.class) - .equalTo(MessageItem.Fields.USER, user.toString()) - .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) - .equalTo(MessageItem.Fields.INCOMING, true) - .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); - MessageItem lastIncomingMessage = results.last(); - if (!lastIncomingMessage.isRead()) { - sendDisplayed(lastIncomingMessage); - realm.beginTransaction(); - // TODO: 06.03.19 отмечать все предыдущие как read? - lastIncomingMessage.setRead(true); - realm.commitTransaction(); + if (isClientSupportChatMarkers(account, user)) { + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + RealmResults results = realm.where(MessageItem.class) + .equalTo(MessageItem.Fields.USER, user.toString()) + .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) + .equalTo(MessageItem.Fields.INCOMING, true) + .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); + MessageItem lastIncomingMessage = results.last(); + if (!lastIncomingMessage.isRead()) { + sendDisplayed(lastIncomingMessage); + realm.beginTransaction(); + lastIncomingMessage.setRead(true); + realm.commitTransaction(); + } + } + } + + private boolean isClientSupportChatMarkers(AccountJid account, UserJid user) { + AccountItem accountItem = AccountManager.getInstance().getAccount(account); + if (accountItem == null) return false; + + XMPPConnection connection = accountItem.getConnection(); + final List allPresences = RosterManager.getInstance().getPresences(account, user.getJid()); + boolean isChatMarkersSupport = false; + + for (Presence presence : allPresences) { + Jid fromJid = presence.getFrom(); + DiscoverInfo discoverInfo = null; + try { + discoverInfo = ServiceDiscoveryManager.getInstanceFor(connection).discoverInfo(fromJid); + } catch (SmackException.NoResponseException | XMPPException.XMPPErrorException | + SmackException.NotConnectedException | InterruptedException e) { + e.printStackTrace(); + } + + isChatMarkersSupport = discoverInfo != null && discoverInfo.containsFeature(ChatMarkersElements.NAMESPACE); + if (isChatMarkersSupport) break; } + return isChatMarkersSupport; } private void sendDisplayed(MessageItem messageItem) { @@ -125,16 +162,14 @@ private void sendReceived(Message message, AccountJid account) { } private void markAsDisplayed(final String messageID) { - // TODO: 05.03.19 optimizations - // if (have subscription) Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); MessageItem first = realm.where(MessageItem.class) .equalTo(MessageItem.Fields.STANZA_ID, messageID).findFirst(); if (first != null) { - UserJid jid = first.getUser(); RealmResults results = realm.where(MessageItem.class) - .equalTo(MessageItem.Fields.USER, jid.toString()) + .equalTo(MessageItem.Fields.ACCOUNT, first.getAccount().toString()) + .equalTo(MessageItem.Fields.USER, first.getUser().toString()) .equalTo(MessageItem.Fields.INCOMING, false) .equalTo(MessageItem.Fields.DISPLAYED, false).findAll(); From f6f5c469bb3cf2ac8294ccbde835688a1ddb3c56 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 7 Mar 2019 16:06:59 +0500 Subject: [PATCH 12/97] Added backpressure to sending displayed chat markers. --- .../BackpressureDisplayedSender.java | 77 +++++++++++++++++++ .../chat_markers/ChatMarkerManager.java | 18 +---- 2 files changed, 78 insertions(+), 17 deletions(-) create mode 100644 xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java new file mode 100644 index 0000000000..cc069eb86c --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java @@ -0,0 +1,77 @@ +package com.xabber.android.data.extension.chat_markers; + +import com.xabber.android.data.NetworkException; +import com.xabber.android.data.connection.StanzaSender; +import com.xabber.android.data.database.MessageDatabaseManager; +import com.xabber.android.data.database.messagerealm.MessageItem; +import com.xabber.android.data.log.LogManager; +import com.xabber.android.data.roster.AbstractContact; +import com.xabber.android.data.roster.RosterManager; + +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import io.realm.Realm; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.subjects.PublishSubject; + + +/** Groups messages to send displayed. To avoid + * too often sending displayed chat markers. + * */ +public class BackpressureDisplayedSender { + + private static BackpressureDisplayedSender instance; + private Map> queries = new HashMap<>(); + + public static BackpressureDisplayedSender getInstance() { + if (instance == null) { + instance = new BackpressureDisplayedSender(); + } + return instance; + } + + public void sendDisplayedIfNeed(MessageItem messageItem) { + AbstractContact contact = RosterManager.getInstance().getAbstractContact(messageItem.getAccount(), messageItem.getUser()); + PublishSubject subject = queries.get(contact); + if (subject == null) subject = createSubject(contact); + subject.onNext(messageItem); + } + + private PublishSubject createSubject(AbstractContact contact) { + PublishSubject subject = PublishSubject.create(); + subject.debounce(2000, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1() { + @Override + public void call(MessageItem messageItem) { + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + sendDisplayed(messageItem); + realm.beginTransaction(); + messageItem.setRead(true); + realm.commitTransaction(); + } + }); + queries.put(contact, subject); + return subject; + } + + private void sendDisplayed(MessageItem messageItem) { + Message displayed = new Message(messageItem.getUser().getJid()); + displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); + //displayed.setThread(messageItem.getThread()); + displayed.setType(Message.Type.chat); + + try { + StanzaSender.sendStanza(messageItem.getAccount(), displayed); + } catch (NetworkException e) { + LogManager.exception(this, e); + } + } + +} diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index bb7f6d3212..44e671e1e2 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -103,10 +103,7 @@ public void sendDisplayedIfNeed(AccountJid account, UserJid user) { .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); MessageItem lastIncomingMessage = results.last(); if (!lastIncomingMessage.isRead()) { - sendDisplayed(lastIncomingMessage); - realm.beginTransaction(); - lastIncomingMessage.setRead(true); - realm.commitTransaction(); + BackpressureDisplayedSender.getInstance().sendDisplayedIfNeed(lastIncomingMessage); } } } @@ -135,19 +132,6 @@ private boolean isClientSupportChatMarkers(AccountJid account, UserJid user) { return isChatMarkersSupport; } - private void sendDisplayed(MessageItem messageItem) { - Message displayed = new Message(messageItem.getUser().getJid()); - displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); - //displayed.setThread(messageItem.getThread()); - displayed.setType(Message.Type.chat); - - try { - StanzaSender.sendStanza(messageItem.getAccount(), displayed); - } catch (NetworkException e) { - LogManager.exception(this, e); - } - } - private void sendReceived(Message message, AccountJid account) { Message received = new Message(message.getFrom()); received.addExtension(new ChatMarkersElements.ReceivedExtension(message.getStanzaId())); From 9c9e7b23b878c1687ba0568a7244063192c4d809 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 7 Mar 2019 16:17:45 +0500 Subject: [PATCH 13/97] Added sending displayed when received message in open chat --- .../com/xabber/android/data/message/AbstractChat.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 9fcd8eb8a6..eeb6c0bbfa 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -32,6 +32,7 @@ import com.xabber.android.data.entity.BaseEntity; import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.extension.carbons.CarbonManager; +import com.xabber.android.data.extension.chat_markers.ChatMarkerManager; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.file.FileManager; import com.xabber.android.data.extension.forward.ForwardComment; @@ -296,6 +297,9 @@ protected void createAndSaveNewMessage(boolean ui, String uid, Resourcepart reso originalStanza, parentMessageId, originalFrom, forwardIds, fromMUC, fromMAM); saveMessageItem(ui, messageItem); + // TODO: 07.03.19 need replace? + boolean visible = MessageManager.getInstance().isVisibleChat(this); + if (!fromMUC && !fromMAM && incoming && visible) ChatMarkerManager.getInstance().sendDisplayedIfNeed(account, user); EventBus.getDefault().post(new NewMessageEvent()); } @@ -310,6 +314,9 @@ protected void createAndSaveFileMessage(boolean ui, String uid, Resourcepart res originalStanza, parentMessageId, originalFrom, null, fromMUC, fromMAM); saveMessageItem(ui, messageItem); + // TODO: 07.03.19 need replace? + boolean visible = MessageManager.getInstance().isVisibleChat(this); + if (!fromMUC && !fromMAM && incoming && visible) ChatMarkerManager.getInstance().sendDisplayedIfNeed(account, user); EventBus.getDefault().post(new NewMessageEvent()); } @@ -347,7 +354,7 @@ protected MessageItem createMessageItem(String uid, Resourcepart resource, Strin RealmList forwardIds, boolean fromMUC, boolean fromMAM) { final boolean visible = MessageManager.getInstance().isVisibleChat(this); - boolean read = incoming ? visible : true; + boolean read = !incoming; boolean send = incoming; if (action == null && text == null) { throw new IllegalArgumentException(); From 065b6ffa0eeddfee114ebea00faf5370d811cd78 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 7 Mar 2019 16:18:43 +0500 Subject: [PATCH 14/97] Up version to 588 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 334a5513b2..d79df8bbcd 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 587 - versionName '2.6.2(587)' + versionCode 588 + versionName '2.6.3(588)' } lintOptions { From 78440b0488e3488999598735c7cce505fa399124 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 7 Mar 2019 17:33:50 +0500 Subject: [PATCH 15/97] Changes in showing message statuses --- .../xabber/android/ui/adapter/chat/IncomingMessageVH.java | 3 ++- .../java/com/xabber/android/ui/fragment/ChatFragment.java | 6 +----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/IncomingMessageVH.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/IncomingMessageVH.java index 94f31b43c0..e41953c919 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/IncomingMessageVH.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/IncomingMessageVH.java @@ -41,7 +41,8 @@ public void bind(MessageItem messageItem, MessagesAdapter.MessageExtraData extra boolean needTail = extraData.isNeedTail(); // setup ARCHIVED icon - statusIcon.setVisibility(messageItem.isReceivedFromMessageArchive() ? View.VISIBLE : View.GONE); + //statusIcon.setVisibility(messageItem.isReceivedFromMessageArchive() ? View.VISIBLE : View.GONE); + statusIcon.setVisibility(View.GONE); // setup FORWARDED boolean haveForwarded = messageItem.haveForwardedMessages(); diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 5869670678..552ed78c3d 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -1165,11 +1165,7 @@ public void showCustomMenu(View anchor) { CustomMessageMenu.addMenuItem(menuItems, "action_message_show_original_otr", getString(R.string.message_otr_show_original)); } - if (clickedMessageItem.isForwarded()) { - CustomMessageMenu.addMenuItem(menuItems, "action_message_status", CustomMessageMenuAdapter.STATUS_FORWARDED); - } else if (clickedMessageItem.isReceivedFromMessageArchive()) { - CustomMessageMenu.addMenuItem(menuItems, "action_message_status", CustomMessageMenuAdapter.STATUS_SYNCED); - } else if (clickedMessageItem.isError()) { + if (clickedMessageItem.isError()) { CustomMessageMenu.addMenuItem(menuItems, "action_message_status", CustomMessageMenuAdapter.STATUS_ERROR); } else if (!clickedMessageItem.isSent()) { CustomMessageMenu.addMenuItem(menuItems, "action_message_status", CustomMessageMenuAdapter.STATUS_NOT_SEND); From 54f57591e11a78f7e93a921e2e188a14f1b7c931 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 7 Mar 2019 18:22:22 +0500 Subject: [PATCH 16/97] Replaced trim account name with deleting all spaces --- .../java/com/xabber/android/ui/fragment/AccountAddFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/AccountAddFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/AccountAddFragment.java index 3322b697b4..796ec08880 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/AccountAddFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/AccountAddFragment.java @@ -97,7 +97,7 @@ public void addAccount() { AccountJid account; try { account = AccountManager.getInstance().addAccount( - userView.getText().toString().trim(), + userView.getText().toString().replace(" ", ""), passwordView.getText().toString(), "", false, From fb3d8b59883b8df49737b1ca53fbd5ee4f9d4fb2 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 7 Mar 2019 18:33:48 +0500 Subject: [PATCH 17/97] Changed transparency of message status icons --- xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml | 2 +- xabber/src/main/res/layout/item_message.xml | 3 +-- xabber/src/main/res/layout/item_message_noflex.xml | 3 +-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml b/xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml index 568be17e22..65fe1fba3e 100644 --- a/xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml +++ b/xabber/src/main/res/drawable/ic_message_acknowledged_14dp.xml @@ -1,4 +1,4 @@ - + diff --git a/xabber/src/main/res/layout/item_message.xml b/xabber/src/main/res/layout/item_message.xml index 2a87311b40..ef28129cce 100644 --- a/xabber/src/main/res/layout/item_message.xml +++ b/xabber/src/main/res/layout/item_message.xml @@ -131,8 +131,7 @@ android:id="@+id/message_status_icon" android:layout_width="14dp" android:layout_height="14dp" - android:src="@drawable/ic_message_synced_14dp" - android:alpha="0.5"/> + android:src="@drawable/ic_message_synced_14dp" /> + android:src="@drawable/ic_message_synced_14dp" /> Date: Mon, 11 Mar 2019 10:48:08 +0500 Subject: [PATCH 18/97] Fixed crash on click by notification from group chat --- .../android/data/extension/chat_markers/ChatMarkerManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 44e671e1e2..3174446bd4 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -122,7 +122,7 @@ private boolean isClientSupportChatMarkers(AccountJid account, UserJid user) { try { discoverInfo = ServiceDiscoveryManager.getInstanceFor(connection).discoverInfo(fromJid); } catch (SmackException.NoResponseException | XMPPException.XMPPErrorException | - SmackException.NotConnectedException | InterruptedException e) { + SmackException.NotConnectedException | InterruptedException | ClassCastException e) { e.printStackTrace(); } From a146b9a36a1f3af0eb405a60199068f8859cd004 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 11 Mar 2019 15:31:23 +0500 Subject: [PATCH 19/97] GMS 16.0.1 replaced with 15.0.0 to avoid build error --- xabber/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index d79df8bbcd..614562ad42 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -147,7 +147,7 @@ dependencies { implementation 'com.google.android.gms:play-services-safetynet:16.0.0' implementation 'com.facebook.android:facebook-login:4.36.1' implementation 'com.twitter.sdk.android:twitter:3.0.0' - implementation 'com.google.android.gms:play-services-auth:16.0.1' + implementation 'com.google.android.gms:play-services-auth:15.0.0' implementation ('com.google.api-client:google-api-client-android:1.22.0') { exclude module: 'httpclient' } From 3dcfe51eacb672086a7c79ce1b500e2d74fcf100 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 11 Mar 2019 17:57:22 +0500 Subject: [PATCH 20/97] Up version to 589 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 614562ad42..4bc6745bd3 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 588 - versionName '2.6.3(588)' + versionCode 589 + versionName '2.6.3(589)' } lintOptions { From 87218da72db1d7b4df75f05d141648181aa33e9e Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 12 Mar 2019 11:27:16 +0500 Subject: [PATCH 21/97] Added validation to add contact function --- .../android/ui/fragment/ContactAddFragment.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ContactAddFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ContactAddFragment.java index b8b3157269..43705b6fb0 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ContactAddFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ContactAddFragment.java @@ -1,7 +1,6 @@ package com.xabber.android.ui.fragment; import android.app.Activity; -import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; @@ -14,11 +13,11 @@ import com.xabber.android.R; import com.xabber.android.data.Application; -import com.xabber.android.data.log.LogManager; import com.xabber.android.data.NetworkException; import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.entity.UserJid; +import com.xabber.android.data.log.LogManager; import com.xabber.android.data.message.MessageManager; import com.xabber.android.data.roster.PresenceManager; import com.xabber.android.data.roster.RosterManager; @@ -27,6 +26,9 @@ import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPException; +import org.jxmpp.jid.EntityBareJid; +import org.jxmpp.jid.impl.JidCreate; +import org.jxmpp.stringprep.XmppStringprepException; import java.util.Collection; @@ -172,6 +174,7 @@ public void addContact() { } String contactString = userView.getText().toString(); + contactString = contactString.replace(" ", ""); if (TextUtils.isEmpty(contactString)) { Toast.makeText(getActivity(), getString(R.string.EMPTY_USER_NAME), @@ -181,9 +184,11 @@ public void addContact() { UserJid user; try { - user = UserJid.from(contactString); - } catch (UserJid.UserJidCreateException e) { - LogManager.exception(this, e); + EntityBareJid entityFullJid = JidCreate.entityBareFrom(contactString); + user = UserJid.from(entityFullJid); + } catch (XmppStringprepException | UserJid.UserJidCreateException e) { + e.printStackTrace(); + Toast.makeText(getActivity(), getString(R.string.INCORRECT_USER_NAME), Toast.LENGTH_LONG).show(); return; } From a2ecad31c372fb7c57e1635f802aba62c6b2bd4b Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 12 Mar 2019 16:15:19 +0500 Subject: [PATCH 22/97] Fixed ui blocking on adding user to roster --- .../ui/activity/ContactAddActivity.java | 19 +++++- .../ui/fragment/ContactAddFragment.java | 64 +++++++++++++------ ...ty_with_toolbar_progress_and_container.xml | 10 +++ .../layout/toolbar_with_progress_white.xml | 27 ++++++++ 4 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 xabber/src/main/res/layout/activity_with_toolbar_progress_and_container.xml create mode 100644 xabber/src/main/res/layout/toolbar_with_progress_white.xml diff --git a/xabber/src/main/java/com/xabber/android/ui/activity/ContactAddActivity.java b/xabber/src/main/java/com/xabber/android/ui/activity/ContactAddActivity.java index 4f20a70580..3d8a4b425f 100644 --- a/xabber/src/main/java/com/xabber/android/ui/activity/ContactAddActivity.java +++ b/xabber/src/main/java/com/xabber/android/ui/activity/ContactAddActivity.java @@ -21,6 +21,8 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; +import android.widget.ProgressBar; import com.xabber.android.R; import com.xabber.android.data.entity.AccountJid; @@ -33,7 +35,9 @@ public class ContactAddActivity extends ManagedActivity implements ContactAddFragment.Listener { - BarPainter barPainter; + private BarPainter barPainter; + private ProgressBar progressBar; + private Toolbar toolbar; public static Intent createIntent(Context context) { return createIntent(context, null); @@ -59,9 +63,9 @@ private static UserJid getUser(Intent intent) { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_with_toolbar_and_container); + setContentView(R.layout.activity_with_toolbar_progress_and_container); - Toolbar toolbar = ToolbarHelper.setUpDefaultToolbar(this, null, R.drawable.ic_clear_white_24dp); + toolbar = ToolbarHelper.setUpDefaultToolbar(this, null, R.drawable.ic_clear_white_24dp); toolbar.inflateMenu(R.menu.toolbar_add_contact); toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override @@ -70,6 +74,7 @@ public boolean onMenuItemClick(MenuItem item) { } }); + progressBar = findViewById(R.id.toolbarProgress); barPainter = new BarPainter(this, toolbar); barPainter.setDefaultColor(); @@ -112,4 +117,12 @@ public boolean onOptionsItemSelected(MenuItem item) { public void onAccountSelected(AccountJid account) { barPainter.updateWithAccountName(account); } + + @Override + public void showProgress(boolean show) { + if (progressBar != null) { + progressBar.setVisibility(show ? View.VISIBLE : View.GONE); + toolbar.getMenu().findItem(R.id.action_add_contact).setVisible(!show); + } + } } diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ContactAddFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ContactAddFragment.java index 43705b6fb0..2f8a92bb52 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ContactAddFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ContactAddFragment.java @@ -18,7 +18,6 @@ import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.log.LogManager; -import com.xabber.android.data.message.MessageManager; import com.xabber.android.data.roster.PresenceManager; import com.xabber.android.data.roster.RosterManager; import com.xabber.android.ui.adapter.AccountChooseAdapter; @@ -30,6 +29,7 @@ import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.stringprep.XmppStringprepException; +import java.util.ArrayList; import java.util.Collection; public class ContactAddFragment extends GroupEditorFragment @@ -182,7 +182,7 @@ public void addContact() { return ; } - UserJid user; + final UserJid user; try { EntityBareJid entityFullJid = JidCreate.entityBareFrom(contactString); user = UserJid.from(entityFullJid); @@ -194,33 +194,57 @@ public void addContact() { LogManager.i(this, "user: " + user); - AccountJid account = (AccountJid) accountView.getSelectedItem(); + final AccountJid account = (AccountJid) accountView.getSelectedItem(); if (account == null) { Toast.makeText(getActivity(), getString(R.string.EMPTY_ACCOUNT), Toast.LENGTH_LONG).show(); return; } - try { - RosterManager.getInstance().createContact(account, user, - nameView.getText().toString(), getSelected()); - PresenceManager.getInstance().requestSubscription(account, user); - MessageManager.getInstance().openChat(account, user); - } catch (SmackException.NotLoggedInException | SmackException.NotConnectedException e) { - Application.getInstance().onError(R.string.NOT_CONNECTED); - } catch (XMPPException.XMPPErrorException e) { - Application.getInstance().onError(R.string.XMPP_EXCEPTION); - } catch (SmackException.NoResponseException e) { - Application.getInstance().onError(R.string.CONNECTION_FAILED); - } catch (NetworkException e) { - Application.getInstance().onError(e); - } catch (InterruptedException e) { - LogManager.exception(this, e); - } - getActivity().finish(); + listenerActivity.showProgress(true); + final String name = nameView.getText().toString(); + final ArrayList groups = getSelected(); + + Application.getInstance().runInBackgroundUserRequest(new Runnable() { + @Override + public void run() { + try { + RosterManager.getInstance().createContact(account, user, name, groups); + PresenceManager.getInstance().requestSubscription(account, user); + } catch (SmackException.NotLoggedInException | SmackException.NotConnectedException e) { + Application.getInstance().onError(R.string.NOT_CONNECTED); + stopAddContactProcess(false); + } catch (XMPPException.XMPPErrorException e) { + Application.getInstance().onError(R.string.XMPP_EXCEPTION); + stopAddContactProcess(false); + } catch (SmackException.NoResponseException e) { + Application.getInstance().onError(R.string.CONNECTION_FAILED); + stopAddContactProcess(false); + } catch (NetworkException e) { + Application.getInstance().onError(e); + stopAddContactProcess(false); + } catch (InterruptedException e) { + LogManager.exception(this, e); + stopAddContactProcess(false); + } + + stopAddContactProcess(true); + } + }); + } + + private void stopAddContactProcess(final boolean success) { + Application.getInstance().runOnUiThread(new Runnable() { + @Override + public void run() { + listenerActivity.showProgress(false); + if (success) getActivity().finish(); + } + }); } public interface Listener { void onAccountSelected(AccountJid account); + void showProgress(boolean show); } } diff --git a/xabber/src/main/res/layout/activity_with_toolbar_progress_and_container.xml b/xabber/src/main/res/layout/activity_with_toolbar_progress_and_container.xml new file mode 100644 index 0000000000..07f2f6b4a0 --- /dev/null +++ b/xabber/src/main/res/layout/activity_with_toolbar_progress_and_container.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/xabber/src/main/res/layout/toolbar_with_progress_white.xml b/xabber/src/main/res/layout/toolbar_with_progress_white.xml new file mode 100644 index 0000000000..b7dede845c --- /dev/null +++ b/xabber/src/main/res/layout/toolbar_with_progress_white.xml @@ -0,0 +1,27 @@ + + + + + + + From 280d6d39f9b95b382a52c8a5abda6f115cab60c7 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 12 Mar 2019 18:09:35 +0500 Subject: [PATCH 23/97] Up version to 590 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 4bc6745bd3..975d4d898b 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 589 - versionName '2.6.3(589)' + versionCode 590 + versionName '2.6.3(590)' } lintOptions { From 57fbc59b7ed8bcd7f0ba58b885c896b962de9b36 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 13 Mar 2019 12:21:23 +0500 Subject: [PATCH 24/97] Added on error handling to displayed sender and message saver --- .../extension/chat_markers/BackpressureDisplayedSender.java | 5 +++++ .../android/data/message/BackpressureMessageSaver.java | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java index cc069eb86c..2cf83c2767 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java @@ -56,6 +56,11 @@ public void call(MessageItem messageItem) { messageItem.setRead(true); realm.commitTransaction(); } + }, new Action1() { + @Override + public void call(Throwable throwable) { + LogManager.exception(this, throwable); + } }); queries.put(contact, subject); return subject; diff --git a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java index 3c36206136..05304e97ba 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java +++ b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java @@ -2,6 +2,7 @@ import com.xabber.android.data.database.MessageDatabaseManager; import com.xabber.android.data.database.messagerealm.MessageItem; +import com.xabber.android.data.log.LogManager; import java.util.List; import java.util.concurrent.TimeUnit; @@ -44,6 +45,11 @@ public void execute(Realm realm) { } }); } + }, new Action1() { + @Override + public void call(Throwable throwable) { + LogManager.exception(this, throwable); + } }); } From f67ea83b2943347ef14d9e65728a134f6f575a87 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 13 Mar 2019 12:30:19 +0500 Subject: [PATCH 25/97] Fixed crash on handling carbons messages --- .../java/com/xabber/android/data/message/MessageManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index 8819099ae5..0ae8f5a4fb 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -767,7 +767,7 @@ public void processCarbonsMessage(AccountJid account, final Message message, Car String text = body; String uid = UUID.randomUUID().toString(); - RealmList forwardIds = finalChat.parseForwardedMessage(false, message, uid); + RealmList forwardIds = finalChat.parseForwardedMessage(true, message, uid); String originalStanza = message.toXML().toString(); String originalFrom = message.getFrom().toString(); String forwardComment = ForwardManager.parseForwardComment(message); From 22965d5a2f82ad47a22374c6838af223c011f4c9 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 13 Mar 2019 14:27:38 +0500 Subject: [PATCH 26/97] On receiving carbons displayed message remove notification about unread messages --- .../extension/carbons/CarbonCopyListener.java | 4 ++-- .../chat_markers/ChatMarkerManager.java | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/carbons/CarbonCopyListener.java b/xabber/src/main/java/com/xabber/android/data/extension/carbons/CarbonCopyListener.java index 5e9394fa38..cf7814ce1e 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/carbons/CarbonCopyListener.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/carbons/CarbonCopyListener.java @@ -3,7 +3,7 @@ import com.xabber.android.data.Application; import com.xabber.android.data.entity.AccountJid; -import com.xabber.android.data.log.LogManager; +import com.xabber.android.data.extension.chat_markers.ChatMarkerManager; import com.xabber.android.data.message.MessageManager; import org.jivesoftware.smack.packet.Message; @@ -24,11 +24,11 @@ class CarbonCopyListener implements CarbonCopyReceivedListener { @Override public void onCarbonCopyReceived(final CarbonExtension.Direction direction, final Message carbonCopy, Message wrappingMessage) { - LogManager.i(LOG_TAG, "onCarbonCopyReceived " + direction + " " + carbonCopy.getBody()); Application.getInstance().runOnUiThread(new Runnable() { @Override public void run() { MessageManager.getInstance().processCarbonsMessage(account, carbonCopy, direction); + ChatMarkerManager.getInstance().processCarbonsMessage(account, carbonCopy, direction); } }); } diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 3174446bd4..5f9efb75f1 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -12,7 +12,10 @@ import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.extension.chat_markers.filter.ChatMarkersFilter; import com.xabber.android.data.log.LogManager; +import com.xabber.android.data.message.AbstractChat; +import com.xabber.android.data.message.MessageManager; import com.xabber.android.data.message.MessageUpdateEvent; +import com.xabber.android.data.notification.MessageNotificationManager; import com.xabber.android.data.roster.RosterManager; import org.greenrobot.eventbus.EventBus; @@ -30,6 +33,7 @@ import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Stanza; +import org.jivesoftware.smackx.carbons.packet.CarbonExtension; import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jivesoftware.smackx.disco.packet.DiscoverInfo; @@ -108,6 +112,24 @@ public void sendDisplayedIfNeed(AccountJid account, UserJid user) { } } + public void processCarbonsMessage(AccountJid account, final Message message, CarbonExtension.Direction direction) { + if (direction == CarbonExtension.Direction.sent) { + if (ChatMarkersElements.DisplayedExtension.from(message) != null) { + UserJid companion; + try { + companion = UserJid.from(message.getTo()).getBareUserJid(); + } catch (UserJid.UserJidCreateException e) { + return; + } + AbstractChat chat = MessageManager.getInstance().getOrCreateChat(account, companion); + if (chat != null) { + chat.resetUnreadMessageCount(false); + MessageNotificationManager.getInstance().removeChatWithTimer(account, companion); + } + } + } + } + private boolean isClientSupportChatMarkers(AccountJid account, UserJid user) { AccountItem accountItem = AccountManager.getInstance().getAccount(account); if (accountItem == null) return false; From a8ec6c21ad00d844d8dcc4b925f05b76b6ac278d Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 13 Mar 2019 14:54:07 +0500 Subject: [PATCH 27/97] Fixed new message event sending to correct ui refreshing. --- .../java/com/xabber/android/data/message/AbstractChat.java | 5 +++-- .../android/data/message/BackpressureMessageSaver.java | 3 +++ .../java/com/xabber/android/data/message/ForwardManager.java | 2 +- .../java/com/xabber/android/data/message/MessageManager.java | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index eeb6c0bbfa..eab7bb04d5 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -300,7 +300,7 @@ protected void createAndSaveNewMessage(boolean ui, String uid, Resourcepart reso // TODO: 07.03.19 need replace? boolean visible = MessageManager.getInstance().isVisibleChat(this); if (!fromMUC && !fromMAM && incoming && visible) ChatMarkerManager.getInstance().sendDisplayedIfNeed(account, user); - EventBus.getDefault().post(new NewMessageEvent()); + //EventBus.getDefault().post(new NewMessageEvent()); } protected void createAndSaveFileMessage(boolean ui, String uid, Resourcepart resource, String text, final ChatAction action, @@ -317,7 +317,7 @@ protected void createAndSaveFileMessage(boolean ui, String uid, Resourcepart res // TODO: 07.03.19 need replace? boolean visible = MessageManager.getInstance().isVisibleChat(this); if (!fromMUC && !fromMAM && incoming && visible) ChatMarkerManager.getInstance().sendDisplayedIfNeed(account, user); - EventBus.getDefault().post(new NewMessageEvent()); + //EventBus.getDefault().post(new NewMessageEvent()); } public void saveMessageItem(boolean ui, final MessageItem messageItem) { @@ -331,6 +331,7 @@ public void execute(Realm realm) { realm.copyToRealm(messageItem); LogManager.d("REALM", Thread.currentThread().getName() + " save message item: " + (System.currentTimeMillis() - startTime)); + EventBus.getDefault().post(new NewMessageEvent()); } }); } diff --git a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java index 05304e97ba..aeca9fc87b 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java +++ b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java @@ -4,6 +4,8 @@ import com.xabber.android.data.database.messagerealm.MessageItem; import com.xabber.android.data.log.LogManager; +import org.greenrobot.eventbus.EventBus; + import java.util.List; import java.util.concurrent.TimeUnit; @@ -42,6 +44,7 @@ public void call(final List messageItems) { @Override public void execute(Realm realm) { realm.copyToRealm(messageItems); + EventBus.getDefault().post(new NewMessageEvent()); } }); } diff --git a/xabber/src/main/java/com/xabber/android/data/message/ForwardManager.java b/xabber/src/main/java/com/xabber/android/data/message/ForwardManager.java index 6cedcb923c..3b259bd9f9 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/ForwardManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/ForwardManager.java @@ -35,10 +35,10 @@ public static void forwardMessage(List messages, AccountJid account, Use @Override public void execute(Realm realm) { realm.copyToRealm(messageItem); + EventBus.getDefault().post(new NewMessageEvent()); chat.sendMessages(); } }); - EventBus.getDefault().post(new NewMessageEvent()); } public static String parseForwardComment(Stanza packet) { diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index 0ae8f5a4fb..52b13a09fd 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -789,7 +789,7 @@ public void processCarbonsMessage(AccountJid account, final Message message, Car newMessageItem.setAttachments(attachments); BackpressureMessageSaver.getInstance().saveMessageItem(newMessageItem); - EventBus.getDefault().post(new NewMessageEvent()); + //EventBus.getDefault().post(new NewMessageEvent()); return; } From 3a004509c8151c0126eb93f4feda7f11ab20d98a Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 13 Mar 2019 18:29:55 +0500 Subject: [PATCH 28/97] Up version to 591 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 975d4d898b..1278136649 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 590 - versionName '2.6.3(590)' + versionCode 591 + versionName '2.6.3(591)' } lintOptions { From 940961d92aa7708b8f6252f394ffa349df30d262 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 15 Mar 2019 15:42:46 +0500 Subject: [PATCH 29/97] On added service jid to roster Xabber will not create new chat --- .../xabber/android/data/roster/PresenceManager.java | 11 ++++++++++- .../xabber/android/data/xaccount/XMPPAuthManager.java | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/roster/PresenceManager.java b/xabber/src/main/java/com/xabber/android/data/roster/PresenceManager.java index 66b7493e82..bec231daff 100644 --- a/xabber/src/main/java/com/xabber/android/data/roster/PresenceManager.java +++ b/xabber/src/main/java/com/xabber/android/data/roster/PresenceManager.java @@ -116,6 +116,15 @@ public SubscriptionRequest getSubscriptionRequest(AccountJid account, UserJid us * @throws NetworkException */ public void requestSubscription(AccountJid account, UserJid user) throws NetworkException { + requestSubscription(account, user, true); + } + + /** + * Requests subscription to the contact. + * Create chat with new contact if need. + * @throws NetworkException + */ + public void requestSubscription(AccountJid account, UserJid user, boolean createChat) throws NetworkException { Presence packet = new Presence(Presence.Type.subscribe); packet.setTo(user.getJid()); StanzaSender.sendStanza(account, packet); @@ -125,7 +134,7 @@ public void requestSubscription(AccountJid account, UserJid user) throws Network requestedSubscriptions.put(account, set); } set.add(user); - createChatForNewContact(account, user); + if (createChat) createChatForNewContact(account, user); } private void removeRequestedSubscription(AccountJid account, UserJid user) { diff --git a/xabber/src/main/java/com/xabber/android/data/xaccount/XMPPAuthManager.java b/xabber/src/main/java/com/xabber/android/data/xaccount/XMPPAuthManager.java index cccaa4f962..3be199ae28 100644 --- a/xabber/src/main/java/com/xabber/android/data/xaccount/XMPPAuthManager.java +++ b/xabber/src/main/java/com/xabber/android/data/xaccount/XMPPAuthManager.java @@ -179,7 +179,7 @@ private void addContactToRoster(String apiJid, String clientJid) { RosterManager.getInstance().createContact(account, user, "xabber", Collections.EMPTY_LIST); - PresenceManager.getInstance().requestSubscription(account, user); + PresenceManager.getInstance().requestSubscription(account, user, false); } catch (UserJid.UserJidCreateException | XmppStringprepException | InterruptedException | SmackException | NetworkException | XMPPException.XMPPErrorException e) { From c2ec0c3f565f1ab4ef9adb750b45eaee30f2076a Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 15 Mar 2019 15:53:40 +0500 Subject: [PATCH 30/97] Changed reply icon --- xabber/src/main/res/drawable/ic_message_forwarded_14dp.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/xabber/src/main/res/drawable/ic_message_forwarded_14dp.xml b/xabber/src/main/res/drawable/ic_message_forwarded_14dp.xml index 97a5c0b1a9..5dfd1664e1 100644 --- a/xabber/src/main/res/drawable/ic_message_forwarded_14dp.xml +++ b/xabber/src/main/res/drawable/ic_message_forwarded_14dp.xml @@ -1,8 +1,7 @@ - - + \ No newline at end of file From 3fe3479348aade3395191905b22550aa54a0cf70 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 15 Mar 2019 17:06:16 +0500 Subject: [PATCH 31/97] Fixed russian translation --- xabber/src/main/res/values-ru-rRU/preference_editor.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xabber/src/main/res/values-ru-rRU/preference_editor.xml b/xabber/src/main/res/values-ru-rRU/preference_editor.xml index 05681fb45a..83b9235c2e 100644 --- a/xabber/src/main/res/values-ru-rRU/preference_editor.xml +++ b/xabber/src/main/res/values-ru-rRU/preference_editor.xml @@ -142,6 +142,6 @@ Все настройки уведомлений будут установлены в значения по умолчанию Сбросить настройки уведомлений? Настройки были сброшены - Удалить все спецтальные настройки уведомлений + Удалить все специальные настройки уведомлений Все специальные настройки уведомлений (для контактов, групп и аккаунтов) будут удалены From 0b2a1ae18a5b9962a763630f54fb3d4c1bfc6c5b Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 15 Mar 2019 17:53:07 +0500 Subject: [PATCH 32/97] Up version to 592 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 1278136649..81e24a0199 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 591 - versionName '2.6.3(591)' + versionCode 592 + versionName '2.6.3(592)' } lintOptions { From 471da0eaac46c6981f65dfff8a4f535237ea2c0b Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 18 Mar 2019 16:43:42 +0500 Subject: [PATCH 33/97] Fixed bug with terminate observable in backpressure message saver and displayed sender --- .../BackpressureDisplayedSender.java | 4 +- .../message/BackpressureMessageSaver.java | 43 +++++++++++-------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java index 2cf83c2767..f55157b4a4 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java @@ -43,7 +43,7 @@ public void sendDisplayedIfNeed(MessageItem messageItem) { subject.onNext(messageItem); } - private PublishSubject createSubject(AbstractContact contact) { + private PublishSubject createSubject(final AbstractContact contact) { PublishSubject subject = PublishSubject.create(); subject.debounce(2000, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) @@ -60,6 +60,8 @@ public void call(MessageItem messageItem) { @Override public void call(Throwable throwable) { LogManager.exception(this, throwable); + LogManager.d(this, "Exception is thrown. Subject was deleted."); + queries.remove(contact); } }); queries.put(contact, subject); diff --git a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java index aeca9fc87b..7fcd11e411 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java +++ b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java @@ -24,40 +24,49 @@ public class BackpressureMessageSaver { private static BackpressureMessageSaver instance; - private PublishSubject subject = PublishSubject.create(); + private PublishSubject subject; public static BackpressureMessageSaver getInstance() { - if (instance == null) { - instance = new BackpressureMessageSaver(); - } + if (instance == null) instance = new BackpressureMessageSaver(); return instance; } - public BackpressureMessageSaver() { + public void saveMessageItem(MessageItem messageItem) { + subject.onNext(messageItem); + } + + private BackpressureMessageSaver() { + createSubject(); + } + + private void createSubject() { + subject = PublishSubject.create(); subject.buffer(500, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override public void call(final List messageItems) { - Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); - realm.executeTransactionAsync(new Realm.Transaction() { - @Override - public void execute(Realm realm) { - realm.copyToRealm(messageItems); - EventBus.getDefault().post(new NewMessageEvent()); - } - }); + try { + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + realm.executeTransactionAsync(new Realm.Transaction() { + @Override + public void execute(Realm realm) { + realm.copyToRealm(messageItems); + EventBus.getDefault().post(new NewMessageEvent()); + } + }); + } catch (Exception e) { + LogManager.exception(this, e); + } } }, new Action1() { @Override public void call(Throwable throwable) { LogManager.exception(this, throwable); + LogManager.d(this, "Exception is thrown. Created new publish subject."); + createSubject(); } }); } - public void saveMessageItem(MessageItem messageItem) { - subject.onNext(messageItem); - } - } From a0e085dd9488a1d764c1833b2f8e98d4a7bb57f1 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 18 Mar 2019 17:12:10 +0500 Subject: [PATCH 34/97] Set new contact string green in contact list --- .../presentation/ui/contactlist/viewobjects/ContactVO.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java index 67f0499cd1..7a7d7947bc 100644 --- a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java +++ b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java @@ -32,6 +32,7 @@ import com.xabber.android.data.extension.muc.RoomChat; import com.xabber.android.data.filedownload.FileCategory; import com.xabber.android.data.message.AbstractChat; +import com.xabber.android.data.message.ChatAction; import com.xabber.android.data.message.MessageManager; import com.xabber.android.data.message.NotificationState; import com.xabber.android.data.notification.custom_notification.CustomNotifyPrefsManager; @@ -184,6 +185,8 @@ public static ContactVO convert(AbstractContact contact, ContactClickListener li messageText = FileCategory.getCategoryName(category, true) + attachment.getTitle(); } else if (lastMessage.getFilePath() != null) { messageText = new File(lastMessage.getFilePath()).getName(); + } else if (ChatAction.available.toString().equals(lastMessage.getAction())) { + messageText = "" + lastMessage.getText().trim() + ""; } else { messageText = lastMessage.getText().trim(); } From 2ba267c197cc2511561d051b29e5c02869ebea2e Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 18 Mar 2019 18:26:33 +0500 Subject: [PATCH 35/97] Up version to 593 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 81e24a0199..4b95c6b998 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 592 - versionName '2.6.3(592)' + versionCode 593 + versionName '2.6.3(593)' } lintOptions { From e56647e6d56c2d6b3095bc26e5f4e2397a65f6f9 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 19 Mar 2019 16:48:57 +0500 Subject: [PATCH 36/97] Fixed empty transations in Realm --- .../xabber/android/data/message/BackpressureMessageSaver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java index 7fcd11e411..c4382b0591 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java +++ b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java @@ -46,6 +46,7 @@ private void createSubject() { .subscribe(new Action1>() { @Override public void call(final List messageItems) { + if (messageItems == null || messageItems.isEmpty()) return; try { Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); realm.executeTransactionAsync(new Realm.Transaction() { From 377dac7feedc06a5deabfe662758e032296111b2 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 19 Mar 2019 17:18:02 +0500 Subject: [PATCH 37/97] Added summary to chat preference --- xabber/src/main/res/values-ru-rRU/preference_editor.xml | 1 + xabber/src/main/res/values/preference_editor.xml | 1 + xabber/src/main/res/xml/preference_editor.xml | 1 + 3 files changed, 3 insertions(+) diff --git a/xabber/src/main/res/values-ru-rRU/preference_editor.xml b/xabber/src/main/res/values-ru-rRU/preference_editor.xml index 83b9235c2e..1213c39d64 100644 --- a/xabber/src/main/res/values-ru-rRU/preference_editor.xml +++ b/xabber/src/main/res/values-ru-rRU/preference_editor.xml @@ -46,6 +46,7 @@ Отключить графические смайлы Настройки подключения\nНастройки вариантов подключения Список контактов\nНастройки отображения списка контактов + Настройки отображения чата Настройки отладки\nВыберите этот пункт, если хотите помочь разработчикам сделать Xabber ещё лучше Настройки Оповещения\nНастройки вариантов оповещения diff --git a/xabber/src/main/res/values/preference_editor.xml b/xabber/src/main/res/values/preference_editor.xml index a3ab195e00..0a5b8280a2 100644 --- a/xabber/src/main/res/values/preference_editor.xml +++ b/xabber/src/main/res/values/preference_editor.xml @@ -54,6 +54,7 @@ Connection settings\nConnection settings Contact list\nCustomize contact list appearance + Customize chat appearance Debug settings\nSettings to help developers improve Xabber Settings Notifications\nNotification settings diff --git a/xabber/src/main/res/xml/preference_editor.xml b/xabber/src/main/res/xml/preference_editor.xml index c8e5c61282..3efcbf78ca 100644 --- a/xabber/src/main/res/xml/preference_editor.xml +++ b/xabber/src/main/res/xml/preference_editor.xml @@ -25,6 +25,7 @@ /> Date: Tue, 19 Mar 2019 18:27:06 +0500 Subject: [PATCH 38/97] Up version to 594 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 4b95c6b998..6156ab2f73 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 593 - versionName '2.6.3(593)' + versionCode 594 + versionName '2.6.3(594)' } lintOptions { From 8611e3175917d7feb0e7347dea71f343a1af34cb Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 10:38:06 +0500 Subject: [PATCH 39/97] Added onBind callback when message showed in screen --- .../ui/adapter/chat/IncomingMessageVH.java | 22 +++++++++++++++++-- .../ui/adapter/chat/MessagesAdapter.java | 6 +++-- .../ui/adapter/chat/NoFlexIncomingMsgVH.java | 2 +- .../android/ui/fragment/ChatFragment.java | 12 ++++++++-- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/IncomingMessageVH.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/IncomingMessageVH.java index e41953c919..cf9724bfce 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/IncomingMessageVH.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/IncomingMessageVH.java @@ -25,16 +25,22 @@ public class IncomingMessageVH extends FileMessageVH { public ImageView avatar; public ImageView avatarBackground; + private BindListener listener; + + public interface BindListener { + void onBind(MessageItem message); + } IncomingMessageVH(View itemView, MessageClickListener messageListener, MessageLongClickListener longClickListener, - FileListener fileListener, @StyleRes int appearance) { + FileListener fileListener, BindListener listener, @StyleRes int appearance) { super(itemView, messageListener, longClickListener, fileListener, appearance); avatar = itemView.findViewById(R.id.avatar); avatarBackground = itemView.findViewById(R.id.avatarBackground); + this.listener = listener; } - public void bind(MessageItem messageItem, MessagesAdapter.MessageExtraData extraData) { + public void bind(final MessageItem messageItem, MessagesAdapter.MessageExtraData extraData) { super.bind(messageItem, extraData); Context context = extraData.getContext(); @@ -106,6 +112,18 @@ public void bind(MessageItem messageItem, MessagesAdapter.MessageExtraData extra messageBalloon.setVisibility(View.VISIBLE); messageTime.setVisibility(View.VISIBLE); } + + itemView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + if (listener != null) listener.onBind(messageItem); + } + + @Override + public void onViewDetachedFromWindow(View v) { + unsubscribeAll(); + } + }); } private void setUpAvatar(MessageItem messageItem, boolean isMUC, String userName, boolean needTail) { diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java index 842fb01ac2..8733ef5faf 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java @@ -47,6 +47,7 @@ public class MessagesAdapter extends RealmRecyclerViewAdapter messageItems, AbstractChat chat, MessageVH.MessageClickListener messageListener, FileMessageVH.FileListener fileListener, ForwardedAdapter.ForwardListener fwdListener, - Listener listener, AnchorHolder anchorHolder) { + Listener listener, IncomingMessageVH.BindListener bindListener, AnchorHolder anchorHolder) { super(context, messageItems, true); this.context = context; @@ -87,6 +88,7 @@ public MessagesAdapter( this.fwdListener = fwdListener; this.listener = listener; this.anchorHolder = anchorHolder; + this.bindListener = bindListener; account = chat.getAccount(); user = chat.getUser(); @@ -135,7 +137,7 @@ public BasicMessageVH onCreateViewHolder(ViewGroup parent, int viewType) { case VIEW_TYPE_INCOMING_MESSAGE: return new IncomingMessageVH(LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_message_incoming, parent, false), - this, this, this, appearanceStyle); + this, this, this, bindListener, appearanceStyle); case VIEW_TYPE_INCOMING_MESSAGE_NOFLEX: return new NoFlexIncomingMsgVH(LayoutInflater.from(parent.getContext()) diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java index 8723e45230..40aaa19f91 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java @@ -9,7 +9,7 @@ public class NoFlexIncomingMsgVH extends IncomingMessageVH { public NoFlexIncomingMsgVH(View itemView, MessageClickListener messageListener, MessageLongClickListener longClickListener, FileListener fileListener, int appearance) { - super(itemView, messageListener, longClickListener, fileListener, appearance); + super(itemView, messageListener, longClickListener, fileListener, null, appearance); } @Override diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 552ed78c3d..971e779c2e 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -86,6 +86,7 @@ import com.xabber.android.ui.activity.QuestionActivity; import com.xabber.android.ui.adapter.CustomMessageMenuAdapter; import com.xabber.android.ui.adapter.ResourceAdapter; +import com.xabber.android.ui.adapter.chat.IncomingMessageVH; import com.xabber.android.ui.adapter.chat.MessageVH; import com.xabber.android.ui.adapter.chat.MessagesAdapter; import com.xabber.android.ui.color.ColorManager; @@ -122,7 +123,8 @@ public class ChatFragment extends FileInteractionFragment implements PopupMenu.OnMenuItemClickListener, View.OnClickListener, Toolbar.OnMenuItemClickListener, MessageVH.MessageClickListener, MessagesAdapter.Listener, AdapterView.OnItemClickListener, PopupWindow.OnDismissListener, - OnAccountChangedListener, ForwardPanel.OnCloseListener, MessagesAdapter.AnchorHolder { + OnAccountChangedListener, ForwardPanel.OnCloseListener, MessagesAdapter.AnchorHolder, + IncomingMessageVH.BindListener { public static final String ARGUMENT_ACCOUNT = "ARGUMENT_ACCOUNT"; public static final String ARGUMENT_USER = "ARGUMENT_USER"; @@ -399,7 +401,8 @@ public void setChat(AccountJid accountJid, UserJid userJid) { } chatMessageAdapter = new MessagesAdapter(getActivity(), messageItems, abstractChat, - this, this, this, this, this); + this, this, this, this, this, + this); realmRecyclerView.setAdapter(chatMessageAdapter); restoreInputState(); @@ -1433,6 +1436,11 @@ private void updateTopDateIfNeed() { tvTopDate.setText(StringUtils.getDateStringForMessage(message.getTimestamp())); } + @Override + public void onBind(MessageItem message) { + + } + private void showScrollDownButtonIfNeed() { int pastVisibleItems = layoutManager.findLastVisibleItemPosition(); boolean isBottom = pastVisibleItems >= chatMessageAdapter.getItemCount() - 1; From 5cdd29bc94616c5d4f65319570ce118f42f444be Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 13:35:12 +0500 Subject: [PATCH 40/97] Added reading messages by scroll --- .../data/database/MessageDatabaseManager.java | 15 ++++++- .../BackpressureDisplayedSender.java | 23 +++++++++- .../chat_markers/ChatMarkerManager.java | 4 +- .../android/data/message/AbstractChat.java | 9 +++- .../data/message/MessageReadEvent.java | 31 +++++++++++++ .../android/ui/fragment/ChatFragment.java | 44 +++++++++++++++++-- 6 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 xabber/src/main/java/com/xabber/android/data/message/MessageReadEvent.java diff --git a/xabber/src/main/java/com/xabber/android/data/database/MessageDatabaseManager.java b/xabber/src/main/java/com/xabber/android/data/database/MessageDatabaseManager.java index e5792aa139..3575aad815 100644 --- a/xabber/src/main/java/com/xabber/android/data/database/MessageDatabaseManager.java +++ b/xabber/src/main/java/com/xabber/android/data/database/MessageDatabaseManager.java @@ -19,10 +19,12 @@ import java.util.Date; import io.realm.DynamicRealm; +import io.realm.DynamicRealmObject; import io.realm.FieldAttribute; import io.realm.Realm; import io.realm.RealmConfiguration; import io.realm.RealmMigration; +import io.realm.RealmObjectSchema; import io.realm.RealmQuery; import io.realm.RealmResults; import io.realm.RealmSchema; @@ -31,7 +33,7 @@ public class MessageDatabaseManager { private static final String REALM_MESSAGE_DATABASE_NAME = "xabber.realm"; - static final int REALM_MESSAGE_DATABASE_VERSION = 18; + static final int REALM_MESSAGE_DATABASE_VERSION = 19; private final RealmConfiguration realmConfiguration; private static MessageDatabaseManager instance; @@ -307,6 +309,17 @@ public void migrate(DynamicRealm realm1, long oldVersion, long newVersion) { oldVersion++; } + if (oldVersion == 18) { + schema.get(MessageItem.class.getSimpleName()) + .transform(new RealmObjectSchema.Function() { + @Override + public void apply(DynamicRealmObject obj) { + obj.setBoolean(MessageItem.Fields.READ, true); + } + }); + oldVersion++; + } + } }) .build(); diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java index f55157b4a4..3ec6bf6dcc 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java @@ -5,17 +5,22 @@ import com.xabber.android.data.database.MessageDatabaseManager; import com.xabber.android.data.database.messagerealm.MessageItem; import com.xabber.android.data.log.LogManager; +import com.xabber.android.data.message.MessageReadEvent; import com.xabber.android.data.roster.AbstractContact; import com.xabber.android.data.roster.RosterManager; +import org.greenrobot.eventbus.EventBus; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import io.realm.Realm; +import io.realm.RealmResults; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.subjects.PublishSubject; @@ -51,10 +56,17 @@ private PublishSubject createSubject(final AbstractContact contact) @Override public void call(MessageItem messageItem) { Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + RealmResults messages = getPreviousUnreadMessages(realm, messageItem); sendDisplayed(messageItem); realm.beginTransaction(); - messageItem.setRead(true); + List ids = new ArrayList<>(); + for (MessageItem message : messages) { + message.setRead(true); + ids.add(message.getUniqueId()); + } realm.commitTransaction(); + EventBus.getDefault().post(new MessageReadEvent(messageItem.getAccount(), messageItem.getUser(), ids)); + } }, new Action1() { @Override @@ -81,4 +93,13 @@ private void sendDisplayed(MessageItem messageItem) { } } + private RealmResults getPreviousUnreadMessages(Realm realm, MessageItem messageItem) { + return realm.where(MessageItem.class) + .equalTo(MessageItem.Fields.ACCOUNT, messageItem.getAccount().toString()) + .equalTo(MessageItem.Fields.USER, messageItem.getUser().toString()) + .equalTo(MessageItem.Fields.READ, false) + .lessThanOrEqualTo(MessageItem.Fields.TIMESTAMP, messageItem.getTimestamp()) + .findAll(); + } + } diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 5f9efb75f1..97de4df9c5 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -177,7 +177,9 @@ private void markAsDisplayed(final String messageID) { .equalTo(MessageItem.Fields.ACCOUNT, first.getAccount().toString()) .equalTo(MessageItem.Fields.USER, first.getUser().toString()) .equalTo(MessageItem.Fields.INCOMING, false) - .equalTo(MessageItem.Fields.DISPLAYED, false).findAll(); + .equalTo(MessageItem.Fields.DISPLAYED, false) + .lessThanOrEqualTo(MessageItem.Fields.TIMESTAMP, first.getTimestamp()) + .findAll(); if (results != null) { realm.beginTransaction(); diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index eab7bb04d5..6ea6b3dd21 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -796,7 +796,14 @@ public void onChange(RealmResults messageItems) { } public int getUnreadMessageCount() { - return unreadMessageCount; + return (int) MessageDatabaseManager.getInstance().getRealmUiThread().where(MessageItem.class) + .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) + .equalTo(MessageItem.Fields.USER, user.toString()) + .isNull(MessageItem.Fields.PARENT_MESSAGE_ID) + .isNotNull(MessageItem.Fields.TEXT) + .equalTo(MessageItem.Fields.INCOMING, true) + .equalTo(MessageItem.Fields.READ, false) + .count(); } public void increaseUnreadMessageCount() { diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageReadEvent.java b/xabber/src/main/java/com/xabber/android/data/message/MessageReadEvent.java new file mode 100644 index 0000000000..0507419a5c --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageReadEvent.java @@ -0,0 +1,31 @@ +package com.xabber.android.data.message; + +import com.xabber.android.data.entity.AccountJid; +import com.xabber.android.data.entity.UserJid; + +import java.util.List; + +public class MessageReadEvent { + + private AccountJid account; + private UserJid user; + private List ids; + + public MessageReadEvent(AccountJid account, UserJid user, List ids) { + this.account = account; + this.user = user; + this.ids = ids; + } + + public AccountJid getAccount() { + return account; + } + + public UserJid getUser() { + return user; + } + + public List getIds() { + return ids; + } +} diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 971e779c2e..a2489efc75 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -55,6 +55,7 @@ import com.xabber.android.data.extension.attention.AttentionManager; import com.xabber.android.data.extension.capability.CapabilitiesManager; import com.xabber.android.data.extension.capability.ClientInfo; +import com.xabber.android.data.extension.chat_markers.BackpressureDisplayedSender; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager; import com.xabber.android.data.extension.mam.LastHistoryLoadFinishedEvent; @@ -74,6 +75,7 @@ import com.xabber.android.data.message.ClipManager; import com.xabber.android.data.message.ForwardManager; import com.xabber.android.data.message.MessageManager; +import com.xabber.android.data.message.MessageReadEvent; import com.xabber.android.data.message.MessageUpdateEvent; import com.xabber.android.data.message.NewIncomingMessageEvent; import com.xabber.android.data.message.RegularChat; @@ -109,6 +111,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Timer; @@ -189,6 +192,8 @@ public class ChatFragment extends FileInteractionFragment implements PopupMenu.O private ForwardPanel forwardPanel; private List forwardIds = new ArrayList<>(); + private List waitToMarkAsRead = new ArrayList<>(); + public static ChatFragment newInstance(AccountJid account, UserJid user) { ChatFragment fragment = new ChatFragment(); @@ -754,6 +759,13 @@ public void onEvent(AuthAskEvent event) { } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(MessageReadEvent event) { + if (event.getAccount() == getAccount() && event.getUser() == getUser()) { + removeFromWaited(event.getIds()); + } + } + @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); @@ -1438,7 +1450,33 @@ private void updateTopDateIfNeed() { @Override public void onBind(MessageItem message) { + markAsRead(message); + } + + private void markAsRead(MessageItem message) { + if (message != null && message.isValid() && !message.isRead()) { + if (!waitToMarkAsRead.contains(message.getUniqueId())) { + waitToMarkAsRead.add(message.getUniqueId()); + BackpressureDisplayedSender.getInstance().sendDisplayedIfNeed(message); + updateUnread(); + } + } + } + + private void removeFromWaited(List ids) { + for (String id : ids) { + Iterator iterator = waitToMarkAsRead.iterator(); + while (iterator.hasNext()) { + if (iterator.next().equals(id)) iterator.remove(); + } + } + updateUnread(); + } + private void updateUnread() { + AbstractChat chat = getChat(); + if (chat != null) updateNewReceivedMessageCounter( + chat.getUnreadMessageCount() - waitToMarkAsRead.size()); } private void showScrollDownButtonIfNeed() { @@ -1471,9 +1509,9 @@ private void increaseUnreadMessageCountIfNeed() { private void resetUnreadMessageCount() { AbstractChat chat = getChat(); if (chat != null) { - chat.resetUnreadMessageCount(true); - updateNewReceivedMessageCounter(0); - ((ChatActivity)getActivity()).updateRecentChats(); +// chat.resetUnreadMessageCount(true); +// updateNewReceivedMessageCounter(0); +// ((ChatActivity)getActivity()).updateRecentChats(); } } From 3db77d3e156a88f8690f5a36660af59127e6a55a Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 14:03:10 +0500 Subject: [PATCH 41/97] Work on new read messages system --- .../java/com/xabber/android/data/message/AbstractChat.java | 6 ------ .../com/xabber/android/data/message/chat/ChatManager.java | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 6ea6b3dd21..3c653be48c 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -297,9 +297,6 @@ protected void createAndSaveNewMessage(boolean ui, String uid, Resourcepart reso originalStanza, parentMessageId, originalFrom, forwardIds, fromMUC, fromMAM); saveMessageItem(ui, messageItem); - // TODO: 07.03.19 need replace? - boolean visible = MessageManager.getInstance().isVisibleChat(this); - if (!fromMUC && !fromMAM && incoming && visible) ChatMarkerManager.getInstance().sendDisplayedIfNeed(account, user); //EventBus.getDefault().post(new NewMessageEvent()); } @@ -314,9 +311,6 @@ protected void createAndSaveFileMessage(boolean ui, String uid, Resourcepart res originalStanza, parentMessageId, originalFrom, null, fromMUC, fromMAM); saveMessageItem(ui, messageItem); - // TODO: 07.03.19 need replace? - boolean visible = MessageManager.getInstance().isVisibleChat(this); - if (!fromMUC && !fromMAM && incoming && visible) ChatMarkerManager.getInstance().sendDisplayedIfNeed(account, user); //EventBus.getDefault().post(new NewMessageEvent()); } diff --git a/xabber/src/main/java/com/xabber/android/data/message/chat/ChatManager.java b/xabber/src/main/java/com/xabber/android/data/message/chat/ChatManager.java index 2ac2704037..4a3f401eb1 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/chat/ChatManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/chat/ChatManager.java @@ -510,7 +510,7 @@ public void execute(Realm realm) { chatRealm = new ChatDataRealm(accountJid, userJid); chatRealm.setLastPosition(chat.getLastPosition()); - chatRealm.setUnreadCount(chat.getUnreadMessageCount()); + //chatRealm.setUnreadCount(chat.getUnreadMessageCount()); chatRealm.setArchived(chat.isArchived()); NotificationStateRealm notificationStateRealm = chatRealm.getNotificationState(); From 28abce1f0beca49b7b68110278a1fed8755da275 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 14:19:30 +0500 Subject: [PATCH 42/97] Work on new read messages system --- .../data/extension/chat_markers/ChatMarkerManager.java | 7 ++++++- .../java/com/xabber/android/data/message/RegularChat.java | 2 +- .../java/com/xabber/android/ui/fragment/ChatFragment.java | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 97de4df9c5..1310619e3e 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -97,7 +97,7 @@ public void onStanza(ConnectionItem connection, Stanza packet) { } } - public void sendDisplayedIfNeed(AccountJid account, UserJid user) { + public void sendDisplayedAllIfNeed(AccountJid account, UserJid user) { if (isClientSupportChatMarkers(account, user)) { Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); RealmResults results = realm.where(MessageItem.class) @@ -112,6 +112,11 @@ public void sendDisplayedIfNeed(AccountJid account, UserJid user) { } } + public void sendDisplayedIfNeed(MessageItem messageItem) { + if (isClientSupportChatMarkers(messageItem.getAccount(), messageItem.getUser())) + BackpressureDisplayedSender.getInstance().sendDisplayedIfNeed(messageItem); + } + public void processCarbonsMessage(AccountJid account, final Message message, CarbonExtension.Direction direction) { if (direction == CarbonExtension.Direction.sent) { if (ChatMarkersElements.DisplayedExtension.from(message) != null) { diff --git a/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java b/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java index c148b0fe2f..46776495ef 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java @@ -311,6 +311,6 @@ protected void onComplete() { @Override public void resetUnreadMessageCount(boolean needSentDisplayed) { super.resetUnreadMessageCount(needSentDisplayed); - if (needSentDisplayed) ChatMarkerManager.getInstance().sendDisplayedIfNeed(account, user); + if (needSentDisplayed) ChatMarkerManager.getInstance().sendDisplayedAllIfNeed(account, user); } } diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index a2489efc75..726bd9620d 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -55,7 +55,7 @@ import com.xabber.android.data.extension.attention.AttentionManager; import com.xabber.android.data.extension.capability.CapabilitiesManager; import com.xabber.android.data.extension.capability.ClientInfo; -import com.xabber.android.data.extension.chat_markers.BackpressureDisplayedSender; +import com.xabber.android.data.extension.chat_markers.ChatMarkerManager; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager; import com.xabber.android.data.extension.mam.LastHistoryLoadFinishedEvent; @@ -1457,7 +1457,7 @@ private void markAsRead(MessageItem message) { if (message != null && message.isValid() && !message.isRead()) { if (!waitToMarkAsRead.contains(message.getUniqueId())) { waitToMarkAsRead.add(message.getUniqueId()); - BackpressureDisplayedSender.getInstance().sendDisplayedIfNeed(message); + ChatMarkerManager.getInstance().sendDisplayedIfNeed(message); updateUnread(); } } From 098c3906b3849bb2800c31467b51ed57d124fda7 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 15:25:18 +0500 Subject: [PATCH 43/97] Work on new read messages system --- .../BackpressureDisplayedSender.java | 59 +++++++++---------- .../chat_markers/ChatMarkerManager.java | 34 +++++------ .../android/data/message/AbstractChat.java | 36 ++++++----- 3 files changed, 63 insertions(+), 66 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java index 3ec6bf6dcc..a8a205f509 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java @@ -1,7 +1,5 @@ package com.xabber.android.data.extension.chat_markers; -import com.xabber.android.data.NetworkException; -import com.xabber.android.data.connection.StanzaSender; import com.xabber.android.data.database.MessageDatabaseManager; import com.xabber.android.data.database.messagerealm.MessageItem; import com.xabber.android.data.log.LogManager; @@ -10,8 +8,6 @@ import com.xabber.android.data.roster.RosterManager; import org.greenrobot.eventbus.EventBus; -import org.jivesoftware.smack.packet.Message; -import org.jivesoftware.smackx.chat_markers.element.ChatMarkersElements; import java.util.ArrayList; import java.util.HashMap; @@ -32,7 +28,7 @@ public class BackpressureDisplayedSender { private static BackpressureDisplayedSender instance; - private Map> queries = new HashMap<>(); + private Map> queries = new HashMap<>(); public static BackpressureDisplayedSender getInstance() { if (instance == null) { @@ -41,32 +37,34 @@ public static BackpressureDisplayedSender getInstance() { return instance; } - public void sendDisplayedIfNeed(MessageItem messageItem) { + public void markAsRead(MessageItem messageItem, boolean trySendDisplayed) { AbstractContact contact = RosterManager.getInstance().getAbstractContact(messageItem.getAccount(), messageItem.getUser()); - PublishSubject subject = queries.get(contact); + PublishSubject subject = queries.get(contact); if (subject == null) subject = createSubject(contact); - subject.onNext(messageItem); + subject.onNext(new MessageHolder(messageItem, trySendDisplayed)); } - private PublishSubject createSubject(final AbstractContact contact) { - PublishSubject subject = PublishSubject.create(); + private PublishSubject createSubject(final AbstractContact contact) { + PublishSubject subject = PublishSubject.create(); subject.debounce(2000, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1() { + .subscribe(new Action1() { @Override - public void call(MessageItem messageItem) { + public void call(MessageHolder holder) { + MessageItem message = holder.messageItem; + if (holder.trySendDisplayed) + ChatMarkerManager.getInstance().sendDisplayedIfNeed(message); + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); - RealmResults messages = getPreviousUnreadMessages(realm, messageItem); - sendDisplayed(messageItem); + RealmResults messages = getPreviousUnreadMessages(realm, message); realm.beginTransaction(); List ids = new ArrayList<>(); - for (MessageItem message : messages) { - message.setRead(true); - ids.add(message.getUniqueId()); + for (MessageItem mes : messages) { + mes.setRead(true); + ids.add(mes.getUniqueId()); } realm.commitTransaction(); - EventBus.getDefault().post(new MessageReadEvent(messageItem.getAccount(), messageItem.getUser(), ids)); - + EventBus.getDefault().post(new MessageReadEvent(message.getAccount(), message.getUser(), ids)); } }, new Action1() { @Override @@ -80,19 +78,6 @@ public void call(Throwable throwable) { return subject; } - private void sendDisplayed(MessageItem messageItem) { - Message displayed = new Message(messageItem.getUser().getJid()); - displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); - //displayed.setThread(messageItem.getThread()); - displayed.setType(Message.Type.chat); - - try { - StanzaSender.sendStanza(messageItem.getAccount(), displayed); - } catch (NetworkException e) { - LogManager.exception(this, e); - } - } - private RealmResults getPreviousUnreadMessages(Realm realm, MessageItem messageItem) { return realm.where(MessageItem.class) .equalTo(MessageItem.Fields.ACCOUNT, messageItem.getAccount().toString()) @@ -102,4 +87,14 @@ private RealmResults getPreviousUnreadMessages(Realm realm, Message .findAll(); } + private class MessageHolder { + final MessageItem messageItem; + final boolean trySendDisplayed; + + public MessageHolder(MessageItem messageItem, boolean trySendDisplayed) { + this.messageItem = messageItem; + this.trySendDisplayed = trySendDisplayed; + } + } + } diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 1310619e3e..b27cd039d0 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -43,7 +43,6 @@ import io.realm.Realm; import io.realm.RealmResults; -import io.realm.Sort; public class ChatMarkerManager implements OnPacketListener { @@ -97,29 +96,26 @@ public void onStanza(ConnectionItem connection, Stanza packet) { } } - public void sendDisplayedAllIfNeed(AccountJid account, UserJid user) { - if (isClientSupportChatMarkers(account, user)) { - Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); - RealmResults results = realm.where(MessageItem.class) - .equalTo(MessageItem.Fields.USER, user.toString()) - .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) - .equalTo(MessageItem.Fields.INCOMING, true) - .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); - MessageItem lastIncomingMessage = results.last(); - if (!lastIncomingMessage.isRead()) { - BackpressureDisplayedSender.getInstance().sendDisplayedIfNeed(lastIncomingMessage); + public void sendDisplayedIfNeed(MessageItem messageItem) { + if (isClientSupportChatMarkers(messageItem.getAccount(), messageItem.getUser())) { + Message displayed = new Message(messageItem.getUser().getJid()); + displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); + //displayed.setThread(messageItem.getThread()); + displayed.setType(Message.Type.chat); + + try { + StanzaSender.sendStanza(messageItem.getAccount(), displayed); + } catch (NetworkException e) { + LogManager.exception(this, e); } } } - public void sendDisplayedIfNeed(MessageItem messageItem) { - if (isClientSupportChatMarkers(messageItem.getAccount(), messageItem.getUser())) - BackpressureDisplayedSender.getInstance().sendDisplayedIfNeed(messageItem); - } - public void processCarbonsMessage(AccountJid account, final Message message, CarbonExtension.Direction direction) { if (direction == CarbonExtension.Direction.sent) { - if (ChatMarkersElements.DisplayedExtension.from(message) != null) { + ChatMarkersElements.DisplayedExtension extension = + ChatMarkersElements.DisplayedExtension.from(message); + if (extension != null) { UserJid companion; try { companion = UserJid.from(message.getTo()).getBareUserJid(); @@ -128,7 +124,7 @@ public void processCarbonsMessage(AccountJid account, final Message message, Car } AbstractChat chat = MessageManager.getInstance().getOrCreateChat(account, companion); if (chat != null) { - chat.resetUnreadMessageCount(false); + chat.markAsRead(extension.getId(), false); MessageNotificationManager.getInstance().removeChatWithTimer(account, companion); } } diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 3c653be48c..a79de984c4 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -32,7 +32,7 @@ import com.xabber.android.data.entity.BaseEntity; import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.extension.carbons.CarbonManager; -import com.xabber.android.data.extension.chat_markers.ChatMarkerManager; +import com.xabber.android.data.extension.chat_markers.BackpressureDisplayedSender; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.file.FileManager; import com.xabber.android.data.extension.forward.ForwardComment; @@ -421,12 +421,6 @@ protected MessageItem createMessageItem(String uid, Resourcepart resource, Strin if (notify && notifyAboutMessage() && !visible) NotificationManager.getInstance().onMessageNotification(messageItem); - // unread message count - if (!visible && action == null) { - if (incoming && !fromMAM) increaseUnreadMessageCount(); - else resetUnreadMessageCount(false); - } - // remove notifications if get outgoing message with 2 sec delay if (!incoming) { MessageNotificationManager.getInstance().removeChatWithTimer(account, user); @@ -800,18 +794,30 @@ public int getUnreadMessageCount() { .count(); } - public void increaseUnreadMessageCount() { - this.unreadMessageCount++; - ChatManager.getInstance().saveOrUpdateChatDataToRealm(this); + public void markAsRead(String messageId, boolean trySendDisplay) { + MessageItem message = MessageDatabaseManager.getInstance().getRealmUiThread() + .where(MessageItem.class).equalTo(MessageItem.Fields.UNIQUE_ID, messageId).findFirst(); + if (message != null) markAsRead(message, trySendDisplay); } - public void resetUnreadMessageCount(boolean needSentDisplayed) { - this.unreadMessageCount = 0; - ChatManager.getInstance().saveOrUpdateChatDataToRealm(this); + public void markAsRead(MessageItem messageItem, boolean trySendDisplay) { + BackpressureDisplayedSender.getInstance().markAsRead(messageItem, trySendDisplay); } - public void setUnreadMessageCount(int unreadMessageCount) { - this.unreadMessageCount = unreadMessageCount; + public void markAsReadAll(boolean trySendDisplay) { + Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); + RealmResults results = realm.where(MessageItem.class) + .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) + .equalTo(MessageItem.Fields.USER, user.toString()) + .isNull(MessageItem.Fields.PARENT_MESSAGE_ID) + .isNotNull(MessageItem.Fields.TEXT) + .equalTo(MessageItem.Fields.INCOMING, true) + .equalTo(MessageItem.Fields.READ, false) + .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); + if (results != null && !results.isEmpty()) { + MessageItem lastMessage = results.last(); + if (lastMessage != null) markAsRead(lastMessage, trySendDisplay); + } } public boolean isArchived() { From b22b105bab2c8f2223d0064aff7011b2aeac6e16 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 15:28:06 +0500 Subject: [PATCH 44/97] Work on new read messages system --- .../com/xabber/android/data/extension/muc/MUCManager.java | 1 - .../com/xabber/android/data/message/MessageManager.java | 2 -- .../java/com/xabber/android/data/message/RegularChat.java | 6 ------ .../data/notification/MessageNotificationManager.java | 2 +- .../java/com/xabber/android/ui/fragment/ChatFragment.java | 2 +- 5 files changed, 2 insertions(+), 11 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/muc/MUCManager.java b/xabber/src/main/java/com/xabber/android/data/extension/muc/MUCManager.java index a2c103846c..9b563a793b 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/muc/MUCManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/muc/MUCManager.java @@ -116,7 +116,6 @@ public void run() { ChatData chatData = ChatManager.getInstance().loadChatDataFromRealm(roomChat); if (chatData != null) { roomChat.setLastPosition(chatData.getLastPosition()); - roomChat.setUnreadMessageCount(chatData.getUnreadCount()); roomChat.setArchived(chatData.isArchived(), false); roomChat.setNotificationState(chatData.getNotificationState(), false); } diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index 52b13a09fd..a8c53c7ad7 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -202,7 +202,6 @@ private RegularChat createChat(AccountJid account, UserJid user) { ChatData chatData = ChatManager.getInstance().loadChatDataFromRealm(chat); if (chatData != null) { chat.setLastPosition(chatData.getLastPosition()); - chat.setUnreadMessageCount(chatData.getUnreadCount()); chat.setArchived(chatData.isArchived(), false); chat.setNotificationState(chatData.getNotificationState(), false); } @@ -215,7 +214,6 @@ private RegularChat createPrivateMucChat(AccountJid account, FullJid fullJid) th ChatData chatData = ChatManager.getInstance().loadChatDataFromRealm(chat); if (chatData != null) { chat.setLastPosition(chatData.getLastPosition()); - chat.setUnreadMessageCount(chatData.getUnreadCount()); chat.setArchived(chatData.isArchived(), false); chat.setNotificationState(chatData.getNotificationState(), false); } diff --git a/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java b/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java index 46776495ef..05b6d9bcb4 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/RegularChat.java @@ -307,10 +307,4 @@ protected void onComplete() { super.onComplete(); sendMessages(); } - - @Override - public void resetUnreadMessageCount(boolean needSentDisplayed) { - super.resetUnreadMessageCount(needSentDisplayed); - if (needSentDisplayed) ChatMarkerManager.getInstance().sendDisplayedAllIfNeed(account, user); - } } diff --git a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java index 4867f8af65..e17fec2d6d 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java @@ -114,7 +114,7 @@ public void onNotificationMarkedAsRead(int notificationId) { AbstractChat chat = MessageManager.getInstance().getChat( chatNotif.getAccountJid(), chatNotif.getUserJid()); if (chat != null) { - chat.resetUnreadMessageCount(true); + chat.markAsReadAll(true); callUiUpdate(); } } diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 726bd9620d..56b2b41952 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -1501,7 +1501,7 @@ private void hideUnreadMessageCountIfNeed() { private void increaseUnreadMessageCountIfNeed() { AbstractChat chat = getChat(); if (btnScrollDown.getVisibility() == View.VISIBLE && chat != null) { - chat.increaseUnreadMessageCount(); + //chat.increaseUnreadMessageCount(); updateNewReceivedMessageCounter(chat.getUnreadMessageCount()); } } From 03e0b7823e9a2a975d38c840d65d3912d7c80d64 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 15:52:59 +0500 Subject: [PATCH 45/97] Work on new read messages system --- ...isplayedSender.java => BackpressureMessageReader.java} | 8 ++++---- .../data/extension/chat_markers/ChatMarkerManager.java | 4 ++-- .../com/xabber/android/data/message/AbstractChat.java | 4 ++-- .../java/com/xabber/android/ui/fragment/ChatFragment.java | 3 ++- 4 files changed, 10 insertions(+), 9 deletions(-) rename xabber/src/main/java/com/xabber/android/data/extension/chat_markers/{BackpressureDisplayedSender.java => BackpressureMessageReader.java} (94%) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java similarity index 94% rename from xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java rename to xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java index a8a205f509..042de1ff0f 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureDisplayedSender.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java @@ -25,14 +25,14 @@ /** Groups messages to send displayed. To avoid * too often sending displayed chat markers. * */ -public class BackpressureDisplayedSender { +public class BackpressureMessageReader { - private static BackpressureDisplayedSender instance; + private static BackpressureMessageReader instance; private Map> queries = new HashMap<>(); - public static BackpressureDisplayedSender getInstance() { + public static BackpressureMessageReader getInstance() { if (instance == null) { - instance = new BackpressureDisplayedSender(); + instance = new BackpressureMessageReader(); } return instance; } diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index b27cd039d0..56f0c4c373 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -97,7 +97,7 @@ public void onStanza(ConnectionItem connection, Stanza packet) { } public void sendDisplayedIfNeed(MessageItem messageItem) { - if (isClientSupportChatMarkers(messageItem.getAccount(), messageItem.getUser())) { + //if (isClientSupportChatMarkers(messageItem.getAccount(), messageItem.getUser())) { Message displayed = new Message(messageItem.getUser().getJid()); displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); //displayed.setThread(messageItem.getThread()); @@ -108,7 +108,7 @@ public void sendDisplayedIfNeed(MessageItem messageItem) { } catch (NetworkException e) { LogManager.exception(this, e); } - } + //} } public void processCarbonsMessage(AccountJid account, final Message message, CarbonExtension.Direction direction) { diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index a79de984c4..71be045cc3 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -32,7 +32,7 @@ import com.xabber.android.data.entity.BaseEntity; import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.extension.carbons.CarbonManager; -import com.xabber.android.data.extension.chat_markers.BackpressureDisplayedSender; +import com.xabber.android.data.extension.chat_markers.BackpressureMessageReader; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.file.FileManager; import com.xabber.android.data.extension.forward.ForwardComment; @@ -801,7 +801,7 @@ public void markAsRead(String messageId, boolean trySendDisplay) { } public void markAsRead(MessageItem messageItem, boolean trySendDisplay) { - BackpressureDisplayedSender.getInstance().markAsRead(messageItem, trySendDisplay); + BackpressureMessageReader.getInstance().markAsRead(messageItem, trySendDisplay); } public void markAsReadAll(boolean trySendDisplay) { diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 56b2b41952..f9cd296ac9 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -1457,7 +1457,8 @@ private void markAsRead(MessageItem message) { if (message != null && message.isValid() && !message.isRead()) { if (!waitToMarkAsRead.contains(message.getUniqueId())) { waitToMarkAsRead.add(message.getUniqueId()); - ChatMarkerManager.getInstance().sendDisplayedIfNeed(message); + AbstractChat chat = getChat(); + if (chat != null) chat.markAsRead(message, true); updateUnread(); } } From 338f64f7b18972d2382c1c49e2148b30c3f37b37 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 16:13:00 +0500 Subject: [PATCH 46/97] Remove unused code --- .../xabber/android/data/message/AbstractChat.java | 1 - .../com/xabber/android/data/message/ChatData.java | 12 +----------- .../android/data/message/chat/ChatManager.java | 2 -- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 71be045cc3..b10ea1d10b 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -103,7 +103,6 @@ public abstract class AbstractChat extends BaseEntity implements RealmChangeList private String threadId; private int lastPosition; - private int unreadMessageCount; private boolean archived; protected NotificationState notificationState; diff --git a/xabber/src/main/java/com/xabber/android/data/message/ChatData.java b/xabber/src/main/java/com/xabber/android/data/message/ChatData.java index 60e72efce0..de5884abad 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/ChatData.java +++ b/xabber/src/main/java/com/xabber/android/data/message/ChatData.java @@ -9,17 +9,15 @@ public class ChatData { private String subject; private String accountJid; private String userJid; - private int unreadCount; private boolean archived; private NotificationState notificationState; private int lastPosition; - public ChatData(String subject, String accountJid, String userJid, int unreadCount, + public ChatData(String subject, String accountJid, String userJid, boolean archived, NotificationState notificationState, int lastPosition) { this.subject = subject; this.accountJid = accountJid; this.userJid = userJid; - this.unreadCount = unreadCount; this.archived = archived; this.notificationState = notificationState; this.lastPosition = lastPosition; @@ -49,14 +47,6 @@ public void setUserJid(String userJid) { this.userJid = userJid; } - public int getUnreadCount() { - return unreadCount; - } - - public void setUnreadCount(int unreadCount) { - this.unreadCount = unreadCount; - } - public boolean isArchived() { return archived; } diff --git a/xabber/src/main/java/com/xabber/android/data/message/chat/ChatManager.java b/xabber/src/main/java/com/xabber/android/data/message/chat/ChatManager.java index 4a3f401eb1..c7111125ca 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/chat/ChatManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/chat/ChatManager.java @@ -510,7 +510,6 @@ public void execute(Realm realm) { chatRealm = new ChatDataRealm(accountJid, userJid); chatRealm.setLastPosition(chat.getLastPosition()); - //chatRealm.setUnreadCount(chat.getUnreadMessageCount()); chatRealm.setArchived(chat.isArchived()); NotificationStateRealm notificationStateRealm = chatRealm.getNotificationState(); @@ -556,7 +555,6 @@ public ChatData loadChatDataFromRealm(AbstractChat chat) { realmChat.getSubject(), realmChat.getAccountJid(), realmChat.getUserJid(), - realmChat.getUnreadCount(), realmChat.isArchived(), notificationState, realmChat.getLastPosition()); From c1f21b55cb78521df09b9fcd524a4249886e1593 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 16:47:52 +0500 Subject: [PATCH 47/97] Fixed refreshing ui on new message --- .../xabber/android/data/message/BackpressureMessageSaver.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java index c4382b0591..8e07d4e1d3 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java +++ b/xabber/src/main/java/com/xabber/android/data/message/BackpressureMessageSaver.java @@ -53,6 +53,10 @@ public void call(final List messageItems) { @Override public void execute(Realm realm) { realm.copyToRealm(messageItems); + } + }, new Realm.Transaction.OnSuccess() { + @Override + public void onSuccess() { EventBus.getDefault().post(new NewMessageEvent()); } }); From ef521bfaf5ebd89f3e0106324fb83576ef247bc7 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 17:19:00 +0500 Subject: [PATCH 48/97] Work on new read messages system --- .../android/ui/fragment/ChatFragment.java | 66 ++++--------------- 1 file changed, 13 insertions(+), 53 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index f9cd296ac9..7cfe744a84 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -55,7 +55,6 @@ import com.xabber.android.data.extension.attention.AttentionManager; import com.xabber.android.data.extension.capability.CapabilitiesManager; import com.xabber.android.data.extension.capability.ClientInfo; -import com.xabber.android.data.extension.chat_markers.ChatMarkerManager; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager; import com.xabber.android.data.extension.mam.LastHistoryLoadFinishedEvent; @@ -78,6 +77,7 @@ import com.xabber.android.data.message.MessageReadEvent; import com.xabber.android.data.message.MessageUpdateEvent; import com.xabber.android.data.message.NewIncomingMessageEvent; +import com.xabber.android.data.message.NewMessageEvent; import com.xabber.android.data.message.RegularChat; import com.xabber.android.data.message.chat.ChatManager; import com.xabber.android.data.notification.NotificationManager; @@ -346,7 +346,6 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } showScrollDownButtonIfNeed(); - hideUnreadMessageCountIfNeed(); /** Necessary for * @see MessageVH#bind () @@ -747,11 +746,14 @@ public void onEvent(NewIncomingMessageEvent event) { if (event.getAccount().equals(account) && event.getUser().equals(user)) { listener.playIncomingAnimation(); //playIncomingSound(); - increaseUnreadMessageCountIfNeed(); - chatMessageAdapter.setUnreadCount(chatMessageAdapter.getUnreadCount() + 1); } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(NewMessageEvent event) { + updateUnread(); + } + @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(AuthAskEvent event) { if (event.getAccount() == getAccount() && event.getUser() == getUser()) { @@ -873,7 +875,7 @@ private void sendMessage() { private void sendMessage(String text) { MessageManager.getInstance().sendMessage(account, user, text); - hideUnreadMessageBackground(); + showUnreadMessage(0); scrollDown(); } @@ -891,7 +893,6 @@ private void scrollDown() { private void scrollToFirstUnread(int unreadCount) { layoutManager.scrollToPositionWithOffset( chatMessageAdapter.getItemCount() - unreadCount, 200); - showUnreadMessage(unreadCount); } private void updateSecurityButton() { @@ -1317,18 +1318,15 @@ public void saveScrollState() { public void restoreScrollState(boolean fromNotification) { AbstractChat chat = getChat(); - int position; - int unread; if (chat != null) { - position = chat.getLastPosition(); - unread = chat.getUnreadMessageCount(); + int position = chat.getLastPosition(); + int unread = chat.getUnreadMessageCount(); if ((position == 0 || fromNotification) && unread > 0) scrollToFirstUnread(unread); - else if (position > 0) { + else if (position > 0) layoutManager.scrollToPosition(position); - showUnreadMessage(unread); - updateNewReceivedMessageCounter(unread); - } + showUnreadMessage(unread); + updateNewReceivedMessageCounter(unread); } } @@ -1486,36 +1484,9 @@ private void showScrollDownButtonIfNeed() { if (isBottom) { btnScrollDown.setVisibility(View.GONE); - hideUnreadMessageBackground(); } else btnScrollDown.setVisibility(View.VISIBLE); } - private void hideUnreadMessageCountIfNeed() { - AbstractChat chat = getChat(); - if (chat == null) return; - int pastVisibleItems = layoutManager.findLastVisibleItemPosition(); - if (pastVisibleItems >= chatMessageAdapter.getItemCount() - chat.getUnreadMessageCount()) { - resetUnreadMessageCount(); - } - } - - private void increaseUnreadMessageCountIfNeed() { - AbstractChat chat = getChat(); - if (btnScrollDown.getVisibility() == View.VISIBLE && chat != null) { - //chat.increaseUnreadMessageCount(); - updateNewReceivedMessageCounter(chat.getUnreadMessageCount()); - } - } - - private void resetUnreadMessageCount() { - AbstractChat chat = getChat(); - if (chat != null) { -// chat.resetUnreadMessageCount(true); -// updateNewReceivedMessageCounter(0); -// ((ChatActivity)getActivity()).updateRecentChats(); - } - } - private void updateNewReceivedMessageCounter(int count) { tvNewReceivedCount.setText(String.valueOf(count)); if (count > 0) @@ -1528,17 +1499,6 @@ private void showUnreadMessage(int count) { chatMessageAdapter.notifyDataSetChanged(); } - private void hideUnreadMessageBackground() { - if (chatMessageAdapter.setUnreadCount(0)) { - realmRecyclerView.post(new Runnable() { - @Override - public void run() { - chatMessageAdapter.notifyDataSetChanged(); - } - }); - } - } - private void closeInteractionPanel() { chatMessageAdapter.resetCheckedItems(); setUpInputViewButtons(); @@ -1585,7 +1545,7 @@ private void showForwardPanel(List forwardIds) { private void sendForwardMessage(List messages, String text) { ForwardManager.forwardMessage(messages, account, user, text); hideForwardPanel(); - hideUnreadMessageBackground(); + showUnreadMessage(0); scrollDown(); } From b49e016824b6539c8b0b426e6704d2a27a6ee2d8 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 21 Mar 2019 18:50:27 +0500 Subject: [PATCH 49/97] Work on new read messages system --- .../BackpressureMessageReader.java | 9 ++-- .../android/data/message/AbstractChat.java | 31 +++++++++++--- .../data/message/MessageReadEvent.java | 31 -------------- .../android/ui/fragment/ChatFragment.java | 41 ++++--------------- 4 files changed, 38 insertions(+), 74 deletions(-) delete mode 100644 xabber/src/main/java/com/xabber/android/data/message/MessageReadEvent.java diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java index 042de1ff0f..a84b49fe38 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java @@ -3,12 +3,11 @@ import com.xabber.android.data.database.MessageDatabaseManager; import com.xabber.android.data.database.messagerealm.MessageItem; import com.xabber.android.data.log.LogManager; -import com.xabber.android.data.message.MessageReadEvent; +import com.xabber.android.data.message.AbstractChat; +import com.xabber.android.data.message.MessageManager; import com.xabber.android.data.roster.AbstractContact; import com.xabber.android.data.roster.RosterManager; -import org.greenrobot.eventbus.EventBus; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -64,7 +63,9 @@ public void call(MessageHolder holder) { ids.add(mes.getUniqueId()); } realm.commitTransaction(); - EventBus.getDefault().post(new MessageReadEvent(message.getAccount(), message.getUser(), ids)); + + AbstractChat chat = MessageManager.getInstance().getOrCreateChat(message.getAccount(), message.getUser()); + if (chat != null) chat.approveRead(ids); } }, new Action1() { @Override diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index b10ea1d10b..8105f8fa98 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -62,7 +62,9 @@ import java.io.File; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -106,6 +108,8 @@ public abstract class AbstractChat extends BaseEntity implements RealmChangeList private boolean archived; protected NotificationState notificationState; + private Set waitToMarkAsRead = new HashSet<>(); + private boolean isPrivateMucChat; private boolean isPrivateMucChatAccepted; @@ -783,24 +787,33 @@ public void onChange(RealmResults messageItems) { } public int getUnreadMessageCount() { - return (int) MessageDatabaseManager.getInstance().getRealmUiThread().where(MessageItem.class) + int unread = ((int) MessageDatabaseManager.getInstance().getRealmUiThread().where(MessageItem.class) .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) .equalTo(MessageItem.Fields.USER, user.toString()) .isNull(MessageItem.Fields.PARENT_MESSAGE_ID) .isNotNull(MessageItem.Fields.TEXT) .equalTo(MessageItem.Fields.INCOMING, true) .equalTo(MessageItem.Fields.READ, false) - .count(); + .count()) - waitToMarkAsRead.size(); + if (unread < 0) unread = 0; + return unread; + } + + public void approveRead(List ids) { + for (String id : ids) { + waitToMarkAsRead.remove(id); + } } public void markAsRead(String messageId, boolean trySendDisplay) { MessageItem message = MessageDatabaseManager.getInstance().getRealmUiThread() .where(MessageItem.class).equalTo(MessageItem.Fields.UNIQUE_ID, messageId).findFirst(); - if (message != null) markAsRead(message, trySendDisplay); + if (message != null) executeRead(message, trySendDisplay); } public void markAsRead(MessageItem messageItem, boolean trySendDisplay) { - BackpressureMessageReader.getInstance().markAsRead(messageItem, trySendDisplay); + waitToMarkAsRead.add(messageItem.getUniqueId()); + executeRead(messageItem, trySendDisplay); } public void markAsReadAll(boolean trySendDisplay) { @@ -814,11 +827,19 @@ public void markAsReadAll(boolean trySendDisplay) { .equalTo(MessageItem.Fields.READ, false) .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); if (results != null && !results.isEmpty()) { + for (MessageItem message : results) { + waitToMarkAsRead.add(message.getUniqueId()); + } MessageItem lastMessage = results.last(); - if (lastMessage != null) markAsRead(lastMessage, trySendDisplay); + if (lastMessage != null) executeRead(lastMessage, trySendDisplay); } } + private void executeRead(MessageItem messageItem, boolean trySendDisplay) { + EventBus.getDefault().post(new MessageUpdateEvent()); + BackpressureMessageReader.getInstance().markAsRead(messageItem, trySendDisplay); + } + public boolean isArchived() { return archived; } diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageReadEvent.java b/xabber/src/main/java/com/xabber/android/data/message/MessageReadEvent.java deleted file mode 100644 index 0507419a5c..0000000000 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageReadEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.xabber.android.data.message; - -import com.xabber.android.data.entity.AccountJid; -import com.xabber.android.data.entity.UserJid; - -import java.util.List; - -public class MessageReadEvent { - - private AccountJid account; - private UserJid user; - private List ids; - - public MessageReadEvent(AccountJid account, UserJid user, List ids) { - this.account = account; - this.user = user; - this.ids = ids; - } - - public AccountJid getAccount() { - return account; - } - - public UserJid getUser() { - return user; - } - - public List getIds() { - return ids; - } -} diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 7cfe744a84..56f92f2e5f 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -74,7 +74,6 @@ import com.xabber.android.data.message.ClipManager; import com.xabber.android.data.message.ForwardManager; import com.xabber.android.data.message.MessageManager; -import com.xabber.android.data.message.MessageReadEvent; import com.xabber.android.data.message.MessageUpdateEvent; import com.xabber.android.data.message.NewIncomingMessageEvent; import com.xabber.android.data.message.NewMessageEvent; @@ -111,7 +110,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Timer; @@ -192,8 +190,6 @@ public class ChatFragment extends FileInteractionFragment implements PopupMenu.O private ForwardPanel forwardPanel; private List forwardIds = new ArrayList<>(); - private List waitToMarkAsRead = new ArrayList<>(); - public static ChatFragment newInstance(AccountJid account, UserJid user) { ChatFragment fragment = new ChatFragment(); @@ -738,7 +734,10 @@ public void onEvent(PreviousHistoryLoadFinishedEvent event) { @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(MessageUpdateEvent event) { - chatMessageAdapter.onChange(); + if (account.equals(event.getAccount()) && user.equals(event.getUser())) { + chatMessageAdapter.onChange(); + updateUnread(); + } } @Subscribe(threadMode = ThreadMode.MAIN) @@ -761,13 +760,6 @@ public void onEvent(AuthAskEvent event) { } } - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEvent(MessageReadEvent event) { - if (event.getAccount() == getAccount() && event.getUser() == getUser()) { - removeFromWaited(event.getIds()); - } - } - @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); @@ -1448,34 +1440,15 @@ private void updateTopDateIfNeed() { @Override public void onBind(MessageItem message) { - markAsRead(message); - } - - private void markAsRead(MessageItem message) { if (message != null && message.isValid() && !message.isRead()) { - if (!waitToMarkAsRead.contains(message.getUniqueId())) { - waitToMarkAsRead.add(message.getUniqueId()); - AbstractChat chat = getChat(); - if (chat != null) chat.markAsRead(message, true); - updateUnread(); - } - } - } - - private void removeFromWaited(List ids) { - for (String id : ids) { - Iterator iterator = waitToMarkAsRead.iterator(); - while (iterator.hasNext()) { - if (iterator.next().equals(id)) iterator.remove(); - } + AbstractChat chat = getChat(); + if (chat != null) chat.markAsRead(message, true); } - updateUnread(); } private void updateUnread() { AbstractChat chat = getChat(); - if (chat != null) updateNewReceivedMessageCounter( - chat.getUnreadMessageCount() - waitToMarkAsRead.size()); + if (chat != null) updateNewReceivedMessageCounter(chat.getUnreadMessageCount()); } private void showScrollDownButtonIfNeed() { From 1e32b46652bd54ed074f31c5b09d5f89432ef847 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 22 Mar 2019 10:35:02 +0500 Subject: [PATCH 50/97] Work on new read messages system --- .../main/java/com/xabber/android/data/message/AbstractChat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 8105f8fa98..24b6f3457c 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -836,7 +836,7 @@ public void markAsReadAll(boolean trySendDisplay) { } private void executeRead(MessageItem messageItem, boolean trySendDisplay) { - EventBus.getDefault().post(new MessageUpdateEvent()); + EventBus.getDefault().post(new MessageUpdateEvent(account, user)); BackpressureMessageReader.getInstance().markAsRead(messageItem, trySendDisplay); } From 4c264f25e6248ec351e83962f32cc2b978148cc8 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 22 Mar 2019 11:23:50 +0500 Subject: [PATCH 51/97] Work on new read messages system --- .../java/com/xabber/android/data/message/AbstractChat.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 24b6f3457c..0e32a66989 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -803,11 +803,12 @@ public void approveRead(List ids) { for (String id : ids) { waitToMarkAsRead.remove(id); } + EventBus.getDefault().post(new MessageUpdateEvent(account, user)); } public void markAsRead(String messageId, boolean trySendDisplay) { MessageItem message = MessageDatabaseManager.getInstance().getRealmUiThread() - .where(MessageItem.class).equalTo(MessageItem.Fields.UNIQUE_ID, messageId).findFirst(); + .where(MessageItem.class).equalTo(MessageItem.Fields.STANZA_ID, messageId).findFirst(); if (message != null) executeRead(message, trySendDisplay); } From f6ee317fb010ac96a5f4db82af6f21f93d59828f Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 22 Mar 2019 14:23:09 +0500 Subject: [PATCH 52/97] Work on new read messages system --- .../main/java/com/xabber/android/ui/fragment/ChatFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 56f92f2e5f..cd792db4b7 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -735,8 +735,8 @@ public void onEvent(PreviousHistoryLoadFinishedEvent event) { @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(MessageUpdateEvent event) { if (account.equals(event.getAccount()) && user.equals(event.getUser())) { - chatMessageAdapter.onChange(); updateUnread(); + chatMessageAdapter.onChange(); } } From 4566a5f56caa119a1aca6db5dfb27a4c00e4f5c9 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 22 Mar 2019 14:42:05 +0500 Subject: [PATCH 53/97] Work on new read messages system --- .../presentation/mvp/contactlist/ContactListPresenter.java | 6 ++++++ .../java/com/xabber/android/ui/activity/ChatActivity.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java b/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java index d831703b19..c8eb3c03df 100644 --- a/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java +++ b/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java @@ -23,6 +23,7 @@ import com.xabber.android.data.message.ChatContact; import com.xabber.android.data.message.CrowdfundingChat; import com.xabber.android.data.message.MessageManager; +import com.xabber.android.data.message.MessageUpdateEvent; import com.xabber.android.data.message.NewMessageEvent; import com.xabber.android.data.roster.AbstractContact; import com.xabber.android.data.roster.CrowdfundingContact; @@ -209,6 +210,11 @@ public void onNewMessageEvent(NewMessageEvent event) { updateBackpressure.refreshRequest(); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(MessageUpdateEvent event) { + updateBackpressure.refreshRequest(); + } + @Override public void update() { // listener.hidePlaceholder(); diff --git a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java index 888ec7656b..3ba7aa7601 100644 --- a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java +++ b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java @@ -62,6 +62,7 @@ import com.xabber.android.data.message.AbstractChat; import com.xabber.android.data.message.CrowdfundingChat; import com.xabber.android.data.message.MessageManager; +import com.xabber.android.data.message.MessageUpdateEvent; import com.xabber.android.data.message.NewMessageEvent; import com.xabber.android.data.message.NotificationState; import com.xabber.android.data.message.RegularChat; @@ -579,6 +580,11 @@ public void onNewMessageEvent(NewMessageEvent event) { updateBackpressure.refreshRequest(); } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEvent(MessageUpdateEvent event) { + updateBackpressure.refreshRequest(); + } + @Override public void onContactsChanged(Collection entities) { updateBackpressure.refreshRequest(); From 3d67dc8cc248cf2678ae68c25460c242c3c4f8b1 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 22 Mar 2019 15:14:47 +0500 Subject: [PATCH 54/97] Work on new read messages system --- .../android/data/message/AbstractChat.java | 19 +++++++++++++++++++ .../ui/adapter/chat/MessagesAdapter.java | 15 ++++----------- .../android/ui/fragment/ChatFragment.java | 10 +++++----- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 0e32a66989..715311c3f0 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -786,6 +786,25 @@ public void onChange(RealmResults messageItems) { updateLastMessage(); } + public String getFirstUnreadMessageId() { + String id = null; + RealmResults results = MessageDatabaseManager.getInstance().getRealmUiThread() + .where(MessageItem.class) + .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) + .equalTo(MessageItem.Fields.USER, user.toString()) + .isNull(MessageItem.Fields.PARENT_MESSAGE_ID) + .isNotNull(MessageItem.Fields.TEXT) + .equalTo(MessageItem.Fields.INCOMING, true) + .equalTo(MessageItem.Fields.READ, false) + .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); + if (results != null && !results.isEmpty()) { + MessageItem firstUnreadMessage = results.first(); + if (firstUnreadMessage != null) + id = firstUnreadMessage.getUniqueId(); + } + return id; + } + public int getUnreadMessageCount() { int unread = ((int) MessageDatabaseManager.getInstance().getRealmUiThread().where(MessageItem.class) .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java index 8733ef5faf..ac6be745d2 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java @@ -59,7 +59,7 @@ public class MessagesAdapter extends RealmRecyclerViewAdapter itemsNeedOriginalText = new ArrayList<>(); @@ -175,7 +175,7 @@ public void onBindViewHolder(final BasicMessageVH holder, int position) { ((MessageVH)holder).messageId = messageItem.getUniqueId(); // setup message as unread - boolean unread = position == getItemCount() - unreadCount; + boolean unread = messageItem.getUniqueId().equals(firstUnreadMessageID); // setup message as checked boolean checked = checkedItemIds.contains(messageItem.getUniqueId()); @@ -267,15 +267,8 @@ public int findMessagePosition(String uniqueId) { return RecyclerView.NO_POSITION; } - public boolean setUnreadCount(int unreadCount) { - if (this.unreadCount != unreadCount) { - this.unreadCount = unreadCount; - return true; - } else return false; - } - - public int getUnreadCount() { - return unreadCount; + public void setFirstUnreadMessageId(String id) { + firstUnreadMessageID = id; } public void addOrRemoveItemNeedOriginalText(String messageId) { diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index cd792db4b7..500f283f24 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -867,7 +867,7 @@ private void sendMessage() { private void sendMessage(String text) { MessageManager.getInstance().sendMessage(account, user, text); - showUnreadMessage(0); + setFirstUnreadMessageId(null); scrollDown(); } @@ -1317,7 +1317,7 @@ public void restoreScrollState(boolean fromNotification) { scrollToFirstUnread(unread); else if (position > 0) layoutManager.scrollToPosition(position); - showUnreadMessage(unread); + setFirstUnreadMessageId(chat.getFirstUnreadMessageId()); updateNewReceivedMessageCounter(unread); } } @@ -1467,8 +1467,8 @@ private void updateNewReceivedMessageCounter(int count) { else tvNewReceivedCount.setVisibility(View.GONE); } - private void showUnreadMessage(int count) { - chatMessageAdapter.setUnreadCount(count); + private void setFirstUnreadMessageId(String id) { + chatMessageAdapter.setFirstUnreadMessageId(id); chatMessageAdapter.notifyDataSetChanged(); } @@ -1518,7 +1518,7 @@ private void showForwardPanel(List forwardIds) { private void sendForwardMessage(List messages, String text) { ForwardManager.forwardMessage(messages, account, user, text); hideForwardPanel(); - showUnreadMessage(0); + setFirstUnreadMessageId(null); scrollDown(); } From 81c694c0cc4ea492484ab257d0b607f3d13ad564 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 22 Mar 2019 15:34:00 +0500 Subject: [PATCH 55/97] Work on new read messages system --- .../android/data/message/AbstractChat.java | 48 +++++++++---------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 715311c3f0..2621eda771 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -71,6 +71,7 @@ import io.realm.Realm; import io.realm.RealmChangeListener; import io.realm.RealmList; +import io.realm.RealmQuery; import io.realm.RealmResults; import io.realm.Sort; @@ -786,17 +787,11 @@ public void onChange(RealmResults messageItems) { updateLastMessage(); } + /** UNREAD MESSAGES */ + public String getFirstUnreadMessageId() { String id = null; - RealmResults results = MessageDatabaseManager.getInstance().getRealmUiThread() - .where(MessageItem.class) - .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) - .equalTo(MessageItem.Fields.USER, user.toString()) - .isNull(MessageItem.Fields.PARENT_MESSAGE_ID) - .isNotNull(MessageItem.Fields.TEXT) - .equalTo(MessageItem.Fields.INCOMING, true) - .equalTo(MessageItem.Fields.READ, false) - .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); + RealmResults results = getAllUnreadAscending(); if (results != null && !results.isEmpty()) { MessageItem firstUnreadMessage = results.first(); if (firstUnreadMessage != null) @@ -806,14 +801,7 @@ public String getFirstUnreadMessageId() { } public int getUnreadMessageCount() { - int unread = ((int) MessageDatabaseManager.getInstance().getRealmUiThread().where(MessageItem.class) - .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) - .equalTo(MessageItem.Fields.USER, user.toString()) - .isNull(MessageItem.Fields.PARENT_MESSAGE_ID) - .isNotNull(MessageItem.Fields.TEXT) - .equalTo(MessageItem.Fields.INCOMING, true) - .equalTo(MessageItem.Fields.READ, false) - .count()) - waitToMarkAsRead.size(); + int unread = ((int) getAllUnreadQuery().count()) - waitToMarkAsRead.size(); if (unread < 0) unread = 0; return unread; } @@ -837,15 +825,7 @@ public void markAsRead(MessageItem messageItem, boolean trySendDisplay) { } public void markAsReadAll(boolean trySendDisplay) { - Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); - RealmResults results = realm.where(MessageItem.class) - .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) - .equalTo(MessageItem.Fields.USER, user.toString()) - .isNull(MessageItem.Fields.PARENT_MESSAGE_ID) - .isNotNull(MessageItem.Fields.TEXT) - .equalTo(MessageItem.Fields.INCOMING, true) - .equalTo(MessageItem.Fields.READ, false) - .findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); + RealmResults results = getAllUnreadAscending(); if (results != null && !results.isEmpty()) { for (MessageItem message : results) { waitToMarkAsRead.add(message.getUniqueId()); @@ -860,6 +840,22 @@ private void executeRead(MessageItem messageItem, boolean trySendDisplay) { BackpressureMessageReader.getInstance().markAsRead(messageItem, trySendDisplay); } + private RealmQuery getAllUnreadQuery() { + return MessageDatabaseManager.getInstance().getRealmUiThread().where(MessageItem.class) + .equalTo(MessageItem.Fields.ACCOUNT, account.toString()) + .equalTo(MessageItem.Fields.USER, user.toString()) + .isNull(MessageItem.Fields.PARENT_MESSAGE_ID) + .isNotNull(MessageItem.Fields.TEXT) + .equalTo(MessageItem.Fields.INCOMING, true) + .equalTo(MessageItem.Fields.READ, false); + } + + private RealmResults getAllUnreadAscending() { + return getAllUnreadQuery().findAllSorted(MessageItem.Fields.TIMESTAMP, Sort.ASCENDING); + } + + /** ^ UNREAD MESSAGES ^ */ + public boolean isArchived() { return archived; } From c891482383847840fb545072e744983733cb9858 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 22 Mar 2019 17:17:38 +0500 Subject: [PATCH 56/97] Added catch for ClassCastException in MamManager --- .../java/com/xabber/android/data/extension/mam/MamManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/mam/MamManager.java b/xabber/src/main/java/com/xabber/android/data/extension/mam/MamManager.java index f2360ba1e5..f3dd41fe05 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/mam/MamManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/mam/MamManager.java @@ -135,7 +135,8 @@ private boolean updateIsSupported(AccountItem accountItem) { } } catch (SmackException.NoResponseException | XMPPException.XMPPErrorException - | InterruptedException | SmackException.NotConnectedException | SmackException.NotLoggedInException e) { + | InterruptedException | SmackException.NotConnectedException | SmackException.NotLoggedInException + | ClassCastException e) { LogManager.exception(this, e); return false; } From 5d3b1e99d3f5a80918984545108f0be7bf3258b6 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 25 Mar 2019 11:35:58 +0500 Subject: [PATCH 57/97] Remove chat marker support checking --- .../BackpressureMessageReader.java | 2 +- .../chat_markers/ChatMarkerManager.java | 22 ++++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java index a84b49fe38..5d672dd7db 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/BackpressureMessageReader.java @@ -52,7 +52,7 @@ private PublishSubject createSubject(final AbstractContact contac public void call(MessageHolder holder) { MessageItem message = holder.messageItem; if (holder.trySendDisplayed) - ChatMarkerManager.getInstance().sendDisplayedIfNeed(message); + ChatMarkerManager.getInstance().sendDisplayed(message); Realm realm = MessageDatabaseManager.getInstance().getRealmUiThread(); RealmResults messages = getPreviousUnreadMessages(realm, message); diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 56f0c4c373..2a402b9350 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -96,19 +96,15 @@ public void onStanza(ConnectionItem connection, Stanza packet) { } } - public void sendDisplayedIfNeed(MessageItem messageItem) { - //if (isClientSupportChatMarkers(messageItem.getAccount(), messageItem.getUser())) { - Message displayed = new Message(messageItem.getUser().getJid()); - displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); - //displayed.setThread(messageItem.getThread()); - displayed.setType(Message.Type.chat); - - try { - StanzaSender.sendStanza(messageItem.getAccount(), displayed); - } catch (NetworkException e) { - LogManager.exception(this, e); - } - //} + public void sendDisplayed(MessageItem messageItem) { + Message displayed = new Message(messageItem.getUser().getJid()); + displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); + displayed.setType(Message.Type.chat); + try { + StanzaSender.sendStanza(messageItem.getAccount(), displayed); + } catch (NetworkException e) { + LogManager.exception(this, e); + } } public void processCarbonsMessage(AccountJid account, final Message message, CarbonExtension.Direction direction) { From ec934d1bdc91b4f36507f7164bca0ce6591e65f6 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 25 Mar 2019 12:11:16 +0500 Subject: [PATCH 58/97] Added mark as read all on saving outgoning message --- .../java/com/xabber/android/data/message/AbstractChat.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 2621eda771..cfe4fa21c8 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -428,6 +428,12 @@ protected MessageItem createMessageItem(String uid, Resourcepart resource, Strin // remove notifications if get outgoing message with 2 sec delay if (!incoming) { MessageNotificationManager.getInstance().removeChatWithTimer(account, user); + Application.getInstance().runOnUiThread(new Runnable() { + @Override + public void run() { + markAsReadAll(true); + } + }); } // when getting new message, unarchive chat if chat not muted From 5380ddff9525ed89a2990fd409d9901b240f651a Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 25 Mar 2019 16:28:47 +0500 Subject: [PATCH 59/97] Added 10 sec delay for showing notification. If message will be read in this 10 sec, then notification wouldn't appear. --- .../xabber/android/data/message/AbstractChat.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index cfe4fa21c8..74699aeaab 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -422,8 +422,19 @@ protected MessageItem createMessageItem(String uid, Resourcepart resource, Strin // notification enableNotificationsIfNeed(); - if (notify && notifyAboutMessage() && !visible) - NotificationManager.getInstance().onMessageNotification(messageItem); + if (notify && notifyAboutMessage() && !visible) { + final String uniqueId = messageItem.getUniqueId(); + Application.getInstance().runOnUiThreadDelay(new Runnable() { + @Override + public void run() { + MessageItem message = MessageDatabaseManager.getInstance().getRealmUiThread() + .where(MessageItem.class) + .equalTo(MessageItem.Fields.UNIQUE_ID, uniqueId).findFirst(); + if (!message.isRead()) + NotificationManager.getInstance().onMessageNotification(message); + } + }, 10000); + } // remove notifications if get outgoing message with 2 sec delay if (!incoming) { From 080bb0cc45e0bfd561f96c3712c740f1294552c3 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 25 Mar 2019 16:47:32 +0500 Subject: [PATCH 60/97] Fixed bug in message status --- .../ui/contactlist/viewobjects/ContactVO.java | 12 ++++++------ .../android/ui/adapter/chat/OutgoingMessageVH.java | 13 +++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java index 7a7d7947bc..65ffddbf6d 100644 --- a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java +++ b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/viewobjects/ContactVO.java @@ -200,17 +200,17 @@ public static ContactVO convert(AbstractContact contact, ContactClickListener li messageOwner = lastMessage.getResource().toString(); // message status - if (lastMessage.isDisplayed() || lastMessage.isReceivedFromMessageArchive()) { + if (lastMessage.isError()) { + messageStatus = 4; + } else if (!MessageItem.isUploadFileMessage(lastMessage) && !lastMessage.isSent() + && System.currentTimeMillis() - lastMessage.getTimestamp() > 1000) { + messageStatus = 5; + } else if (lastMessage.isDisplayed() || lastMessage.isReceivedFromMessageArchive()) { messageStatus = 1; } else if (lastMessage.isDelivered() || lastMessage.isForwarded()) { messageStatus = 2; } else if (lastMessage.isAcknowledged()) { messageStatus = 3; - } else if (lastMessage.isError()) { - messageStatus = 4; - } else if (!MessageItem.isUploadFileMessage(lastMessage) && !lastMessage.isSent() - && System.currentTimeMillis() - lastMessage.getTimestamp() > 1000) { - messageStatus = 5; } // forwarded diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/OutgoingMessageVH.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/OutgoingMessageVH.java index 240e680714..12dcdde180 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/OutgoingMessageVH.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/OutgoingMessageVH.java @@ -107,18 +107,19 @@ private void setStatusIcon(MessageItem messageItem) { int messageIcon = 0; - if (messageItem.isDisplayed() || messageItem.isReceivedFromMessageArchive()) { + if (messageItem.isError()) { + messageIcon = R.drawable.ic_message_has_error_14dp; + } else if (!isFileUploadInProgress && !messageItem.isSent() + && System.currentTimeMillis() - messageItem.getTimestamp() > 1000) { + messageIcon = R.drawable.ic_message_not_sent_14dp; + } else if (messageItem.isDisplayed() || messageItem.isReceivedFromMessageArchive()) { messageIcon = R.drawable.ic_message_displayed; } else if (messageItem.isDelivered() || messageItem.isForwarded()) { messageIcon = R.drawable.ic_message_delivered_14dp; } else if (messageItem.isAcknowledged()) { messageIcon = R.drawable.ic_message_acknowledged_14dp; - } else if (messageItem.isError()) { - messageIcon = R.drawable.ic_message_has_error_14dp; - } else if (!isFileUploadInProgress && !messageItem.isSent() - && System.currentTimeMillis() - messageItem.getTimestamp() > 1000) { - messageIcon = R.drawable.ic_message_not_sent_14dp; } + if (messageIcon != 0) statusIcon.setImageResource(messageIcon); else statusIcon.setVisibility(View.INVISIBLE); } From fe937a25c1ca73d78c1aee2b66a6b61e64ecb75e Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 25 Mar 2019 17:36:57 +0500 Subject: [PATCH 61/97] Changed unread message count updating in contact list --- .../mvp/contactlist/ContactListPresenter.java | 15 ++++++++++++++- .../ui/contactlist/ContactListFragment.java | 6 ++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java b/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java index c8eb3c03df..fb58c511b4 100644 --- a/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java +++ b/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java @@ -458,6 +458,7 @@ public void update() { } else view.hidePlaceholder(); view.updateItems(items); } + updateUnreadCount(); } /** @@ -516,7 +517,7 @@ private GroupConfiguration getChatsGroup(Collection chats, ChatLis } unreadMessageCount += unreadCount; - EventBus.getDefault().post(new UpdateUnreadCountEvent(unreadMessageCount)); + //EventBus.getDefault().post(new UpdateUnreadCountEvent(unreadMessageCount)); Collections.sort(newChats, ChatComparator.CHAT_COMPARATOR); chatsGroup.setNotEmpty(); @@ -658,6 +659,18 @@ public ArrayList getTwoNextRecentChat() { return items; } + public void updateUnreadCount() { + int unreadMessageCount = 0; + + for (AbstractChat abstractChat : MessageManager.getInstance().getChatsOfEnabledAccount()) { + if (abstractChat.notifyAboutMessage() && !abstractChat.isArchived()) + unreadMessageCount += abstractChat.getUnreadMessageCount(); + } + + unreadMessageCount += CrowdfundingManager.getInstance().getUnreadMessageCount(); + EventBus.getDefault().post(new UpdateUnreadCountEvent(unreadMessageCount)); + } + public enum ChatListState { recent, unread, diff --git a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/ContactListFragment.java b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/ContactListFragment.java index d9603df4fa..5381f7883e 100644 --- a/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/ContactListFragment.java +++ b/xabber/src/main/java/com/xabber/android/presentation/ui/contactlist/ContactListFragment.java @@ -268,6 +268,9 @@ public void onItemSwipe(int position, int direction) { // showing snackbar with Undo option showSnackbar(deletedItem, position); + + // update unread count + presenter.updateUnreadCount(); } } @@ -381,6 +384,9 @@ public void onClick(View view) { // undo is selected, restore the deleted item adapter.addItem(deletedIndex, deletedItem); + + // update unread count + presenter.updateUnreadCount(); } }); snackbar.setActionTextColor(Color.YELLOW); From d82cf5b58de412e8bd5ac273c5eab9039744875e Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 25 Mar 2019 17:43:05 +0500 Subject: [PATCH 62/97] Removed unused code --- .../mvp/contactlist/ContactListPresenter.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java b/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java index fb58c511b4..c2dfe3e619 100644 --- a/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java +++ b/xabber/src/main/java/com/xabber/android/presentation/mvp/contactlist/ContactListPresenter.java @@ -52,7 +52,6 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import org.jxmpp.stringprep.XmppStringprepException; import java.util.ArrayList; import java.util.Collection; @@ -472,19 +471,17 @@ private GroupConfiguration getChatsGroup(Collection chats, ChatLis List newChats = new ArrayList<>(); - int unreadMessageCount = 0; for (AbstractChat abstractChat : chats) { MessageItem lastMessage = abstractChat.getLastMessage(); if (lastMessage != null) { AccountItem accountItem = AccountManager.getInstance().getAccount(abstractChat.getAccount()); if (accountItem != null && accountItem.isEnabled()) { - int unread = abstractChat.getUnreadMessageCount(); - if (abstractChat.notifyAboutMessage()) unreadMessageCount = unreadMessageCount + unread; switch (state) { case unread: - if (!abstractChat.isArchived() && unread > 0) newChats.add(abstractChat); + if (!abstractChat.isArchived() && abstractChat.getUnreadMessageCount() > 0) + newChats.add(abstractChat); break; case archived: if (abstractChat.isArchived()) newChats.add(abstractChat); @@ -515,9 +512,7 @@ private GroupConfiguration getChatsGroup(Collection chats, ChatLis break; } } - unreadMessageCount += unreadCount; - //EventBus.getDefault().post(new UpdateUnreadCountEvent(unreadMessageCount)); Collections.sort(newChats, ChatComparator.CHAT_COMPARATOR); chatsGroup.setNotEmpty(); From 75d2ba236d399f623d475b1aca09662845e871a9 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 25 Mar 2019 17:48:14 +0500 Subject: [PATCH 63/97] Up version to 596 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 6156ab2f73..feb174c972 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 594 - versionName '2.6.3(594)' + versionCode 596 + versionName '2.6.3(596)' } lintOptions { From f2db6ac5bf5535798f42d38b283b162a787bb683 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 26 Mar 2019 17:06:49 +0500 Subject: [PATCH 64/97] Removed delay for notifications --- .../xabber/android/data/message/AbstractChat.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 74699aeaab..cfe4fa21c8 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -422,19 +422,8 @@ protected MessageItem createMessageItem(String uid, Resourcepart resource, Strin // notification enableNotificationsIfNeed(); - if (notify && notifyAboutMessage() && !visible) { - final String uniqueId = messageItem.getUniqueId(); - Application.getInstance().runOnUiThreadDelay(new Runnable() { - @Override - public void run() { - MessageItem message = MessageDatabaseManager.getInstance().getRealmUiThread() - .where(MessageItem.class) - .equalTo(MessageItem.Fields.UNIQUE_ID, uniqueId).findFirst(); - if (!message.isRead()) - NotificationManager.getInstance().onMessageNotification(message); - } - }, 10000); - } + if (notify && notifyAboutMessage() && !visible) + NotificationManager.getInstance().onMessageNotification(messageItem); // remove notifications if get outgoing message with 2 sec delay if (!incoming) { From 7eff83664cab38ffd8a8dc9baeedb443ac1f1510 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 26 Mar 2019 17:15:48 +0500 Subject: [PATCH 65/97] Added silent messages notif channel --- .../data/notification/NotificationChannelUtils.java | 13 +++++++++++++ .../data/notification/NotificationManager.java | 1 + xabber/src/main/res/values/notification_bar.xml | 2 ++ 3 files changed, 16 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/notification/NotificationChannelUtils.java b/xabber/src/main/java/com/xabber/android/data/notification/NotificationChannelUtils.java index cbcfb635a6..2e6f768a2b 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/NotificationChannelUtils.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/NotificationChannelUtils.java @@ -27,6 +27,7 @@ public class NotificationChannelUtils { public static final String DEFAULT_ATTENTION_CHANNEL_ID = "DEFAULT_ATTENTION_CHANNEL_ID"; public static final String PERSISTENT_CONNECTION_CHANNEL_ID = "PERSISTENT_CONNECTION_CHANNEL_ID"; public static final String EVENTS_CHANNEL_ID = "EVENTS_CHANNEL_ID"; + public static final String SILENT_CHANNEL_ID = "SILENT_CHANNEL_ID"; public enum ChannelType { privateChat, @@ -133,6 +134,18 @@ public static String createEventsChannel(NotificationManager notifManager) { return channel.getId(); } + @RequiresApi(api = Build.VERSION_CODES.O) + public static String createSilentChannel(NotificationManager notifManager) { + @SuppressLint("WrongConstant") NotificationChannel channel = + new NotificationChannel(SILENT_CHANNEL_ID, + getString(R.string.channel_silent_title), + NotificationManager.IMPORTANCE_LOW); + channel.setDescription(getString(R.string.channel_silent_description)); + channel.setShowBadge(true); + notifManager.createNotificationChannel(channel); + return channel.getId(); + } + private static String getString(@StringRes int resid) { return Application.getInstance().getString(resid); } diff --git a/xabber/src/main/java/com/xabber/android/data/notification/NotificationManager.java b/xabber/src/main/java/com/xabber/android/data/notification/NotificationManager.java index c122182c6e..6305b454c2 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/NotificationManager.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/NotificationManager.java @@ -108,6 +108,7 @@ private NotificationManager() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && notificationManager != null) { NotificationChannelUtils.createPresistentConnectionChannel(notificationManager); NotificationChannelUtils.createEventsChannel(notificationManager); + NotificationChannelUtils.createSilentChannel(notificationManager); } handler = new Handler(); diff --git a/xabber/src/main/res/values/notification_bar.xml b/xabber/src/main/res/values/notification_bar.xml index eb1c686452..5e33f5b0ed 100644 --- a/xabber/src/main/res/values/notification_bar.xml +++ b/xabber/src/main/res/values/notification_bar.xml @@ -59,5 +59,7 @@ Persistent connection Persistent notification for establish connection to receive messages Events + Silent message notifications Notifications for events like: group chat invites, subscription requests, OTR requests + Silent notifications about messages \ No newline at end of file From f6ad7001a1487851a30534ddf52ff23d780b0b00 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 26 Mar 2019 17:38:30 +0500 Subject: [PATCH 66/97] Start implementation of grace period --- .../xabber/android/data/account/AccountItem.java | 14 ++++++++++++++ .../notification/MessageNotificationCreator.java | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/account/AccountItem.java b/xabber/src/main/java/com/xabber/android/data/account/AccountItem.java index 9d4013f864..c98563d9dc 100644 --- a/xabber/src/main/java/com/xabber/android/data/account/AccountItem.java +++ b/xabber/src/main/java/com/xabber/android/data/account/AccountItem.java @@ -113,6 +113,8 @@ public class AccountItem extends ConnectionItem implements Comparable (System.currentTimeMillis() / 1000L); + } } diff --git a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java index f2ae91eb9b..2e94602832 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java @@ -19,6 +19,8 @@ import com.xabber.android.R; import com.xabber.android.data.Application; import com.xabber.android.data.SettingsManager; +import com.xabber.android.data.account.AccountItem; +import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.extension.avatar.AvatarManager; @@ -129,6 +131,9 @@ public void createBundleNotification(List chats } private String getChannelID(MessageNotificationManager.Chat chat) { + if (inGracePeriod(chat)) + return NotificationChannelUtils.SILENT_CHANNEL_ID; + NotifyPrefs customPrefs = null; boolean isGroup = false; if (chat != null) { @@ -145,6 +150,13 @@ private void sendNotification(NotificationCompat.Builder builder, int notificati } /** UTILS */ + private static boolean inGracePeriod(MessageNotificationManager.Chat chat) { + if (chat == null) return false; + AccountItem accountItem = AccountManager.getInstance().getAccount(chat.getAccountJid()); + if (accountItem != null) return accountItem.inGracePeriod(); + else return false; + } + private CharSequence createNewMessagesTitle(int messageCount) { return context.getString(R.string.new_chat_messages, messageCount, StringUtils.getQuantityString(context.getResources(), R.array.chat_message_quantity, messageCount)); From 72e413b0b0b9d0ba51f7cc2ca4ed7b3308fa97e0 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 27 Mar 2019 11:11:15 +0500 Subject: [PATCH 67/97] Work on grace period --- .../com/xabber/android/data/account/AccountItem.java | 7 ++++--- .../xabber/android/data/account/AccountManager.java | 10 ++++++++++ .../data/extension/chat_markers/ChatMarkerManager.java | 3 +++ .../xabber/android/data/message/MessageManager.java | 8 ++++++-- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/account/AccountItem.java b/xabber/src/main/java/com/xabber/android/data/account/AccountItem.java index c98563d9dc..ee932d25b3 100644 --- a/xabber/src/main/java/com/xabber/android/data/account/AccountItem.java +++ b/xabber/src/main/java/com/xabber/android/data/account/AccountItem.java @@ -44,6 +44,7 @@ public class AccountItem extends ConnectionItem implements Comparable { public static final String UNDEFINED_PASSWORD = ""; + private static final long GRACE_PERIOD = 150000; /** * Id in database. @@ -457,8 +458,8 @@ public int compareTo(@NonNull AccountItem accountItem) { return order - accountItem.order; } - public void startGracePeriod(long time) { - gracePeriodEndTime = (System.currentTimeMillis() / 1000L) + time; + public void startGracePeriod() { + gracePeriodEndTime = System.currentTimeMillis() + GRACE_PERIOD; } public void stopGracePeriod() { @@ -466,6 +467,6 @@ public void stopGracePeriod() { } public boolean inGracePeriod() { - return gracePeriodEndTime > (System.currentTimeMillis() / 1000L); + return gracePeriodEndTime > System.currentTimeMillis(); } } diff --git a/xabber/src/main/java/com/xabber/android/data/account/AccountManager.java b/xabber/src/main/java/com/xabber/android/data/account/AccountManager.java index f9b5d44de2..1dc8c8c7fe 100644 --- a/xabber/src/main/java/com/xabber/android/data/account/AccountManager.java +++ b/xabber/src/main/java/com/xabber/android/data/account/AccountManager.java @@ -1192,4 +1192,14 @@ public void setAllAccountAutoLoginToXabber(boolean autoLogin) { } } + public void startGracePeriod(AccountJid accountJid) { + AccountItem accountItem = getAccount(accountJid); + if (accountItem != null) accountItem.startGracePeriod(); + } + + public void stopGracePeriod(AccountJid accountJid) { + AccountItem accountItem = getAccount(accountJid); + if (accountItem != null) accountItem.stopGracePeriod(); + } + } diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index 2a402b9350..a17371cbb9 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -122,6 +122,9 @@ public void processCarbonsMessage(AccountJid account, final Message message, Car if (chat != null) { chat.markAsRead(extension.getId(), false); MessageNotificationManager.getInstance().removeChatWithTimer(account, companion); + + // start grace period + AccountManager.getInstance().startGracePeriod(account); } } } diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index a8c53c7ad7..2fefebccfa 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -59,7 +59,6 @@ import com.xabber.android.data.roster.RosterManager; import com.xabber.android.utils.StringUtils; -import org.greenrobot.eventbus.EventBus; import org.jivesoftware.smack.packet.ExtensionElement; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Stanza; @@ -254,6 +253,9 @@ public void removeChat(AbstractChat chat) { public void sendMessage(AccountJid account, UserJid user, String text) { AbstractChat chat = getOrCreateChat(account, user); sendMessage(text, chat); + + // stop grace period + AccountManager.getInstance().stopGracePeriod(account); } private void sendMessage(final String text, final AbstractChat chat) { @@ -787,7 +789,9 @@ public void processCarbonsMessage(AccountJid account, final Message message, Car newMessageItem.setAttachments(attachments); BackpressureMessageSaver.getInstance().saveMessageItem(newMessageItem); - //EventBus.getDefault().post(new NewMessageEvent()); + + // start grace period + AccountManager.getInstance().startGracePeriod(account); return; } From 7326c87626b1b06a51294e0df0f5205ee52707d4 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 27 Mar 2019 14:41:09 +0500 Subject: [PATCH 68/97] Work on grace period --- .../main/java/com/xabber/android/data/ActivityManager.java | 2 ++ .../com/xabber/android/data/account/AccountManager.java | 6 ++++++ .../java/com/xabber/android/data/account/ScreenManager.java | 3 ++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/xabber/src/main/java/com/xabber/android/data/ActivityManager.java b/xabber/src/main/java/com/xabber/android/data/ActivityManager.java index 57a99b395b..9c1947ed60 100644 --- a/xabber/src/main/java/com/xabber/android/data/ActivityManager.java +++ b/xabber/src/main/java/com/xabber/android/data/ActivityManager.java @@ -21,6 +21,7 @@ import android.widget.Toast; import com.xabber.android.R; +import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.connection.CertificateManager; import com.xabber.android.data.log.LogManager; import com.xabber.android.ui.activity.AboutActivity; @@ -219,6 +220,7 @@ public void onError(final int resourceId) { application.addUIListener(OnErrorListener.class, onErrorListener); CertificateManager.getInstance().registerActivity(activity); + AccountManager.getInstance().stopGracePeriod(); } /** diff --git a/xabber/src/main/java/com/xabber/android/data/account/AccountManager.java b/xabber/src/main/java/com/xabber/android/data/account/AccountManager.java index 1dc8c8c7fe..9f3e559ea0 100644 --- a/xabber/src/main/java/com/xabber/android/data/account/AccountManager.java +++ b/xabber/src/main/java/com/xabber/android/data/account/AccountManager.java @@ -1202,4 +1202,10 @@ public void stopGracePeriod(AccountJid accountJid) { if (accountItem != null) accountItem.stopGracePeriod(); } + public void stopGracePeriod() { + for (AccountJid accountJid : AccountManager.getInstance().getEnabledAccounts()) { + stopGracePeriod(accountJid); + } + } + } diff --git a/xabber/src/main/java/com/xabber/android/data/account/ScreenManager.java b/xabber/src/main/java/com/xabber/android/data/account/ScreenManager.java index 14850fc629..378000c390 100644 --- a/xabber/src/main/java/com/xabber/android/data/account/ScreenManager.java +++ b/xabber/src/main/java/com/xabber/android/data/account/ScreenManager.java @@ -21,11 +21,11 @@ import android.content.IntentFilter; import com.xabber.android.data.Application; -import com.xabber.android.data.log.LogManager; import com.xabber.android.data.OnCloseListener; import com.xabber.android.data.OnInitializedListener; import com.xabber.android.data.SettingsManager; import com.xabber.android.data.extension.csi.ClientStateManager; +import com.xabber.android.data.log.LogManager; import com.xabber.android.receiver.GoAwayReceiver; import com.xabber.android.receiver.GoXaReceiver; import com.xabber.android.receiver.ScreenReceiver; @@ -106,6 +106,7 @@ public void onScreen(Intent intent) { alarmManager.cancel(goAwayPendingIntent); alarmManager.cancel(goXaPendingIntent); AccountManager.getInstance().wakeUp(); + AccountManager.getInstance().stopGracePeriod(); // notify server(s) that client is now active ClientStateManager.setActive(); From 8b1d5a8d961a18df190c093bbb49bb8ab6a7a281 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 27 Mar 2019 16:04:55 +0500 Subject: [PATCH 69/97] Work on grace period --- .../com/xabber/android/data/message/AbstractChat.java | 10 +--------- .../xabber/android/data/message/MessageManager.java | 10 ++++++---- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index cfe4fa21c8..6f9686e720 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -426,15 +426,7 @@ protected MessageItem createMessageItem(String uid, Resourcepart resource, Strin NotificationManager.getInstance().onMessageNotification(messageItem); // remove notifications if get outgoing message with 2 sec delay - if (!incoming) { - MessageNotificationManager.getInstance().removeChatWithTimer(account, user); - Application.getInstance().runOnUiThread(new Runnable() { - @Override - public void run() { - markAsReadAll(true); - } - }); - } + if (!incoming) MessageNotificationManager.getInstance().removeChatWithTimer(account, user); // when getting new message, unarchive chat if chat not muted if (this.notifyAboutMessage()) diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index 2fefebccfa..420aa4967d 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -259,20 +259,19 @@ public void sendMessage(AccountJid account, UserJid user, String text) { } private void sendMessage(final String text, final AbstractChat chat) { - final long startTime = System.currentTimeMillis(); - MessageDatabaseManager.getInstance().getRealmUiThread() .executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { MessageItem newMessageItem = chat.createNewMessageItem(text); realm.copyToRealm(newMessageItem); - LogManager.d("REALM", Thread.currentThread().getName() - + " save message before sending: " + (System.currentTimeMillis() - startTime)); if (chat.canSendMessage()) chat.sendMessages(); } }); + + // mark incoming messages as read + chat.markAsReadAll(true); } public String createFileMessage(AccountJid account, UserJid user, List files) { @@ -790,6 +789,9 @@ public void processCarbonsMessage(AccountJid account, final Message message, Car BackpressureMessageSaver.getInstance().saveMessageItem(newMessageItem); + // mark incoming messages as read + finalChat.markAsReadAll(false); + // start grace period AccountManager.getInstance().startGracePeriod(account); return; From 7db29940a3bd9f2da7d894cde7a367198c4dfad3 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 27 Mar 2019 17:04:20 +0500 Subject: [PATCH 70/97] Added starting grace period when received carbons chat state active or composing --- .../extension/carbons/CarbonCopyListener.java | 2 ++ .../data/extension/cs/ChatStateManager.java | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/carbons/CarbonCopyListener.java b/xabber/src/main/java/com/xabber/android/data/extension/carbons/CarbonCopyListener.java index cf7814ce1e..8230fe4d1a 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/carbons/CarbonCopyListener.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/carbons/CarbonCopyListener.java @@ -4,6 +4,7 @@ import com.xabber.android.data.Application; import com.xabber.android.data.entity.AccountJid; import com.xabber.android.data.extension.chat_markers.ChatMarkerManager; +import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.message.MessageManager; import org.jivesoftware.smack.packet.Message; @@ -29,6 +30,7 @@ public void onCarbonCopyReceived(final CarbonExtension.Direction direction, public void run() { MessageManager.getInstance().processCarbonsMessage(account, carbonCopy, direction); ChatMarkerManager.getInstance().processCarbonsMessage(account, carbonCopy, direction); + ChatStateManager.getInstance().processCarbonsMessage(account, carbonCopy, direction); } }); } diff --git a/xabber/src/main/java/com/xabber/android/data/extension/cs/ChatStateManager.java b/xabber/src/main/java/com/xabber/android/data/extension/cs/ChatStateManager.java index 3f9c00ccdd..54bad9602d 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/cs/ChatStateManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/cs/ChatStateManager.java @@ -19,12 +19,14 @@ import android.content.Context; import android.content.Intent; import android.os.Handler; +import android.util.Log; import com.xabber.android.data.Application; import com.xabber.android.data.NetworkException; import com.xabber.android.data.OnCloseListener; import com.xabber.android.data.SettingsManager; import com.xabber.android.data.account.AccountItem; +import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.connection.ConnectionItem; import com.xabber.android.data.connection.ConnectionManager; import com.xabber.android.data.connection.StanzaSender; @@ -48,12 +50,15 @@ import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Presence.Type; import org.jivesoftware.smack.packet.Stanza; +import org.jivesoftware.smackx.carbons.packet.CarbonExtension; import org.jivesoftware.smackx.chatstates.ChatState; import org.jivesoftware.smackx.chatstates.packet.ChatStateExtension; +import org.jivesoftware.smackx.chatstates.provider.ChatStateExtensionProvider; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; import org.jxmpp.jid.BareJid; import org.jxmpp.jid.Jid; import org.jxmpp.jid.parts.Resourcepart; +import org.jxmpp.stringprep.XmppStringprepException; import java.util.Calendar; import java.util.Map; @@ -365,4 +370,17 @@ public void onClose() { pauseIntents.clear(); } + public void processCarbonsMessage(AccountJid account, final Message message, CarbonExtension.Direction direction) { + if (direction == CarbonExtension.Direction.sent) { + for (ExtensionElement extension : message.getExtensions()) + if (extension instanceof ChatStateExtension) { + ChatState chatState = ((ChatStateExtension) extension).getChatState(); + if (chatState == ChatState.active || chatState == ChatState.composing) { + AccountManager.getInstance().startGracePeriod(account); + } + break; + } + } + } + } From 8c39bec67b42a2c50bc3dd9073e924b2620a89ea Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 27 Mar 2019 17:44:26 +0500 Subject: [PATCH 71/97] Added special settings for legacy notification in grace period --- .../data/notification/MessageNotificationCreator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java index 2e94602832..b8a200b9d0 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java @@ -72,7 +72,7 @@ public void createNotification(MessageNotificationManager.Chat chat, boolean ale .setContentIntent(createContentIntent(chat)) .setDeleteIntent(NotificationReceiver.createDeleteIntent(context, chat.getNotificationId())) .setCategory(NotificationCompat.CATEGORY_MESSAGE) - .setPriority(inForeground ? NotificationCompat.PRIORITY_DEFAULT + .setPriority((inForeground || inGracePeriod(chat)) ? NotificationCompat.PRIORITY_DEFAULT : NotificationCompat.PRIORITY_HIGH); boolean showText = isNeedShowTextInNotification(chat); @@ -84,7 +84,7 @@ public void createNotification(MessageNotificationManager.Chat chat, boolean ale .setContentText(createMessageLine(chat.getLastMessage(), chat.isGroupChat(), showText)) .setStyle(createInboxStyle(chat, showText)) .setAutoCancel(true); - if (alert) addEffects(builder, chat.getLastMessage().getMessageText().toString(), chat, context); + if (alert && !inGracePeriod(chat)) addEffects(builder, chat.getLastMessage().getMessageText().toString(), chat, context); } builder.addAction(createMarkAsReadAction(chat.getNotificationId())) @@ -108,7 +108,7 @@ public void createBundleNotification(List chats .setContentIntent(createBundleContentIntent()) .setDeleteIntent(NotificationReceiver.createDeleteIntent(context, MESSAGE_BUNDLE_NOTIFICATION_ID)) .setCategory(NotificationCompat.CATEGORY_MESSAGE) - .setPriority(inForeground ? NotificationCompat.PRIORITY_DEFAULT + .setPriority((inForeground || inGracePeriod(lastChat)) ? NotificationCompat.PRIORITY_DEFAULT : NotificationCompat.PRIORITY_HIGH); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -123,7 +123,7 @@ public void createBundleNotification(List chats .setStyle(createInboxStyleForBundle(sortedChats)) .setContentText(createSummarizedContentForBundle(sortedChats)); MessageNotificationManager.Message lastMessage = lastChat != null ? lastChat.getLastMessage() : null; - if (lastMessage != null && alert) + if (lastMessage != null && alert && !inGracePeriod(lastChat)) addEffects(builder, lastMessage.getMessageText().toString(), lastChat, context); } From a51f7c100d342ba50a22c0a8670b4379346fbb8d Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 27 Mar 2019 17:52:46 +0500 Subject: [PATCH 72/97] Stop the grace period on click mark as read in notification --- .../android/data/notification/MessageNotificationManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java index e17fec2d6d..de04a80b05 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java @@ -7,6 +7,7 @@ import com.xabber.android.R; import com.xabber.android.data.Application; import com.xabber.android.data.OnLoadListener; +import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.database.RealmManager; import com.xabber.android.data.database.messagerealm.Attachment; import com.xabber.android.data.database.messagerealm.MessageItem; @@ -114,6 +115,7 @@ public void onNotificationMarkedAsRead(int notificationId) { AbstractChat chat = MessageManager.getInstance().getChat( chatNotif.getAccountJid(), chatNotif.getUserJid()); if (chat != null) { + AccountManager.getInstance().stopGracePeriod(chat.getAccount()); chat.markAsReadAll(true); callUiUpdate(); } From 3cf41be4d2f2e4bf40bc8e91a371d7fa26577ebd Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Wed, 27 Mar 2019 17:54:37 +0500 Subject: [PATCH 73/97] Up version to 597 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index feb174c972..989cf29320 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 596 - versionName '2.6.3(596)' + versionCode 597 + versionName '2.6.3(597)' } lintOptions { From d78cc7d88bdf9d4f71e4732f437a855029b8f987 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 28 Mar 2019 11:55:45 +0500 Subject: [PATCH 74/97] Fixed exception in httpfileupload --- .../data/extension/httpfileupload/HttpFileUploadManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/httpfileupload/HttpFileUploadManager.java b/xabber/src/main/java/com/xabber/android/data/extension/httpfileupload/HttpFileUploadManager.java index 9caa8f6f27..4f0a054951 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/httpfileupload/HttpFileUploadManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/httpfileupload/HttpFileUploadManager.java @@ -341,10 +341,9 @@ public void run() { Realm realm = RealmManager.getInstance().getNewRealm(); UploadServer item = realm.where(UploadServer.class) .equalTo(UploadServer.Fields.ACCOUNT, account.toString()).findFirst(); + realm.beginTransaction(); if (item == null) item = new UploadServer(account, server); else item.setServer(server); - - realm.beginTransaction(); realm.copyToRealmOrUpdate(item); realm.commitTransaction(); } From 677016b02cebeab9349e8b68763680abb85d15b1 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 28 Mar 2019 16:06:00 +0500 Subject: [PATCH 75/97] Changes in sharing files via Xabber --- .../xabber/android/ui/activity/ChatActivity.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java index 3ba7aa7601..91ec1b83b2 100644 --- a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java +++ b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java @@ -405,19 +405,10 @@ protected void onResume() { } public void handleShareFileUri(Uri fileUri) { - final String path = FileUtils.getPath(this, fileUri); - - LogManager.i(this, String.format("File uri: %s, path: %s", fileUri, path)); - - if (path == null) { - Toast.makeText(this, R.string.could_not_get_path_to_file, Toast.LENGTH_SHORT).show(); - return; - } - if (PermissionsRequester.requestFileReadPermissionIfNeeded(this, PERMISSIONS_REQUEST_ATTACH_FILE)) { - List paths = new ArrayList<>(); - paths.add(path); - HttpFileUploadManager.getInstance().uploadFile(account, user, paths, this); + List uris = new ArrayList<>(); + uris.add(fileUri); + HttpFileUploadManager.getInstance().uploadFileViaUri(account, user, uris, this); } } From 1b28ffaa0c7d27aa8add9774388d7c65f19e47cf Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 28 Mar 2019 17:05:42 +0500 Subject: [PATCH 76/97] Added support for sharing multiply files via Xabber --- xabber/src/main/AndroidManifest.xml | 1 + .../android/ui/activity/ChatActivity.java | 33 +++++++++++++++++-- .../ui/activity/ContactListActivity.java | 10 ++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/xabber/src/main/AndroidManifest.xml b/xabber/src/main/AndroidManifest.xml index cd5135d42e..ec5e418220 100644 --- a/xabber/src/main/AndroidManifest.xml +++ b/xabber/src/main/AndroidManifest.xml @@ -68,6 +68,7 @@ + diff --git a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java index 91ec1b83b2..3ddebfdf43 100644 --- a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java +++ b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java @@ -52,7 +52,6 @@ import com.xabber.android.data.extension.attention.AttentionManager; import com.xabber.android.data.extension.blocking.BlockingManager; import com.xabber.android.data.extension.blocking.OnBlockedListChangedListener; -import com.xabber.android.data.extension.file.FileUtils; import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager; import com.xabber.android.data.extension.muc.MUCManager; import com.xabber.android.data.extension.muc.RoomChat; @@ -281,6 +280,14 @@ public static Intent createSendUriIntent(Context context, AccountJid account, return intent; } + public static Intent createSendUrisIntent(Context context, AccountJid account, + UserJid user, ArrayList uris) { + Intent intent = ChatActivity.createSpecificChatIntent(context, account, user); + intent.setAction(Intent.ACTION_SEND_MULTIPLE); + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + return intent; + } + public static Intent createAttentionRequestIntent(Context context, AccountJid account, UserJid user) { Intent intent = ChatActivity.createClearTopIntent(context, account, user); intent.setAction(ACTION_ATTENTION); @@ -373,15 +380,21 @@ protected void onResume() { && intent.getParcelableExtra(Intent.EXTRA_STREAM) != null) { Uri receivedUri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM); + intent.removeExtra(Intent.EXTRA_STREAM); handleShareFileUri(receivedUri); } else if (Intent.ACTION_SEND.equals(intent.getAction())) { - extraText = intent.getStringExtra(Intent.EXTRA_TEXT); + extraText = intent.getStringExtra(Intent.EXTRA_TEXT); if (extraText != null) { intent.removeExtra(Intent.EXTRA_TEXT); exitOnSend = true; } + + } else if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { + ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + intent.removeExtra(Intent.EXTRA_STREAM); + handleShareFileUris(uris); } needScrollToUnread = intent.getBooleanExtra(EXTRA_NEED_SCROLL_TO_UNREAD, false); @@ -412,6 +425,22 @@ public void handleShareFileUri(Uri fileUri) { } } + public void handleShareFileUris(ArrayList uris) { + if (uris.size() == 0) { + Toast.makeText(this, R.string.could_not_get_path_to_file, Toast.LENGTH_SHORT).show(); + return; + } + + if (uris.size() > 10) { + Toast.makeText(this, R.string.too_many_files_at_once, Toast.LENGTH_SHORT).show(); + return; + } + + if (PermissionsRequester.requestFileReadPermissionIfNeeded(this, PERMISSIONS_REQUEST_ATTACH_FILE)) { + HttpFileUploadManager.getInstance().uploadFileViaUri(account, user, uris, this); + } + } + private void handleOtrIntent(Intent intent) { String account = intent.getStringExtra(KEY_ACCOUNT); String user = intent.getStringExtra(KEY_USER); diff --git a/xabber/src/main/java/com/xabber/android/ui/activity/ContactListActivity.java b/xabber/src/main/java/com/xabber/android/ui/activity/ContactListActivity.java index 1e54e709cf..d1f3a83be2 100644 --- a/xabber/src/main/java/com/xabber/android/ui/activity/ContactListActivity.java +++ b/xabber/src/main/java/com/xabber/android/ui/activity/ContactListActivity.java @@ -192,6 +192,7 @@ private static UserJid getRoomInviteUser(Intent intent) { public void onCreate(Bundle savedInstanceState) { if (Intent.ACTION_VIEW.equals(getIntent().getAction()) || Intent.ACTION_SEND.equals(getIntent().getAction()) + || Intent.ACTION_SEND_MULTIPLE.equals(getIntent().getAction()) || Intent.ACTION_SENDTO.equals(getIntent().getAction()) || Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) { ActivityManager.getInstance().startNewTask(this); @@ -629,6 +630,15 @@ public void onContactClick(AbstractContact abstractContact) { finish(); } break; + case Intent.ACTION_SEND_MULTIPLE: + if (getIntent().getExtras() != null) { + action = null; + startActivity(ChatActivity.createSendUrisIntent(this, + abstractContact.getAccount(), abstractContact.getUser(), + getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM))); + finish(); + } + break; case Intent.ACTION_CREATE_SHORTCUT: { createShortcut(abstractContact); finish(); From 3c39625312846eaf8ab489c3d5ba8e4d0515dd94 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 28 Mar 2019 17:13:14 +0500 Subject: [PATCH 77/97] Fixes for sharing multiply files via Xabber --- .../main/java/com/xabber/android/ui/activity/ChatActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java index 3ddebfdf43..a4aa30c37d 100644 --- a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java +++ b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java @@ -520,6 +520,9 @@ private void getSelectedPageDataFromIntent() { case Intent.ACTION_SEND: selectedPagePosition = ChatViewerAdapter.PAGE_POSITION_CHAT; break; + case Intent.ACTION_SEND_MULTIPLE: + selectedPagePosition = ChatViewerAdapter.PAGE_POSITION_CHAT; + break; case ACTION_FORWARD: selectedPagePosition = ChatViewerAdapter.PAGE_POSITION_CHAT; break; From 3d33d1eda9c60f72f9bc544ae93b8a8eabf80d54 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 28 Mar 2019 17:26:36 +0500 Subject: [PATCH 78/97] Fixes for sharing multiply files via Xabber --- .../java/com/xabber/android/ui/activity/ChatActivity.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java index a4aa30c37d..7c8e5c9906 100644 --- a/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java +++ b/xabber/src/main/java/com/xabber/android/ui/activity/ChatActivity.java @@ -393,8 +393,10 @@ protected void onResume() { } else if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); - intent.removeExtra(Intent.EXTRA_STREAM); - handleShareFileUris(uris); + if (uris != null) { + intent.removeExtra(Intent.EXTRA_STREAM); + handleShareFileUris(uris); + } } needScrollToUnread = intent.getBooleanExtra(EXTRA_NEED_SCROLL_TO_UNREAD, false); From f9d794426c4614e711f000bafed44caa931f8fb3 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 28 Mar 2019 18:05:56 +0500 Subject: [PATCH 79/97] Up version to 598 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 989cf29320..4a68f4f236 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 597 - versionName '2.6.3(597)' + versionCode 598 + versionName '2.6.3(598)' } lintOptions { From 5ca73f2a0d92733907f33acea85636c4d8efeb33 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 29 Mar 2019 11:26:10 +0500 Subject: [PATCH 80/97] Fixed bug in chatMarkerManager on send markers with null stanzaId --- .../data/extension/chat_markers/ChatMarkerManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java index a17371cbb9..3f91ce0874 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/chat_markers/ChatMarkerManager.java @@ -97,6 +97,8 @@ public void onStanza(ConnectionItem connection, Stanza packet) { } public void sendDisplayed(MessageItem messageItem) { + if (messageItem.getStanzaId() == null || messageItem.getStanzaId().isEmpty()) return; + Message displayed = new Message(messageItem.getUser().getJid()); displayed.addExtension(new ChatMarkersElements.DisplayedExtension(messageItem.getStanzaId())); displayed.setType(Message.Type.chat); @@ -155,6 +157,8 @@ private boolean isClientSupportChatMarkers(AccountJid account, UserJid user) { } private void sendReceived(Message message, AccountJid account) { + if (message.getStanzaId() == null || message.getStanzaId().isEmpty()) return; + Message received = new Message(message.getFrom()); received.addExtension(new ChatMarkersElements.ReceivedExtension(message.getStanzaId())); received.setThread(message.getThread()); From afb8e875a9c2f81b54babd8b18596165a272cfce Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 29 Mar 2019 11:49:52 +0500 Subject: [PATCH 81/97] Added select contact toast to forward and send multiply intents in contact list --- .../com/xabber/android/ui/activity/ContactListActivity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xabber/src/main/java/com/xabber/android/ui/activity/ContactListActivity.java b/xabber/src/main/java/com/xabber/android/ui/activity/ContactListActivity.java index d1f3a83be2..f3e5ed6700 100644 --- a/xabber/src/main/java/com/xabber/android/ui/activity/ContactListActivity.java +++ b/xabber/src/main/java/com/xabber/android/ui/activity/ContactListActivity.java @@ -343,6 +343,8 @@ protected void onResume() { switch (action) { case ContactListActivity.ACTION_ROOM_INVITE: case Intent.ACTION_SEND: + case Intent.ACTION_SEND_MULTIPLE: + case ChatActivity.ACTION_FORWARD: case Intent.ACTION_CREATE_SHORTCUT: if (Intent.ACTION_SEND.equals(action)) { sendText = getIntent().getStringExtra(Intent.EXTRA_TEXT); From dab4f8a5ef29b784a3a919d49fabf813dbf96c67 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 29 Mar 2019 14:47:28 +0500 Subject: [PATCH 82/97] Do not show unavailable statuses in chat screen --- .../android/ui/helper/NewContactTitleInflater.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/helper/NewContactTitleInflater.java b/xabber/src/main/java/com/xabber/android/ui/helper/NewContactTitleInflater.java index 401556eaaa..1ad79c0f82 100644 --- a/xabber/src/main/java/com/xabber/android/ui/helper/NewContactTitleInflater.java +++ b/xabber/src/main/java/com/xabber/android/ui/helper/NewContactTitleInflater.java @@ -7,6 +7,7 @@ import android.widget.TextView; import com.xabber.android.R; +import com.xabber.android.data.account.StatusMode; import com.xabber.android.data.extension.avatar.AvatarManager; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.message.NotificationState; @@ -84,12 +85,12 @@ private static void setStatus(Context context, View titleView, AbstractContact a } else if (chatState == ChatState.paused) { statusText = context.getString(R.string.chat_state_paused); } else { - statusText = abstractContact.getStatusText().trim(); - if (statusText.toString().isEmpty()) { + if (StatusMode.unavailable == abstractContact.getStatusMode()) statusText = getLastActivity(abstractContact); - if (statusText.length() <= 0) - statusText = context.getString(abstractContact.getStatusMode().getStringID()); - } + else statusText = abstractContact.getStatusText().trim(); + + if (statusText.toString().isEmpty()) + statusText = context.getString(abstractContact.getStatusMode().getStringID()); } statusTextView.setText(statusText); } From 3612a97aa11e62256c9b384ae9dd3a4d839ade33 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 29 Mar 2019 16:10:27 +0500 Subject: [PATCH 83/97] Fixed removing notification after reply --- .../MessageNotificationManager.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java index de04a80b05..ed6dedc77c 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationManager.java @@ -3,6 +3,7 @@ import android.app.NotificationManager; import android.content.Context; import android.os.Build; +import android.os.Handler; import com.xabber.android.R; import com.xabber.android.data.Application; @@ -26,8 +27,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Timer; -import java.util.TimerTask; import java.util.UUID; import io.realm.Realm; @@ -422,7 +421,7 @@ public class Chat { private CharSequence chatTitle; private boolean isGroupChat; private List messages = new ArrayList<>(); - private Timer removeTimer; + private Handler removeTimer; public Chat(AccountJid accountJid, UserJid userJid, int notificationId, CharSequence chatTitle, boolean isGroupChat) { @@ -489,23 +488,28 @@ public boolean equals(AccountJid account, UserJid user) { } public void startRemoveTimer() { - stopRemoveTimer(); - removeTimer = new Timer(); - removeTimer.schedule(new TimerTask() { + Application.getInstance().runOnUiThread(new Runnable() { @Override public void run() { - Application.getInstance().runOnUiThread(new Runnable() { + stopRemoveTimer(); + removeTimer = new Handler(); + removeTimer.postDelayed(new Runnable() { @Override public void run() { - removeChat(notificationId); + Application.getInstance().runOnUiThread(new Runnable() { + @Override + public void run() { + removeChat(notificationId); + } + }); } - }); + }, 500); } - }, 500); + }); } public void stopRemoveTimer() { - if (removeTimer != null) removeTimer.cancel(); + if (removeTimer != null) removeTimer.removeCallbacksAndMessages(null); } } From 51879eedebd48a2511aa1c619cd555e424d18489 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 29 Mar 2019 16:23:16 +0500 Subject: [PATCH 84/97] Changed file mime types for sharing files --- xabber/src/main/AndroidManifest.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/xabber/src/main/AndroidManifest.xml b/xabber/src/main/AndroidManifest.xml index ec5e418220..68d6000156 100644 --- a/xabber/src/main/AndroidManifest.xml +++ b/xabber/src/main/AndroidManifest.xml @@ -71,11 +71,7 @@ - - - - - + From d0e68249a980123ed5a39d66495c37c8435e5413 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 29 Mar 2019 18:06:40 +0500 Subject: [PATCH 85/97] Changed file uploading to show preview of remote files --- .../data/extension/file/FileManager.java | 2 +- .../android/data/extension/file/UriUtils.java | 63 +++++++++++++++++ .../android/data/message/AbstractChat.java | 40 +++++++++++ .../android/data/message/MessageManager.java | 11 +++ .../xabber/android/service/UploadService.java | 68 ++++++------------- 5 files changed, 136 insertions(+), 48 deletions(-) create mode 100644 xabber/src/main/java/com/xabber/android/data/extension/file/UriUtils.java diff --git a/xabber/src/main/java/com/xabber/android/data/extension/file/FileManager.java b/xabber/src/main/java/com/xabber/android/data/extension/file/FileManager.java index 72a4908fc1..fd18cf7afe 100644 --- a/xabber/src/main/java/com/xabber/android/data/extension/file/FileManager.java +++ b/xabber/src/main/java/com/xabber/android/data/extension/file/FileManager.java @@ -66,7 +66,7 @@ public static boolean fileIsImage(File file) { return extensionIsImage(extractRelevantExtension(file.getPath())); } - private static boolean extensionIsImage(String extension) { + public static boolean extensionIsImage(String extension) { return Arrays.asList(VALID_IMAGE_EXTENSIONS).contains(extension); } diff --git a/xabber/src/main/java/com/xabber/android/data/extension/file/UriUtils.java b/xabber/src/main/java/com/xabber/android/data/extension/file/UriUtils.java new file mode 100644 index 0000000000..1f2a5a1168 --- /dev/null +++ b/xabber/src/main/java/com/xabber/android/data/extension/file/UriUtils.java @@ -0,0 +1,63 @@ +package com.xabber.android.data.extension.file; + +import android.database.Cursor; +import android.net.Uri; +import android.provider.OpenableColumns; +import android.webkit.MimeTypeMap; + +import com.xabber.android.data.Application; + +import org.apache.commons.io.FilenameUtils; + +import java.util.UUID; + +public class UriUtils { + + public static boolean uriIsImage(Uri uri) { + return FileManager.extensionIsImage(getExtensionFromUri(uri)); + } + + public static String getFullFileName(Uri uri) { + String extension = getExtensionFromUri(uri); + String name = getFileName(uri); + if (name == null) name = UUID.randomUUID().toString(); + else name = name.replace(".", ""); + String fileName = name + "." + extension; + return fileName; + } + + public static String getMimeType(Uri uri) { + String type = Application.getInstance().getContentResolver().getType(uri); + if (type == null || type.isEmpty()) type = "*/*"; + return type; + } + + private static String getExtensionFromUri(Uri uri) { + String mimeType = Application.getInstance().getContentResolver().getType(uri); + return MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); + } + + private static String getFileName(Uri uri) { + String result = null; + if (uri.getScheme().equals("content")) { + Cursor cursor = Application.getInstance().getContentResolver() + .query(uri, null, null, null, null); + try { + if (cursor != null && cursor.moveToFirst()) { + result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); + } + } finally { + cursor.close(); + } + } + if (result == null) { + result = uri.getPath(); + int cut = result.lastIndexOf('/'); + if (cut != -1) { + result = result.substring(cut + 1); + } + } + return FilenameUtils.getBaseName(result); + } + +} diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 6f9686e720..29a61ea8ef 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -14,6 +14,7 @@ */ package com.xabber.android.data.message; +import android.net.Uri; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; @@ -35,6 +36,7 @@ import com.xabber.android.data.extension.chat_markers.BackpressureMessageReader; import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.file.FileManager; +import com.xabber.android.data.extension.file.UriUtils; import com.xabber.android.data.extension.forward.ForwardComment; import com.xabber.android.data.extension.httpfileupload.ExtendedFormField; import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager; @@ -482,6 +484,44 @@ public void execute(Realm realm) { return messageId; } + public String newFileMessageFromUris(final List uris) { + Realm realm = MessageDatabaseManager.getInstance().getNewBackgroundRealm(); + + final String messageId = UUID.randomUUID().toString(); + + realm.executeTransaction(new Realm.Transaction() { + @Override + public void execute(Realm realm) { + + RealmList attachments = new RealmList<>(); + for (Uri uri : uris) { + Attachment attachment = new Attachment(); + attachment.setTitle(UriUtils.getFullFileName(uri)); + attachment.setIsImage(UriUtils.uriIsImage(uri)); + attachment.setMimeType(UriUtils.getMimeType(uri)); + attachment.setDuration((long) 0); + attachments.add(attachment); + } + + MessageItem messageItem = new MessageItem(messageId); + messageItem.setAccount(account); + messageItem.setUser(user); + messageItem.setText("Sending files.."); + messageItem.setAttachments(attachments); + messageItem.setTimestamp(System.currentTimeMillis()); + messageItem.setRead(true); + messageItem.setSent(true); + messageItem.setError(false); + messageItem.setIncoming(false); + messageItem.setInProgress(true); + messageItem.setStanzaId(UUID.randomUUID().toString()); + realm.copyToRealm(messageItem); + } + }); + + return messageId; + } + /** * @return Whether chat accepts packets from specified user. */ diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index 420aa4967d..4159a02547 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -14,6 +14,7 @@ */ package com.xabber.android.data.message; +import android.net.Uri; import android.os.Environment; import android.os.Looper; import android.support.annotation.Nullable; @@ -281,6 +282,12 @@ public String createFileMessage(AccountJid account, UserJid user, List fil return chat.newFileMessage(files); } + public String createFileMessageFromUris(AccountJid account, UserJid user, List uris) { + AbstractChat chat = getOrCreateChat(account, user); + chat.openChat(); + return chat.newFileMessageFromUris(uris); + } + public void updateFileMessage(AccountJid account, UserJid user, final String messageId, final HashMap urls, final List notUploadedFilesUrls) { final AbstractChat chat = getChat(account, user); @@ -345,6 +352,10 @@ public void execute(Realm realm) { if (messageItem != null) { RealmList attachments = messageItem.getAttachments(); + // remove temporary attachments created from uri + // to replace it with attachments created from files + attachments.deleteAllFromRealm(); + for (File file : files) { Attachment attachment = new Attachment(); attachment.setFilePath(file.getPath()); diff --git a/xabber/src/main/java/com/xabber/android/service/UploadService.java b/xabber/src/main/java/com/xabber/android/service/UploadService.java index 289a0c5ab2..ebee560278 100644 --- a/xabber/src/main/java/com/xabber/android/service/UploadService.java +++ b/xabber/src/main/java/com/xabber/android/service/UploadService.java @@ -17,6 +17,7 @@ import com.xabber.android.data.entity.UserJid; import com.xabber.android.data.extension.file.FileManager; import com.xabber.android.data.extension.file.FileUtils; +import com.xabber.android.data.extension.file.UriUtils; import com.xabber.android.data.extension.httpfileupload.ImageCompressor; import com.xabber.android.data.log.LogManager; import com.xabber.android.data.message.MessageManager; @@ -115,7 +116,10 @@ private void startWorkWithUris(AccountJid account, UserJid user, List fileU } // create message with progress - String messageId = MessageManager.getInstance().createFileMessage(account, user, files); + String messageId; + if (remoteFiles.isEmpty()) + messageId = MessageManager.getInstance().createFileMessage(account, user, files); + else messageId = MessageManager.getInstance().createFileMessageFromUris(account, user, remoteFiles); // create dir File directory = new File(getDownloadDirPath()); @@ -127,30 +131,31 @@ private void startWorkWithUris(AccountJid account, UserJid user, List fileU // get files from uri's List copiedFiles = new ArrayList<>(); - for (Uri uri : remoteFiles) { - if (needStop) { - stopWork(messageId); - return; - } + if (!remoteFiles.isEmpty()) { + for (Uri uri : remoteFiles) { + if (needStop) { + stopWork(messageId); + return; + } - // copy file to local storage if need - try { - copiedFiles.add(new File(copyFileToLocalStorage(uri))); - } catch (IOException e) { - publishError(messageId, "Cannot get file: " + e.toString()); + // copy file to local storage if need + try { + copiedFiles.add(new File(copyFileToLocalStorage(uri))); + } catch (IOException e) { + publishError(messageId, "Cannot get file: " + e.toString()); + } + publishProgress(messageId, copiedFiles.size(), remoteFiles.size()); } - publishProgress(messageId, copiedFiles.size(), remoteFiles.size()); } // add attachments to message - MessageManager.getInstance().updateMessageWithNewAttachments(messageId, copiedFiles); + files.addAll(copiedFiles); + MessageManager.getInstance().updateMessageWithNewAttachments(messageId, files); // startWork for upload files List filePaths = new ArrayList<>(); for (File file : files) filePaths.add(file.getPath()); - for (File file : copiedFiles) - filePaths.add(file.getPath()); startWork(account, user, filePaths, uploadServerUrl, messageId); } @@ -341,11 +346,7 @@ private String generateErrorDescriptionForFiles(List files, List } private String copyFileToLocalStorage(Uri uri) throws IOException { - String extension = getExtensionFromUri(uri); - String name = getFileName(uri); - if (name == null) name = UUID.randomUUID().toString(); - else name = name.replace(".", ""); - String fileName = name + "." + extension; + String fileName = UriUtils.getFullFileName(uri); File file = new File(getDownloadDirPath(), fileName); OutputStream os = null; @@ -371,31 +372,4 @@ private String copyFileToLocalStorage(Uri uri) throws IOException { } return file.getPath(); } - - private String getExtensionFromUri(Uri uri) { - String mimeType = getContentResolver().getType(uri); - return MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType); - } - - private String getFileName(Uri uri) { - String result = null; - if (uri.getScheme().equals("content")) { - Cursor cursor = getContentResolver().query(uri, null, null, null, null); - try { - if (cursor != null && cursor.moveToFirst()) { - result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); - } - } finally { - cursor.close(); - } - } - if (result == null) { - result = uri.getPath(); - int cut = result.lastIndexOf('/'); - if (cut != -1) { - result = result.substring(cut + 1); - } - } - return FilenameUtils.getBaseName(result); - } } From 4a90577da9c3731dac9dbaeee26e8f37b8eb652f Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 29 Mar 2019 18:22:01 +0500 Subject: [PATCH 86/97] Refactoring in file uploading --- .../android/data/message/AbstractChat.java | 92 ++++++++----------- .../android/data/message/MessageManager.java | 5 +- 2 files changed, 38 insertions(+), 59 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java index 29a61ea8ef..57d1974d96 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java +++ b/xabber/src/main/java/com/xabber/android/data/message/AbstractChat.java @@ -437,33 +437,16 @@ protected MessageItem createMessageItem(String uid, Resourcepart resource, Strin return messageItem; } - public String newFileMessage(final List files) { + public String newFileMessage(final List files, final List uris) { Realm realm = MessageDatabaseManager.getInstance().getNewBackgroundRealm(); - final String messageId = UUID.randomUUID().toString(); realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { - - RealmList attachments = new RealmList<>(); - for (File file : files) { - Attachment attachment = new Attachment(); - attachment.setFilePath(file.getPath()); - attachment.setFileSize(file.length()); - attachment.setTitle(file.getName()); - attachment.setIsImage(FileManager.fileIsImage(file)); - attachment.setMimeType(HttpFileUploadManager.getMimeType(file.getPath())); - attachment.setDuration((long) 0); - - if (attachment.isImage()) { - HttpFileUploadManager.ImageSize imageSize = - HttpFileUploadManager.getImageSizes(file.getPath()); - attachment.setImageHeight(imageSize.getHeight()); - attachment.setImageWidth(imageSize.getWidth()); - } - attachments.add(attachment); - } + RealmList attachments; + if (files != null) attachments = attachmentsFromFiles(files); + else attachments = attachmentsFromUris(uris); MessageItem messageItem = new MessageItem(messageId); messageItem.setAccount(account); @@ -484,42 +467,39 @@ public void execute(Realm realm) { return messageId; } - public String newFileMessageFromUris(final List uris) { - Realm realm = MessageDatabaseManager.getInstance().getNewBackgroundRealm(); - - final String messageId = UUID.randomUUID().toString(); - - realm.executeTransaction(new Realm.Transaction() { - @Override - public void execute(Realm realm) { - - RealmList attachments = new RealmList<>(); - for (Uri uri : uris) { - Attachment attachment = new Attachment(); - attachment.setTitle(UriUtils.getFullFileName(uri)); - attachment.setIsImage(UriUtils.uriIsImage(uri)); - attachment.setMimeType(UriUtils.getMimeType(uri)); - attachment.setDuration((long) 0); - attachments.add(attachment); - } - - MessageItem messageItem = new MessageItem(messageId); - messageItem.setAccount(account); - messageItem.setUser(user); - messageItem.setText("Sending files.."); - messageItem.setAttachments(attachments); - messageItem.setTimestamp(System.currentTimeMillis()); - messageItem.setRead(true); - messageItem.setSent(true); - messageItem.setError(false); - messageItem.setIncoming(false); - messageItem.setInProgress(true); - messageItem.setStanzaId(UUID.randomUUID().toString()); - realm.copyToRealm(messageItem); + public RealmList attachmentsFromFiles(List files) { + RealmList attachments = new RealmList<>(); + for (File file : files) { + Attachment attachment = new Attachment(); + attachment.setFilePath(file.getPath()); + attachment.setFileSize(file.length()); + attachment.setTitle(file.getName()); + attachment.setIsImage(FileManager.fileIsImage(file)); + attachment.setMimeType(HttpFileUploadManager.getMimeType(file.getPath())); + attachment.setDuration((long) 0); + + if (attachment.isImage()) { + HttpFileUploadManager.ImageSize imageSize = + HttpFileUploadManager.getImageSizes(file.getPath()); + attachment.setImageHeight(imageSize.getHeight()); + attachment.setImageWidth(imageSize.getWidth()); } - }); - - return messageId; + attachments.add(attachment); + } + return attachments; + } + + public RealmList attachmentsFromUris(List uris) { + RealmList attachments = new RealmList<>(); + for (Uri uri : uris) { + Attachment attachment = new Attachment(); + attachment.setTitle(UriUtils.getFullFileName(uri)); + attachment.setIsImage(UriUtils.uriIsImage(uri)); + attachment.setMimeType(UriUtils.getMimeType(uri)); + attachment.setDuration((long) 0); + attachments.add(attachment); + } + return attachments; } /** diff --git a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java index 4159a02547..4c5774ef8d 100644 --- a/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java +++ b/xabber/src/main/java/com/xabber/android/data/message/MessageManager.java @@ -277,15 +277,14 @@ public void execute(Realm realm) { public String createFileMessage(AccountJid account, UserJid user, List files) { AbstractChat chat = getOrCreateChat(account, user); - chat.openChat(); - return chat.newFileMessage(files); + return chat.newFileMessage(files, null); } public String createFileMessageFromUris(AccountJid account, UserJid user, List uris) { AbstractChat chat = getOrCreateChat(account, user); chat.openChat(); - return chat.newFileMessageFromUris(uris); + return chat.newFileMessage(null, uris); } public void updateFileMessage(AccountJid account, UserJid user, final String messageId, From d8b7522b84a46be2ce4af5bfe7cb78d1d114a8ef Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Fri, 29 Mar 2019 18:22:22 +0500 Subject: [PATCH 87/97] Up version to 599 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 4a68f4f236..4d718832e3 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 598 - versionName '2.6.3(598)' + versionCode 599 + versionName '2.6.3(599)' } lintOptions { From 417bc1544ef78b2227c0e1bc74742392ef476c0d Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 1 Apr 2019 10:29:09 +0500 Subject: [PATCH 88/97] Up version of gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 21b73b1bfa..a866675c2f 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { maven { url 'https://maven.fabric.io/public' } } dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' + classpath 'com.android.tools.build:gradle:3.3.2' classpath "io.realm:realm-gradle-plugin:3.1.1" classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.frogermcs.androiddevmetrics:androiddevmetrics-plugin:0.4' From 95dbe14065a8852ba45ea3572ba0774c84d2bad7 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 1 Apr 2019 14:51:02 +0500 Subject: [PATCH 89/97] Merge changes --- .../preferences/ChannelSettingsFragment.java | 83 +++++++++++++++++-- 1 file changed, 78 insertions(+), 5 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java b/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java index 50cdd8aae3..d207d8add3 100644 --- a/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java @@ -1,22 +1,98 @@ package com.xabber.android.ui.preferences; +import android.app.AlertDialog; import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.content.DialogInterface; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Build; +import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.RingtonePreference; import android.support.annotation.RequiresApi; import android.support.annotation.StringRes; +import android.widget.Toast; import com.xabber.android.R; +import com.xabber.android.data.SettingsManager; import com.xabber.android.data.notification.MessageNotificationCreator; import com.xabber.android.data.notification.NotificationChannelUtils; +import com.xabber.android.data.notification.custom_notification.CustomNotifyPrefsManager; + +import static com.xabber.android.data.SettingsManager.NOTIFICATION_PREFERENCES; @RequiresApi(api = Build.VERSION_CODES.O) -public class ChannelSettingsFragment extends NotificationsSettingsFragment { +public class ChannelSettingsFragment extends BaseSoundPrefFragment { + + private NotificationManager notificationManager; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getPreferenceManager().setSharedPreferencesName(NOTIFICATION_PREFERENCES); + addPreferencesFromResource(R.xml.preference_notifications); + notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE); + + Preference resetPreference = getPreferenceScreen().findPreference(getString(R.string.events_reset_key)); + if (resetPreference != null) { + resetPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage(R.string.events_reset_alert) + .setPositiveButton(R.string.category_reset, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Toast.makeText(getActivity(), R.string.events_reset_toast, Toast.LENGTH_SHORT).show(); + SettingsManager.resetPreferences(getActivity(), NOTIFICATION_PREFERENCES); + NotificationChannelUtils.resetMessageChannels(notificationManager); + ((NotificationsSettings) getActivity()).restartFragment(); + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + return true; + } + }); + } + + Preference removeCustomNotifPreference = getPreferenceScreen() + .findPreference(getString(R.string.events_remove_all_custom_key)); + if (removeCustomNotifPreference != null) { + removeCustomNotifPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setMessage(R.string.events_remove_all_custom_summary) + .setPositiveButton(R.string.remove, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Toast.makeText(getActivity(), R.string.events_reset_toast, Toast.LENGTH_SHORT).show(); + CustomNotifyPrefsManager.getInstance().deleteAllNotifyPrefs(notificationManager); + ((NotificationsSettings) getActivity()).restartFragment(); + } + }) + .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + builder.create().show(); + return true; + } + }); + } + } @Override public void onResume() { @@ -68,7 +144,4 @@ protected void setNewRingtone(ChannelRingtoneHolder ringtoneHolder) { NotificationChannelUtils.updateMessageChannel(notificationManager, ringtoneHolder.type, Uri.parse(ringtoneHolder.uri), null, null); } -} - - - +} \ No newline at end of file From 369cd829efb8f71c9ded6182048fe03cff03e6bc Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 1 Apr 2019 15:32:24 +0500 Subject: [PATCH 90/97] Merge changes --- .../android/data/notification/MessageNotificationCreator.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java index f897dc6ec0..5a2ebd9c17 100644 --- a/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java +++ b/xabber/src/main/java/com/xabber/android/data/notification/MessageNotificationCreator.java @@ -85,11 +85,9 @@ public void createNotification(MessageNotificationManager.Chat chat, boolean ale .setContentText(createMessageLine(chat.getLastMessage(), chat.isGroupChat(), showText)) .setStyle(createInboxStyle(chat, showText)) .setAutoCancel(true); - if (alert && !inGracePeriod(chat)) addEffects(builder, chat.getLastMessage().getMessageText().toString(), chat, context); - } - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O && alert) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O && alert && !inGracePeriod(chat)) addEffects(builder, chat.getLastMessage().getMessageText().toString(), chat, context); builder.addAction(createMarkAsReadAction(chat.getNotificationId())) From 19c82a45f79f6a1a18d80588f0dac3821db93b8d Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 1 Apr 2019 17:07:58 +0500 Subject: [PATCH 91/97] Fixed realm migration --- .../xabber/android/data/database/RealmManager.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/data/database/RealmManager.java b/xabber/src/main/java/com/xabber/android/data/database/RealmManager.java index 4eefc326c9..50de97fb6e 100644 --- a/xabber/src/main/java/com/xabber/android/data/database/RealmManager.java +++ b/xabber/src/main/java/com/xabber/android/data/database/RealmManager.java @@ -34,7 +34,7 @@ public class RealmManager { private static final String REALM_DATABASE_NAME = "realm_database.realm"; - private static final int REALM_DATABASE_VERSION = 20; + private static final int REALM_DATABASE_VERSION = 21; private static final String LOG_TAG = RealmManager.class.getSimpleName(); private final RealmConfiguration realmConfiguration; @@ -302,10 +302,12 @@ public void migrate(DynamicRealm realm, long oldVersion, long newVersion) { } if (oldVersion == 20) { - schema.create(UploadServer.class.getSimpleName()) - .addField(UploadServer.Fields.ID, String.class, FieldAttribute.PRIMARY_KEY, FieldAttribute.REQUIRED) - .addField(UploadServer.Fields.ACCOUNT, String.class) - .addField(UploadServer.Fields.SERVER, String.class); + if (!schema.contains(UploadServer.class.getSimpleName())) { + schema.create(UploadServer.class.getSimpleName()) + .addField(UploadServer.Fields.ID, String.class, FieldAttribute.PRIMARY_KEY, FieldAttribute.REQUIRED) + .addField(UploadServer.Fields.ACCOUNT, String.class) + .addField(UploadServer.Fields.SERVER, String.class); + } oldVersion++; } From 8ef9204c35d8eaa2b33c6cb118cc397bc7410a62 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 1 Apr 2019 17:08:09 +0500 Subject: [PATCH 92/97] Up version to 600 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 4d718832e3..aa9c822d08 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 599 - versionName '2.6.3(599)' + versionCode 600 + versionName '2.6.3(600)' } lintOptions { From 254b2c559c33b73f4445d00218338abcc737ef52 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 1 Apr 2019 18:24:43 +0500 Subject: [PATCH 93/97] Fixed scroll down button implementation --- .../android/ui/fragment/ChatFragment.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java index 500f283f24..27f3ed01e8 100644 --- a/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/fragment/ChatFragment.java @@ -877,8 +877,21 @@ public void updateContact() { updateSendButtonSecurityLevel(); } + private void onScrollDownClick() { + AbstractChat chat = getChat(); + if (chat != null) { + int unread = chat.getUnreadMessageCount(); + int lastVisiblePosition = layoutManager.findLastVisibleItemPosition(); + if (unread == 0 || lastVisiblePosition + 2 >= chatMessageAdapter.getItemCount() - unread) { + // scroll down + scrollDown(); + + // scroll to unread + } else scrollToFirstUnread(unread); + } + } + private void scrollDown() { - LogManager.i(this, "scrollDown"); realmRecyclerView.scrollToPosition(chatMessageAdapter.getItemCount() - 1); } @@ -1080,10 +1093,7 @@ public void onClick(View v) { showJoinButtonIfNeed(); } if (v.getId() == R.id.btnScrollDown) { - AbstractChat chat = getChat(); - if (chat != null && chat.getUnreadMessageCount() > 0) - scrollToFirstUnread(chat.getUnreadMessageCount()); - else scrollDown(); + onScrollDownClick(); } } From f4a8240ae5001eb95d81ee3af342941d5586b1d7 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Mon, 1 Apr 2019 18:26:27 +0500 Subject: [PATCH 94/97] Up version to 601 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index aa9c822d08..58aa0d9fa9 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 600 - versionName '2.6.3(600)' + versionCode 601 + versionName '2.6.3(601)' } lintOptions { From 235208985c59630a9af57cff29fd388f56cc64a6 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Tue, 2 Apr 2019 11:12:02 +0500 Subject: [PATCH 95/97] Fixed read messages by scroll --- .../com/xabber/android/ui/adapter/chat/MessagesAdapter.java | 2 +- .../xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java index ac6be745d2..19c875d5ce 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/MessagesAdapter.java @@ -142,7 +142,7 @@ public BasicMessageVH onCreateViewHolder(ViewGroup parent, int viewType) { case VIEW_TYPE_INCOMING_MESSAGE_NOFLEX: return new NoFlexIncomingMsgVH(LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_message_incoming_noflex, parent, false), - this, this, this, appearanceStyle); + this, this, this, bindListener, appearanceStyle); case VIEW_TYPE_OUTGOING_MESSAGE: return new OutgoingMessageVH(LayoutInflater.from(parent.getContext()) diff --git a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java index 40aaa19f91..e14c120aa6 100644 --- a/xabber/src/main/java/com/xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java +++ b/xabber/src/main/java/com/xabber/android/ui/adapter/chat/NoFlexIncomingMsgVH.java @@ -8,8 +8,8 @@ public class NoFlexIncomingMsgVH extends IncomingMessageVH { public NoFlexIncomingMsgVH(View itemView, MessageClickListener messageListener, MessageLongClickListener longClickListener, - FileListener fileListener, int appearance) { - super(itemView, messageListener, longClickListener, fileListener, null, appearance); + FileListener fileListener, BindListener listener, int appearance) { + super(itemView, messageListener, longClickListener, fileListener, listener, appearance); } @Override From 0b32eccf030da9309250878f4d599ef0f5b08734 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 4 Apr 2019 10:30:31 +0500 Subject: [PATCH 96/97] Fixed NPE in getSoundTitle --- .../android/ui/preferences/ChannelSettingsFragment.java | 3 ++- .../android/ui/preferences/CustomNotifSettingsFragment.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java b/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java index d207d8add3..ee718c1a79 100644 --- a/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/preferences/ChannelSettingsFragment.java @@ -136,7 +136,8 @@ private String getSoundTitle(NotificationChannel channel) { if (channel == null) return null; Uri uri = channel.getSound(); Ringtone ringtone = RingtoneManager.getRingtone(getActivity(), uri); - return ringtone.getTitle(getActivity()); + if (ringtone != null) return ringtone.getTitle(getActivity()); + else return "Unknown ringtone"; } @Override diff --git a/xabber/src/main/java/com/xabber/android/ui/preferences/CustomNotifSettingsFragment.java b/xabber/src/main/java/com/xabber/android/ui/preferences/CustomNotifSettingsFragment.java index 9e4b0feb18..3837376423 100644 --- a/xabber/src/main/java/com/xabber/android/ui/preferences/CustomNotifSettingsFragment.java +++ b/xabber/src/main/java/com/xabber/android/ui/preferences/CustomNotifSettingsFragment.java @@ -123,13 +123,15 @@ private String getSoundTitle(NotificationChannel channel) { if (channel == null) return null; Uri uri = channel.getSound(); Ringtone ringtone = RingtoneManager.getRingtone(getActivity(), uri); - return ringtone.getTitle(getActivity()); + if (ringtone != null) return ringtone.getTitle(getActivity()); + else return "Unknown ringtone"; } private String getSoundTitle(NotifyPrefs notifyPrefs) { Uri uri = Uri.parse(notifyPrefs.getSound()); Ringtone ringtone = RingtoneManager.getRingtone(getActivity(), uri); - return ringtone.getTitle(getActivity()); + if (ringtone != null) return ringtone.getTitle(getActivity()); + else return "Unknown ringtone"; } private String getVibroSummary(Context context, NotifyPrefs notifyPrefs) { From 038e9bb297c952f1f8d961b9ea0e1cfed9ecf7f3 Mon Sep 17 00:00:00 2001 From: Valery Miller Date: Thu, 4 Apr 2019 10:31:44 +0500 Subject: [PATCH 97/97] Up version to 602 --- xabber/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xabber/build.gradle b/xabber/build.gradle index 58aa0d9fa9..55ad17e937 100644 --- a/xabber/build.gradle +++ b/xabber/build.gradle @@ -10,8 +10,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 28 - versionCode 601 - versionName '2.6.3(601)' + versionCode 602 + versionName '2.6.3(602)' } lintOptions {