diff --git a/src/cheogram/res/values/strings.xml b/src/cheogram/res/values/strings.xml index ed2152ab9b54fdf514f1432163029b5e24ec2f41..d4bc883598daf9b0b2d61f4d067b5ab49140155c 100644 --- a/src/cheogram/res/values/strings.xml +++ b/src/cheogram/res/values/strings.xml @@ -25,6 +25,7 @@ Go OLED Black Invite to Chat + Show only this thread Use Phone Accounts for Incoming Calls Incoming calls from phone numbers may ring with your system dialler instead of this app\'s notification settings diff --git a/src/cheogram/res/values/themes.xml b/src/cheogram/res/values/themes.xml index c7d21f641b9163938934e6958c73c2f4317a9810..55494cea1a2b4a4b56220eeabb5fe28ea84b7f18 100644 --- a/src/cheogram/res/values/themes.xml +++ b/src/cheogram/res/values/themes.xml @@ -121,6 +121,7 @@ @drawable/ic_help_white_24dp @drawable/ic_question_answer_white_24dp @drawable/ic_lock_open_white_24dp + @drawable/ic_lock_black_18dp @drawable/ic_settings_black_24dp @drawable/ic_share_white_24dp @drawable/ic_cloud_download_white_24dp @@ -275,6 +276,7 @@ @drawable/ic_help_white_24dp @drawable/ic_question_answer_white_24dp @drawable/ic_lock_open_white_24dp + @drawable/ic_lock_white_18dp @drawable/ic_settings_white_24dp @drawable/ic_share_white_24dp @drawable/ic_cloud_download_white_24dp diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 0a25dd7b869020fcb2ed9babbffea391e04ff04f..e7e098815eaf1c1541c634fb11f945770588f2e4 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -149,6 +149,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl protected int mCurrentTab = -1; protected ConversationPagerAdapter pagerAdapter = new ConversationPagerAdapter(); protected Element thread = null; + protected boolean lockThread = false; protected boolean userSelectedThread = false; public Conversation(final String name, final Account account, final Jid contactJid, @@ -531,7 +532,8 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl messages.addAll(this.messages); } for (Iterator iterator = messages.iterator(); iterator.hasNext(); ) { - if (iterator.next().wasMergedIntoPrevious()) { + Message m = iterator.next(); + if (m.wasMergedIntoPrevious() || (getLockThread() && (m.getThread() == null || !m.getThread().getContent().equals(getThread().getContent())))) { iterator.remove(); } } @@ -638,6 +640,15 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl this.thread = thread; } + public void setLockThread(boolean flag) { + this.lockThread = flag; + if (flag) setUserSelectedThread(true); + } + + public boolean getLockThread() { + return this.lockThread; + } + public void setUserSelectedThread(boolean flag) { this.userSelectedThread = flag; } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 59253fa1fc330a0a217fc7bf18a52348c2c4930e..358e7a558947856183789a3fe5e1759553c8cc3d 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1257,14 +1257,20 @@ public class ConversationFragment extends XmppFragment conversation.setUserSelectedThread(true); }); - binding.threadIdenticon.setOnClickListener(v -> { + binding.threadIdenticonLayout.setOnClickListener(v -> { + boolean wasLocked = conversation.getLockThread(); + conversation.setLockThread(false); newThread(); conversation.setUserSelectedThread(true); + if (wasLocked) refresh(); }); - binding.threadIdenticon.setOnLongClickListener(v -> { + binding.threadIdenticonLayout.setOnLongClickListener(v -> { + boolean wasLocked = conversation.getLockThread(); + conversation.setLockThread(false); setThread(null); conversation.setUserSelectedThread(true); + if (wasLocked) refresh(); return true; }); @@ -1303,6 +1309,7 @@ public class ConversationFragment extends XmppFragment private void setThread(Element thread) { this.conversation.setThread(thread); binding.threadIdenticon.setAlpha(0f); + binding.threadIdenticonLock.setVisibility(this.conversation.getLockThread() ? View.VISIBLE : View.GONE); if (thread != null) { final String threadId = thread.getContent(); if (threadId != null) { @@ -1362,6 +1369,7 @@ public class ConversationFragment extends XmppFragment MenuItem retryDecryption = menu.findItem(R.id.retry_decryption); MenuItem correctMessage = menu.findItem(R.id.correct_message); MenuItem retractMessage = menu.findItem(R.id.retract_message); + MenuItem onlyThisThread = menu.findItem(R.id.only_this_thread); MenuItem shareWith = menu.findItem(R.id.share_with); MenuItem sendAgain = menu.findItem(R.id.send_again); MenuItem copyUrl = menu.findItem(R.id.copy_url); @@ -1369,6 +1377,7 @@ public class ConversationFragment extends XmppFragment MenuItem cancelTransmission = menu.findItem(R.id.cancel_transmission); MenuItem deleteFile = menu.findItem(R.id.delete_file); MenuItem showErrorMessage = menu.findItem(R.id.show_error_message); + onlyThisThread.setVisible(!conversation.getLockThread() && m.getThread() != null); final boolean unInitiatedButKnownSize = MessageUtils.unInitiatedButKnownSize(m); final boolean showError = m.getStatus() == Message.STATUS_SEND_FAILED @@ -1505,6 +1514,12 @@ public class ConversationFragment extends XmppFragment case R.id.open_with: openWith(selectedMessage); return true; + case R.id.only_this_thread: + conversation.setLockThread(true); + setThread(selectedMessage.getThread()); + refresh(); + setThread(selectedMessage.getThread()); + return true; default: return super.onContextItemSelected(item); } diff --git a/src/main/res/layout/fragment_conversation.xml b/src/main/res/layout/fragment_conversation.xml index 861e3a1e429b97d2beaf1a8a283c169967af7c50..477ecf3f012a51b675de67ac4593e09424bc243b 100644 --- a/src/main/res/layout/fragment_conversation.xml +++ b/src/main/res/layout/fragment_conversation.xml @@ -62,8 +62,8 @@ android:layout_height="wrap_content" android:layout_toStartOf="@+id/textSendButton" android:layout_toLeftOf="@+id/textSendButton" - android:layout_toEndOf="@+id/thread_identicon" - android:layout_toRightOf="@+id/thread_identicon" + android:layout_toEndOf="@+id/thread_identicon_layout" + android:layout_toRightOf="@+id/thread_identicon_layout" android:orientation="vertical"> - + android:layout_marginLeft="8dp"> + + + + + + + +