diff options
10 files changed, 116 insertions, 26 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/Account.java b/src/main/java/de/pixart/messenger/entities/Account.java index 1bdd130d5..2c7dbfbdc 100644 --- a/src/main/java/de/pixart/messenger/entities/Account.java +++ b/src/main/java/de/pixart/messenger/entities/Account.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; @@ -505,6 +506,17 @@ public class Account extends AbstractEntity { this.bookmarks = bookmarks; } + public Set<Jid> getBookmarkedJids() { + final Set<Jid> jids = new HashSet<>(); + for (final Bookmark bookmark : this.bookmarks) { + final Jid jid = bookmark.getJid(); + if (jid != null) { + jids.add(jid.asBareJid()); + } + } + return jids; + } + public boolean hasBookmarkFor(final Jid conferenceJid) { return getBookmark(conferenceJid) != null; } diff --git a/src/main/java/de/pixart/messenger/generator/IqGenerator.java b/src/main/java/de/pixart/messenger/generator/IqGenerator.java index 160496273..b2f43cbcf 100644 --- a/src/main/java/de/pixart/messenger/generator/IqGenerator.java +++ b/src/main/java/de/pixart/messenger/generator/IqGenerator.java @@ -358,7 +358,7 @@ public class IqGenerator extends AbstractGenerator { return packet; } - public IqPacket destroyConference(Conversation conference) { + public IqPacket destroyRoom(Conversation conference) { IqPacket packet = new IqPacket(IqPacket.TYPE.SET); packet.setTo(conference.getJid().asBareJid()); packet.setFrom(conference.getAccount().getJid()); diff --git a/src/main/java/de/pixart/messenger/persistance/FileBackend.java b/src/main/java/de/pixart/messenger/persistance/FileBackend.java index 2703f0538..705e5489b 100644 --- a/src/main/java/de/pixart/messenger/persistance/FileBackend.java +++ b/src/main/java/de/pixart/messenger/persistance/FileBackend.java @@ -294,9 +294,12 @@ public class FileBackend { } File file = new File(path); long size = file.length(); - if (size == 0 || size >= mXmppConnectionService.getCompressImageSizePreference()) { + if ((size == 0 || size >= mXmppConnectionService.getCompressImageSizePreference()) && mXmppConnectionService.getCompressImageSizePreference() != 0) { return false; } + if (mXmppConnectionService.getCompressImageResolutionPreference() == 0 && mXmppConnectionService.getCompressImageSizePreference() == 0 ) { + return true; + } BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; try { @@ -450,7 +453,7 @@ public class FileBackend { throw new FileCopyException(R.string.error_compressing_image); } os.flush(); - targetSizeReached = file.length() <= mXmppConnectionService.getCompressImageSizePreference() || quality <= 50; + targetSizeReached = (file.length() <= mXmppConnectionService.getCompressImageSizePreference() && mXmppConnectionService.getCompressImageSizePreference() != 0) || quality <= 50; quality -= 5; } scaledBitmap.recycle(); diff --git a/src/main/java/de/pixart/messenger/services/AttachFileToConversationRunnable.java b/src/main/java/de/pixart/messenger/services/AttachFileToConversationRunnable.java index 192d9221d..993de3bc6 100644 --- a/src/main/java/de/pixart/messenger/services/AttachFileToConversationRunnable.java +++ b/src/main/java/de/pixart/messenger/services/AttachFileToConversationRunnable.java @@ -49,12 +49,11 @@ public class AttachFileToConversationRunnable implements Runnable, MediaTranscod this.originalFileSize = FileBackend.getFileSize(mXmppConnectionService, uri); this.isVideoMessage = !getFileBackend().useFileAsIs(uri) && (mimeType != null && mimeType.startsWith("video/") - && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) + && (mXmppConnectionService.getCompressVideoBitratePreference() != 0 && mXmppConnectionService.getCompressVideoResolutionPreference() != 0)) && originalFileSize > autoAcceptFileSize; - } - public boolean isVideoMessage() { + boolean isVideoMessage() { return this.isVideoMessage && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; } @@ -110,8 +109,12 @@ public class AttachFileToConversationRunnable implements Runnable, MediaTranscod mXmppConnectionService.stopForcingForegroundNotification(); throw new AssertionError(e); } catch (ExecutionException e) { - mXmppConnectionService.stopForcingForegroundNotification(); - Log.d(Config.LOGTAG, "ignoring execution exception. Should get handled by onTranscodeFiled() instead", e); + if (e.getCause() instanceof Error) { + mXmppConnectionService.stopForcingForegroundNotification(); + processAsFile(); + } else { + Log.d(Config.LOGTAG, "ignoring execution exception. Should get handled by onTranscodeFiled() instead", e); + } } } diff --git a/src/main/java/de/pixart/messenger/services/NotificationService.java b/src/main/java/de/pixart/messenger/services/NotificationService.java index c4fa85322..83441cce1 100644 --- a/src/main/java/de/pixart/messenger/services/NotificationService.java +++ b/src/main/java/de/pixart/messenger/services/NotificationService.java @@ -23,8 +23,10 @@ import android.support.v4.app.NotificationCompat.BigPictureStyle; import android.support.v4.app.NotificationCompat.Builder; import android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation; import android.support.v4.app.NotificationManagerCompat; +import android.support.v4.app.Person; import android.support.v4.app.RemoteInput; import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.IconCompat; import android.text.SpannableString; import android.text.style.StyleSpan; import android.util.DisplayMetrics; @@ -62,6 +64,7 @@ import de.pixart.messenger.utils.Compatibility; import de.pixart.messenger.utils.GeoHelper; import de.pixart.messenger.utils.UIHelper; import de.pixart.messenger.xmpp.XmppConnection; +import rocks.xmpp.addr.Jid; public class NotificationService { @@ -636,15 +639,54 @@ public class NotificationService { } } + private Person getPerson(Message message) { + final Contact contact = message.getContact(); + final Person.Builder builder = new Person.Builder(); + if (contact != null) { + builder.setName(contact.getDisplayName()); + final Uri uri = contact.getSystemAccount(); + if (uri != null) { + builder.setUri(uri.toString()); + } + } else { + builder.setName(UIHelper.getMessageDisplayName(message)); + } + IconCompat icon = getIcon(message); + if (icon != null) { + builder.setIcon(icon); + } + return builder.build(); + } + + private IconCompat getIcon(Message message) { + final Contact contact; + if (message.getConversation().getMode() == Conversation.MODE_SINGLE) { + contact = message.getContact(); + } else { + Jid jid = message.getTrueCounterpart(); + contact = jid == null ? null : message.getConversation().getAccount().getRoster().getContact(jid); + } + if (contact != null) { + if (contact.getProfilePhoto() != null && QuickConversationsService.isConversations()) { + return IconCompat.createWithContentUri(contact.getProfilePhoto()); + } + if (contact.getAvatarFilename() != null) { + return IconCompat.createWithContentUri(mXmppConnectionService.getFileBackend().getAvatarUri(contact.getAvatarFilename())); + } + } + return null; + } + private void modifyForTextOnly(final Builder builder, final UnreadConversation.Builder uBuilder, final ArrayList<Message> messages) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - NotificationCompat.MessagingStyle messagingStyle = new NotificationCompat.MessagingStyle(mXmppConnectionService.getString(R.string.me)); + final Person me = new Person.Builder().setName(mXmppConnectionService.getString(R.string.me)).build(); + NotificationCompat.MessagingStyle messagingStyle = new NotificationCompat.MessagingStyle(me); final Conversation conversation = (Conversation) messages.get(0).getConversation(); if (conversation.getMode() == Conversation.MODE_MULTI) { messagingStyle.setConversationTitle(conversation.getName()); } for (Message message : messages) { - String sender = message.getStatus() == Message.STATUS_RECEIVED ? UIHelper.getMessageDisplayName(message) : null; + final Person sender = message.getStatus() == Message.STATUS_RECEIVED ? getPerson(message) : null; messagingStyle.addMessage(UIHelper.getMessagePreview(mXmppConnectionService, message).first, message.getTimeSent(), sender); } builder.setStyle(messagingStyle); diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java index 644325e2c..98e330ad0 100644 --- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java +++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java @@ -127,7 +127,6 @@ import de.pixart.messenger.utils.CryptoHelper; import de.pixart.messenger.utils.ExceptionHelper; import de.pixart.messenger.utils.MimeUtils; import de.pixart.messenger.utils.Namespace; -import de.pixart.messenger.utils.OnPhoneContactsLoadedListener; import de.pixart.messenger.utils.PhoneHelper; import de.pixart.messenger.utils.QuickLoader; import de.pixart.messenger.utils.ReplacingSerialSingleThreadExecutor; @@ -894,6 +893,8 @@ public class XmppConnectionService extends Service { return 1920; case "high": return 3840; + case "uncompressed": + return 0; default: return 3840; } @@ -907,6 +908,8 @@ public class XmppConnectionService extends Service { return 524288; // 0.5 * 1024 * 1024 = 524288 (0.5 MiB) case "high": return 1048576; // 1 * 1024 * 1024 = 1048576 (1 MiB) + case "uncompressed": + return 0; default: return 524288; } @@ -920,6 +923,8 @@ public class XmppConnectionService extends Service { return 360; case "high": return 720; + case "uncompressed": + return 0; default: return 360; } @@ -933,6 +938,8 @@ public class XmppConnectionService extends Service { return 500000; case "high": return 2000000; + case "uncompressed": + return 0; default: return 500000; } @@ -1607,6 +1614,7 @@ public class XmppConnectionService extends Service { } public void processBookmarks(Account account, Element storage, final boolean pep) { + final Set<Jid> previousBookmarks = account.getBookmarkedJids(); final HashMap<Jid, Bookmark> bookmarks = new HashMap<>(); final boolean synchronizeWithBookmarks = synchronizeWithBookmarks(); if (storage != null) { @@ -1620,6 +1628,7 @@ public class XmppConnectionService extends Service { if (bookmark.getJid() == null) { continue; } + previousBookmarks.remove(bookmark.getJid().asBareJid()); Conversation conversation = find(bookmark); if (conversation != null) { if (conversation.getMode() != Conversation.MODE_MULTI) { @@ -1636,6 +1645,16 @@ public class XmppConnectionService extends Service { } } } + if (pep && synchronizeWithBookmarks) { + Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": " + previousBookmarks.size() + " bookmarks have been removed"); + for (Jid jid : previousBookmarks) { + final Conversation conversation = find(account, jid); + if (conversation != null && conversation.getMucOptions().getError() == MucOptions.Error.DESTROYED) { + Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": archiving destroyed conference (" + conversation.getJid() + ") after receiving pep"); + archiveConversation(conversation, false); + } + } + } } account.setBookmarks(new CopyOnWriteArrayList<>(bookmarks.values())); } @@ -1673,8 +1692,7 @@ public class XmppConnectionService extends Service { } private void pushNodeAndEnforcePublishOptions(final Account account, final String node, final Element element, final Bundle options, final boolean retry) { - IqPacket packet = mIqGenerator.publishElement(node, element, options); - Log.d(Config.LOGTAG, packet.toString()); + final IqPacket packet = mIqGenerator.publishElement(node, element, options); sendIqPacket(account, packet, (a, response) -> { if (response.getType() == IqPacket.TYPE.RESULT) { return; @@ -3073,29 +3091,29 @@ public class XmppConnectionService extends Service { }); } - public void destroyMuc(final Conversation mSelectedConversation) { - destroyConference(mSelectedConversation, new XmppConnectionService.OnDestroyMuc() { + public void destroyRoom(final Conversation mSelectedConversation) { + destroyRoom(mSelectedConversation, new OnRoomDestroy() { @Override - public void OnDestroyMucSuccessful(int resId) { + public void onRoomDestroySucceeded(int resId) { Log.d(Config.LOGTAG, "Destroy succeed"); showErrorToastInUi(resId); } @Override - public void OnDestroyMucFailed(int resId) { + public void onRoomDestroyFailed(int resId) { Log.d(Config.LOGTAG, "Destroy failed"); showErrorToastInUi(resId); } }); } - public void destroyConference(final Conversation conference, final OnDestroyMuc callback) { - IqPacket request = this.mIqGenerator.destroyConference(conference); + public void destroyRoom(final Conversation conference, final OnRoomDestroy callback) { + IqPacket request = this.mIqGenerator.destroyRoom(conference); sendIqPacket(conference.getAccount(), request, (account, packet) -> { if (packet.getType() == IqPacket.TYPE.RESULT) { - callback.OnDestroyMucSuccessful(R.string.destroy_muc_succeed); + callback.onRoomDestroySucceeded(R.string.destroy_muc_succeed); } else { - callback.OnDestroyMucFailed(R.string.destroy_muc_failed); + callback.onRoomDestroyFailed(R.string.destroy_muc_failed); } }); } @@ -4570,10 +4588,10 @@ public class XmppConnectionService extends Service { void onRoleChangeFailed(String nick, int resid); } - public interface OnDestroyMuc { - void OnDestroyMucSuccessful(int resId); + public interface OnRoomDestroy { + void onRoomDestroySucceeded(int resId); - void OnDestroyMucFailed(int resId); + void onRoomDestroyFailed(int resId); } public interface OnConversationUpdate { diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java index cd0a6e4d6..c2bc94263 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java @@ -3070,6 +3070,12 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke if (pendingTakePhotoUri.clear()) { Log.e(Config.LOGTAG, "cleared pending photo uri"); } + if (pendingConversationsUuid.clear()) { + Log.e(Config.LOGTAG, "cleared pending conversations uuid"); + } + if (pendingMediaPreviews.clear()) { + Log.e(Config.LOGTAG, "cleared pending media previews"); + } } private int messageInputBubble() { diff --git a/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java b/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java index 3384cbd0e..824eef87c 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java @@ -76,7 +76,6 @@ import de.pixart.messenger.entities.Conversation; import de.pixart.messenger.entities.MucOptions; import de.pixart.messenger.entities.Presence; import de.pixart.messenger.services.EmojiService; -import de.pixart.messenger.services.UpdateService; import de.pixart.messenger.services.XmppConnectionService; import de.pixart.messenger.ui.interfaces.OnBackendConnected; import de.pixart.messenger.ui.interfaces.OnConversationArchived; @@ -609,6 +608,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio protected void onNewIntent(final Intent intent) { if (isViewOrShareIntent(intent)) { if (xmppConnectionService != null) { + clearPendingViewIntent(); processViewIntent(intent); } else { pendingViewIntent.push(intent); @@ -619,7 +619,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio Log.d(Config.LOGTAG, "Get " + intent.getAction() + " intent for " + extras.getString("MUC_UUID")); Conversation conversation = xmppConnectionService.findConversationByUuid(extras.getString("MUC_UUID")); ConversationsActivity.this.xmppConnectionService.clearConversationHistory(conversation); - xmppConnectionService.destroyMuc(conversation); + xmppConnectionService.destroyRoom(conversation); endConversation(conversation); } } diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index 93da9bac4..de2e0355c 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -58,24 +58,28 @@ <item>low</item> <item>mid</item> <item>high</item> + <item>uncompressed</item> </string-array> <string-array name="image_compression_entries"> <item>@string/image_low</item> <item>@string/image_mid</item> <item>@string/image_high</item> + <item>@string/image_original</item> </string-array> <string-array name="video_compression_values"> <item>low</item> <item>mid</item> <item>high</item> + <item>uncompressed</item> </string-array> <string-array name="video_compression_entries"> <item>@string/video_low</item> <item>@string/video_mid</item> <item>@string/video_high</item> + <item>@string/video_original</item> </string-array> <string-array name="mam_prefs"> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 015a2a6c6..5d0160b7a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -506,6 +506,7 @@ <string name="video_low">low (144p)</string> <string name="video_mid">middle (360p)</string> <string name="video_high">high (720p)</string> + <string name="video_original">Original (uncompressed)</string> <string name="always">Always</string> <string name="battery_optimizations_enabled">Battery optimizations enabled</string> <string name="battery_optimizations_enabled_explained">Your device is doing some heavy battery optimizations on Pix-Art Messenger that might lead to delayed notifications or even message loss.\nIt is recommended to disable those.</string> @@ -681,6 +682,7 @@ <string name="image_low">low (720p)</string> <string name="image_mid">middle (1920p)</string> <string name="image_high">high (3840p)</string> + <string name="image_original">original (uncompressed)</string> <string name="last_seen_just_away">recently</string> <string name="send_message">Send message</string> <string name="send_failed_resend">delivery failed, resending…</string> |