diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index d64f65f82..9d41b4ea0 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -327,6 +327,7 @@ public class ConversationFragment extends MessageSelectorFragment menu.findItem(R.id.menu_context_edit).setVisible(false); menu.findItem(R.id.menu_context_reply_privately).setVisible(false); menu.findItem(R.id.menu_add_to_home_screen).setVisible(false); + menu.findItem(R.id.menu_toggle_save).setVisible(false); } else { DcMsg messageRecord = messageRecords.iterator().next(); DcChat chat = getListAdapter().getChat(); @@ -339,6 +340,9 @@ public class ConversationFragment extends MessageSelectorFragment boolean showReplyPrivately = chat.isMultiUser() && !messageRecord.isOutgoing() && canReply; menu.findItem(R.id.menu_context_reply_privately).setVisible(showReplyPrivately); menu.findItem(R.id.menu_add_to_home_screen).setVisible(messageRecord.getType() == DcMsg.DC_MSG_WEBXDC); + + menu.findItem(R.id.menu_toggle_save).setVisible(messageRecord.canSave() && !chat.isSelfTalk()); + menu.findItem(R.id.menu_toggle_save).setIcon(messageRecord.getSavedMsgId() == 0 ? R.drawable.baseline_bookmark_24 : R.drawable.baseline_bookmark_border_24); } // if one of the selected items cannot be saved, disable saving. @@ -496,6 +500,15 @@ public class ConversationFragment extends MessageSelectorFragment } } + private void handleToggleSave(final Set messageRecords) { + DcMsg msg = getSelectedMessageRecord(messageRecords); + if (msg.getSavedMsgId() != 0) { + dcContext.deleteMsgs(new int[]{msg.getSavedMsgId()}); + } else { + dcContext.saveMsgs(new int[]{msg.getId()}); + } + } + private void reloadList() { reloadList(false); } @@ -988,9 +1001,12 @@ public class ConversationFragment extends MessageSelectorFragment } else if (itemId == R.id.menu_resend) { handleResendMessage(getListAdapter().getSelectedItems()); return true; + } else if (itemId == R.id.menu_toggle_save) { + handleToggleSave(getListAdapter().getSelectedItems()); + actionMode.finish(); + return true; } - - return false; + return false; } } diff --git a/src/main/java/org/thoughtcrime/securesms/util/views/ConversationAdaptiveActionsToolbar.java b/src/main/java/org/thoughtcrime/securesms/util/views/ConversationAdaptiveActionsToolbar.java index 350932b67..d6b40a492 100644 --- a/src/main/java/org/thoughtcrime/securesms/util/views/ConversationAdaptiveActionsToolbar.java +++ b/src/main/java/org/thoughtcrime/securesms/util/views/ConversationAdaptiveActionsToolbar.java @@ -27,6 +27,7 @@ public class ConversationAdaptiveActionsToolbar extends Toolbar { private static final int ID_ACTION_2 = R.id.menu_context_copy; private static final int ID_ACTION_3 = R.id.menu_context_share; private static final int ID_ACTION_4 = R.id.menu_context_forward; + private static final int ID_ACTION_5 = R.id.menu_toggle_save; private final int maxShown; @@ -79,7 +80,8 @@ public class ConversationAdaptiveActionsToolbar extends Toolbar { boolean showAsAction = item.getItemId() == ID_ACTION_1 || item.getItemId() == ID_ACTION_2 || item.getItemId() == ID_ACTION_3 - || item.getItemId() == ID_ACTION_4; + || item.getItemId() == ID_ACTION_4 + || item.getItemId() == ID_ACTION_5; if (showAsAction && item.isVisible() && nItemsToShow > 0) { item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); diff --git a/src/main/res/drawable/baseline_bookmark_border_24.xml b/src/main/res/drawable/baseline_bookmark_border_24.xml new file mode 100644 index 000000000..d64b0ea27 --- /dev/null +++ b/src/main/res/drawable/baseline_bookmark_border_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/res/menu/conversation_context.xml b/src/main/res/menu/conversation_context.xml index ff88646c6..81cf21d3f 100644 --- a/src/main/res/menu/conversation_context.xml +++ b/src/main/res/menu/conversation_context.xml @@ -5,6 +5,11 @@ android:icon="@drawable/ic_create_white_24dp" app:showAsAction="ifRoom" /> + +