diff --git a/jni/dc_wrapper.c b/jni/dc_wrapper.c index 5b3d1f67e..a126a9cde 100644 --- a/jni/dc_wrapper.c +++ b/jni/dc_wrapper.c @@ -566,6 +566,12 @@ JNIEXPORT void Java_com_b44t_messenger_DcContext_marknoticedChat(JNIEnv *env, jo } +JNIEXPORT void Java_com_b44t_messenger_DcContext_markfreshChat(JNIEnv *env, jobject obj, jint chat_id) +{ + dc_markfresh_chat(get_dc_context(env, obj), chat_id); +} + + JNIEXPORT void Java_com_b44t_messenger_DcContext_setChatVisibility(JNIEnv *env, jobject obj, jint chat_id, jint visibility) { dc_set_chat_visibility(get_dc_context(env, obj), chat_id, visibility); diff --git a/src/main/java/com/b44t/messenger/DcContext.java b/src/main/java/com/b44t/messenger/DcContext.java index d972001b9..9211ff768 100644 --- a/src/main/java/com/b44t/messenger/DcContext.java +++ b/src/main/java/com/b44t/messenger/DcContext.java @@ -217,6 +217,8 @@ public class DcContext { public native void marknoticedChat(int chat_id); + public native void markfreshChat(int chat_id); + public native void setChatVisibility(int chat_id, int visibility); public native int getChatIdByContactId(int contact_id); diff --git a/src/main/java/org/thoughtcrime/securesms/BaseConversationListFragment.java b/src/main/java/org/thoughtcrime/securesms/BaseConversationListFragment.java index a7887863f..ad3bb054d 100644 --- a/src/main/java/org/thoughtcrime/securesms/BaseConversationListFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/BaseConversationListFragment.java @@ -170,6 +170,17 @@ public abstract class BaseConversationListFragment extends Fragment implements A return false; } + private boolean areSomeSelectedChatsNoticed() { + DcContext dcContext = DcHelper.getContext(requireActivity()); + final Set selectedChats = getListAdapter().getBatchSelections(); + for (long chatId : selectedChats) { + if (dcContext.getFreshMsgCount((int) chatId) <= 0) { + return true; + } + } + return false; + } + private void handlePinAllSelected() { final DcContext dcContext = DcHelper.getContext(requireActivity()); final Set selectedConversations = @@ -229,6 +240,19 @@ public abstract class BaseConversationListFragment extends Fragment implements A } } + private void handleMarkfreshSelected() { + final DcContext dcContext = DcHelper.getContext(requireActivity()); + final Set selectedConversations = + new HashSet(getListAdapter().getBatchSelections()); + for (long chatId : selectedConversations) { + dcContext.markfreshChat((int) chatId); + } + if (actionMode != null) { + actionMode.finish(); + actionMode = null; + } + } + @SuppressLint("StaticFieldLeak") private void handleArchiveAllSelected() { final DcContext dcContext = DcHelper.getContext(requireActivity()); @@ -409,6 +433,7 @@ public abstract class BaseConversationListFragment extends Fragment implements A if (!isRelayingMessageContent(requireActivity())) { final int selectedCount = getListAdapter().getBatchSelections().size(); menu.findItem(R.id.menu_add_to_home_screen).setVisible(selectedCount == 1); + MenuItem archiveItem = menu.findItem(R.id.menu_archive_selected); if (offerToArchive()) { archiveItem.setIcon(R.drawable.ic_archive_white_24dp); @@ -417,6 +442,7 @@ public abstract class BaseConversationListFragment extends Fragment implements A archiveItem.setIcon(R.drawable.ic_unarchive_white_24dp); archiveItem.setTitle(R.string.menu_unarchive_chat); } + MenuItem pinItem = menu.findItem(R.id.menu_pin_selected); if (areSomeSelectedChatsUnpinned()) { pinItem.setIcon(R.drawable.ic_pin_white); @@ -425,12 +451,17 @@ public abstract class BaseConversationListFragment extends Fragment implements A pinItem.setIcon(R.drawable.ic_unpin_white); pinItem.setTitle(R.string.unpin_chat); } + MenuItem muteItem = menu.findItem(R.id.menu_mute_selected); if (areSomeSelectedChatsUnmuted()) { muteItem.setTitle(R.string.menu_mute); } else { muteItem.setTitle(R.string.menu_unmute); } + + final boolean someAreNoticed = areSomeSelectedChatsNoticed(); + menu.findItem(R.id.menu_marknoticed_selected).setVisible(!someAreNoticed); + menu.findItem(R.id.menu_markfresh_selected).setVisible(someAreNoticed); } } @@ -484,6 +515,9 @@ public abstract class BaseConversationListFragment extends Fragment implements A } else if (itemId == R.id.menu_marknoticed_selected) { handleMarknoticedSelected(); return true; + } else if (itemId == R.id.menu_markfresh_selected) { + handleMarkfreshSelected(); + return true; } else if (itemId == R.id.menu_add_to_home_screen) { handleAddToHomeScreen(); return true; diff --git a/src/main/res/menu/conversation_list.xml b/src/main/res/menu/conversation_list.xml index a0070a0f4..9c776629e 100644 --- a/src/main/res/menu/conversation_list.xml +++ b/src/main/res/menu/conversation_list.xml @@ -31,6 +31,11 @@ android:id="@+id/menu_marknoticed_selected" app:showAsAction="never" /> + + Show Full Message… Mark All as Read + Mark as Read - + Mark Read - + + Mark as Unread + Unread Loading…