Explorar o código

Merge branch 'master' into Share

Smarshall hai 1 ano
pai
achega
48135f3fab
Modificáronse 56 ficheiros con 1434 adicións e 202 borrados
  1. 2 2
      app/build.gradle
  2. 8 0
      app/src/main/java/com/nextcloud/talk/adapters/messages/SystemMessageInterface.kt
  3. 0 112
      app/src/main/java/com/nextcloud/talk/adapters/messages/SystemMessageViewHolder.java
  4. 150 0
      app/src/main/java/com/nextcloud/talk/adapters/messages/SystemMessageViewHolder.kt
  5. 3 0
      app/src/main/java/com/nextcloud/talk/adapters/messages/TalkMessagesListAdapter.java
  6. 15 0
      app/src/main/java/com/nextcloud/talk/api/NcApi.java
  7. 123 39
      app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
  8. 5 1
      app/src/main/java/com/nextcloud/talk/chat/data/ChatRepository.kt
  9. 36 0
      app/src/main/java/com/nextcloud/talk/chat/data/ChatRepositoryImpl.kt
  10. 83 0
      app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt
  11. 9 4
      app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt
  12. 11 1
      app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt
  13. 41 0
      app/src/main/java/com/nextcloud/talk/models/json/reminder/Reminder.kt
  14. 38 0
      app/src/main/java/com/nextcloud/talk/models/json/reminder/ReminderOCS.kt
  15. 35 0
      app/src/main/java/com/nextcloud/talk/models/json/reminder/ReminderOverall.kt
  16. 309 0
      app/src/main/java/com/nextcloud/talk/ui/dialog/DateTimePickerFragment.kt
  17. 12 0
      app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt
  18. 5 0
      app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java
  19. 10 1
      app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt
  20. 27 0
      app/src/main/res/drawable/baseline_calendar_month_24.xml
  21. 9 0
      app/src/main/res/drawable/baseline_unfold_less_24.xml
  22. 9 0
      app/src/main/res/drawable/baseline_unfold_more_24.xml
  23. 218 0
      app/src/main/res/layout/dialog_date_time_picker.xml
  24. 33 0
      app/src/main/res/layout/dialog_message_actions.xml
  25. 78 42
      app/src/main/res/layout/item_system_message.xml
  26. 2 0
      app/src/main/res/values-es-rEC/strings.xml
  27. 3 0
      app/src/main/res/values-eu/strings.xml
  28. 2 0
      app/src/main/res/values-fa/strings.xml
  29. 3 0
      app/src/main/res/values-fi-rFI/strings.xml
  30. 11 0
      app/src/main/res/values-fr/strings.xml
  31. 5 0
      app/src/main/res/values-gl/strings.xml
  32. 3 0
      app/src/main/res/values-hr/strings.xml
  33. 3 0
      app/src/main/res/values-hu-rHU/strings.xml
  34. 3 0
      app/src/main/res/values-is/strings.xml
  35. 4 0
      app/src/main/res/values-it/strings.xml
  36. 3 0
      app/src/main/res/values-iw/strings.xml
  37. 4 0
      app/src/main/res/values-ja-rJP/strings.xml
  38. 3 0
      app/src/main/res/values-ko/strings.xml
  39. 4 0
      app/src/main/res/values-lt-rLT/strings.xml
  40. 6 0
      app/src/main/res/values-nb-rNO/strings.xml
  41. 5 0
      app/src/main/res/values-nl/strings.xml
  42. 5 0
      app/src/main/res/values-pl/strings.xml
  43. 7 0
      app/src/main/res/values-pt-rBR/strings.xml
  44. 7 0
      app/src/main/res/values-ru/strings.xml
  45. 4 0
      app/src/main/res/values-sc/strings.xml
  46. 6 0
      app/src/main/res/values-sk-rSK/strings.xml
  47. 6 0
      app/src/main/res/values-sl/strings.xml
  48. 8 0
      app/src/main/res/values-sr/strings.xml
  49. 8 0
      app/src/main/res/values-sv/strings.xml
  50. 8 0
      app/src/main/res/values-tr/strings.xml
  51. 6 0
      app/src/main/res/values-uk/strings.xml
  52. 5 0
      app/src/main/res/values-vi/strings.xml
  53. 6 0
      app/src/main/res/values-zh-rCN/strings.xml
  54. 8 0
      app/src/main/res/values-zh-rHK/strings.xml
  55. 8 0
      app/src/main/res/values-zh-rTW/strings.xml
  56. 9 0
      app/src/main/res/values/strings.xml

+ 2 - 2
app/build.gradle

@@ -140,7 +140,7 @@ android {
 ext {
     androidxCameraVersion = "1.2.3"
     coilKtVersion = "2.4.0"
-    daggerVersion = "2.47"
+    daggerVersion = "2.48"
     emojiVersion = "1.3.0"
     lifecycleVersion = '2.6.1'
     okhttpVersion = "4.11.0"
@@ -269,7 +269,7 @@ dependencies {
     implementation "androidx.media3:media3-ui:$media3_version"
 
     implementation 'com.github.chrisbanes:PhotoView:2.3.0'
-    implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.27'
+    implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.28'
 
     implementation "io.noties.markwon:core:$markwonVersion"
     implementation "io.noties.markwon:ext-strikethrough:$markwonVersion"

+ 8 - 0
app/src/main/java/com/nextcloud/talk/adapters/messages/SystemMessageInterface.kt

@@ -0,0 +1,8 @@
+package com.nextcloud.talk.adapters.messages
+
+import com.nextcloud.talk.models.json.chat.ChatMessage
+
+interface SystemMessageInterface {
+    fun expandSystemMessage(chatMessage: ChatMessage)
+    fun collapseSystemMessages()
+}

+ 0 - 112
app/src/main/java/com/nextcloud/talk/adapters/messages/SystemMessageViewHolder.java

@@ -1,112 +0,0 @@
-/*
- * Nextcloud Talk application
- *
- * @author Mario Danic
- * Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package com.nextcloud.talk.adapters.messages;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.nextcloud.talk.R;
-import com.nextcloud.talk.application.NextcloudTalkApplication;
-import com.nextcloud.talk.models.json.chat.ChatMessage;
-import com.nextcloud.talk.utils.DateUtils;
-import com.nextcloud.talk.utils.DisplayUtils;
-import com.nextcloud.talk.utils.preferences.AppPreferences;
-import com.stfalcon.chatkit.messages.MessageHolders;
-
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import androidx.core.view.ViewCompat;
-import autodagger.AutoInjector;
-
-@AutoInjector(NextcloudTalkApplication.class)
-public class SystemMessageViewHolder extends MessageHolders.IncomingTextMessageViewHolder<ChatMessage> {
-
-    @Inject
-    AppPreferences appPreferences;
-
-    @Inject
-    Context context;
-
-    @Inject
-    DateUtils dateUtils;
-
-    protected ViewGroup background;
-
-    public SystemMessageViewHolder(View itemView) {
-        super(itemView);
-        NextcloudTalkApplication.Companion.getSharedApplication().getComponentApplication().inject(this);
-        background = itemView.findViewById(R.id.container);
-    }
-
-    @Override
-    public void onBind(ChatMessage message) {
-        super.onBind(message);
-
-        Resources resources = itemView.getResources();
-        int pressedColor;
-        int mentionColor;
-
-        pressedColor = resources.getColor(R.color.bg_message_list_incoming_bubble);
-        mentionColor = resources.getColor(R.color.textColorMaxContrast);
-
-        Drawable bubbleDrawable = DisplayUtils.getMessageSelector(resources.getColor(R.color.transparent),
-                                                                  resources.getColor(R.color.transparent),
-                                                                  pressedColor,
-                                                                  R.drawable.shape_grouped_incoming_message);
-        ViewCompat.setBackground(background, bubbleDrawable);
-
-        Spannable messageString = new SpannableString(message.getText());
-
-        if (message.getMessageParameters() != null && message.getMessageParameters().size() > 0) {
-            for (String key : message.getMessageParameters().keySet()) {
-                Map<String, String> individualMap = message.getMessageParameters().get(key);
-
-                if (individualMap != null && individualMap.containsKey("name")) {
-                    String searchText;
-                    if ("user".equals(individualMap.get("type")) ||
-                        "guest".equals(individualMap.get("type")) ||
-                        "call".equals(individualMap.get("type"))
-                    ) {
-                        searchText = "@" + individualMap.get("name");
-                    } else {
-                        searchText = individualMap.get("name");
-                    }
-                    messageString = DisplayUtils.searchAndColor(messageString, searchText, mentionColor);
-                }
-            }
-        }
-
-        text.setText(messageString);
-
-        if (time != null) {
-            time.setText(dateUtils.getLocalTimeStringFromTimestamp(message.getTimestamp()));
-        }
-
-        itemView.setTag(R.string.replyable_message_view_tag, message.getReplyable());
-    }
-}

+ 150 - 0
app/src/main/java/com/nextcloud/talk/adapters/messages/SystemMessageViewHolder.kt

@@ -0,0 +1,150 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Mario Danic
+ * Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.nextcloud.talk.adapters.messages
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.text.Spannable
+import android.text.SpannableString
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.content.ContextCompat
+import androidx.core.view.ViewCompat
+import autodagger.AutoInjector
+import com.nextcloud.talk.R
+import com.nextcloud.talk.application.NextcloudTalkApplication
+import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
+import com.nextcloud.talk.databinding.ItemSystemMessageBinding
+import com.nextcloud.talk.models.json.chat.ChatMessage
+import com.nextcloud.talk.utils.DateUtils
+import com.nextcloud.talk.utils.DisplayUtils
+import com.nextcloud.talk.utils.preferences.AppPreferences
+import com.stfalcon.chatkit.messages.MessageHolders
+import javax.inject.Inject
+
+@AutoInjector(NextcloudTalkApplication::class)
+class SystemMessageViewHolder(itemView: View) : MessageHolders.IncomingTextMessageViewHolder<ChatMessage>(itemView) {
+
+    private val binding: ItemSystemMessageBinding = ItemSystemMessageBinding.bind(itemView)
+
+    @JvmField
+    @Inject
+    var appPreferences: AppPreferences? = null
+
+    @JvmField
+    @Inject
+    var context: Context? = null
+
+    @JvmField
+    @Inject
+    var dateUtils: DateUtils? = null
+    protected var background: ViewGroup
+
+    lateinit var systemMessageInterface: SystemMessageInterface
+
+    init {
+        sharedApplication!!.componentApplication.inject(this)
+        background = itemView.findViewById(R.id.container)
+    }
+
+    @SuppressLint("SetTextI18n")
+    override fun onBind(message: ChatMessage) {
+        super.onBind(message)
+        val resources = itemView.resources
+        val pressedColor: Int = resources.getColor(R.color.bg_message_list_incoming_bubble)
+        val mentionColor: Int = resources.getColor(R.color.textColorMaxContrast)
+        val bubbleDrawable = DisplayUtils.getMessageSelector(
+            resources.getColor(R.color.transparent),
+            resources.getColor(R.color.transparent),
+            pressedColor,
+            R.drawable.shape_grouped_incoming_message
+        )
+        ViewCompat.setBackground(background, bubbleDrawable)
+        var messageString: Spannable = SpannableString(message.text)
+        if (message.messageParameters != null && message.messageParameters!!.size > 0) {
+            for (key in message.messageParameters!!.keys) {
+                val individualMap: Map<String?, String?>? = message.messageParameters!![key]
+                if (individualMap != null && individualMap.containsKey("name")) {
+                    var searchText: String? = if ("user" == individualMap["type"] ||
+                        "guest" == individualMap["type"] ||
+                        "call" == individualMap["type"]
+                    ) {
+                        "@" + individualMap["name"]
+                    } else {
+                        individualMap["name"]
+                    }
+                    messageString = DisplayUtils.searchAndColor(messageString, searchText, mentionColor)
+                }
+            }
+        }
+
+        binding.systemMessageLayout.visibility = View.VISIBLE
+        binding.similarMessagesHint.visibility = View.GONE
+        if (message.expandableParent) {
+            binding.expandCollapseIcon.visibility = View.VISIBLE
+
+            if (!message.isExpanded) {
+                val similarMessages = String.format(
+                    sharedApplication!!.resources.getString(R.string.see_similar_system_messages),
+                    message.expandableChildrenAmount
+                )
+
+                binding.messageText.text = messageString
+                binding.similarMessagesHint.visibility = View.VISIBLE
+                binding.similarMessagesHint.text = similarMessages
+
+                binding.expandCollapseIcon.setImageDrawable(
+                    ContextCompat.getDrawable(context!!, R.drawable.baseline_unfold_more_24)
+                )
+                binding.systemMessageLayout.setOnClickListener { systemMessageInterface.expandSystemMessage(message) }
+                binding.messageText.setOnClickListener { systemMessageInterface.expandSystemMessage(message) }
+            } else {
+                binding.messageText.text = messageString
+                binding.similarMessagesHint.visibility = View.GONE
+                binding.similarMessagesHint.text = ""
+
+                binding.expandCollapseIcon.setImageDrawable(
+                    ContextCompat.getDrawable(context!!, R.drawable.baseline_unfold_less_24)
+                )
+                binding.systemMessageLayout.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
+                binding.messageText.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
+            }
+        } else if (message.hiddenByCollapse) {
+            binding.systemMessageLayout.visibility = View.GONE
+        } else {
+            binding.expandCollapseIcon.visibility = View.GONE
+            binding.messageText.text = messageString
+            binding.expandCollapseIcon.setImageDrawable(null)
+            binding.systemMessageLayout.setOnClickListener(null)
+        }
+
+        if (!message.expandableParent && message.lastItemOfExpandableGroup != 0) {
+            binding.systemMessageLayout.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
+            binding.messageText.setOnClickListener { systemMessageInterface.collapseSystemMessages() }
+        }
+
+        binding.messageTime.text = dateUtils!!.getLocalTimeStringFromTimestamp(message.timestamp)
+        itemView.setTag(R.string.replyable_message_view_tag, message.replyable)
+    }
+
+    fun assignSystemMessageInterface(systemMessageInterface: SystemMessageInterface) {
+        this.systemMessageInterface = systemMessageInterface
+    }
+}

+ 3 - 0
app/src/main/java/com/nextcloud/talk/adapters/messages/TalkMessagesListAdapter.java

@@ -74,6 +74,9 @@ public class TalkMessagesListAdapter<M extends IMessage> extends MessagesListAda
         } else if (holder instanceof PreviewMessageViewHolder) {
             ((PreviewMessageViewHolder) holder).assignPreviewMessageInterface(chatActivity);
             ((PreviewMessageViewHolder) holder).assignCommonMessageInterface(chatActivity);
+
+        } else if (holder instanceof SystemMessageViewHolder) {
+            ((SystemMessageViewHolder) holder).assignSystemMessageInterface(chatActivity);
         }
     }
 }

+ 15 - 0
app/src/main/java/com/nextcloud/talk/api/NcApi.java

@@ -40,6 +40,7 @@ import com.nextcloud.talk.models.json.participants.AddParticipantOverall;
 import com.nextcloud.talk.models.json.participants.ParticipantsOverall;
 import com.nextcloud.talk.models.json.push.PushRegistrationOverall;
 import com.nextcloud.talk.models.json.reactions.ReactionsOverall;
+import com.nextcloud.talk.models.json.reminder.ReminderOverall;
 import com.nextcloud.talk.models.json.search.ContactsByNumberOverall;
 import com.nextcloud.talk.models.json.signaling.SignalingOverall;
 import com.nextcloud.talk.models.json.signaling.settings.SignalingSettingsOverall;
@@ -671,4 +672,18 @@ public interface NcApi {
                                                      @Query("text") String text,
                                                      @Query("toLanguage") String toLanguage,
                                                      @Nullable @Query("fromLanguage") String fromLanguage);
+
+    @GET
+    Observable<ReminderOverall> getReminder(@Header("Authorization") String authorization,
+                                            @Url String url);
+
+    @DELETE
+    Observable<GenericOverall> deleteReminder(@Header("Authorization") String authorization,
+                                              @Url String url);
+
+    @FormUrlEncoded
+    @POST
+    Observable<ReminderOverall> setReminder(@Header("Authorization") String authorization,
+                                            @Url String url,
+                                            @Field("timestamp") int timestamp);
 }

+ 123 - 39
app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

@@ -95,6 +95,7 @@ import androidx.core.text.bold
 import androidx.core.widget.doAfterTextChanged
 import androidx.emoji2.text.EmojiCompat
 import androidx.emoji2.widget.EmojiTextView
+import androidx.fragment.app.DialogFragment
 import androidx.lifecycle.ViewModelProvider
 import androidx.recyclerview.widget.ItemTouchHelper
 import androidx.recyclerview.widget.LinearLayoutManager
@@ -136,6 +137,7 @@ import com.nextcloud.talk.adapters.messages.OutcomingTextMessageViewHolder
 import com.nextcloud.talk.adapters.messages.OutcomingVoiceMessageViewHolder
 import com.nextcloud.talk.adapters.messages.PreviewMessageInterface
 import com.nextcloud.talk.adapters.messages.PreviewMessageViewHolder
+import com.nextcloud.talk.adapters.messages.SystemMessageInterface
 import com.nextcloud.talk.adapters.messages.SystemMessageViewHolder
 import com.nextcloud.talk.adapters.messages.TalkMessagesListAdapter
 import com.nextcloud.talk.adapters.messages.UnreadNoticeMessageViewHolder
@@ -183,6 +185,7 @@ import com.nextcloud.talk.ui.MicInputCloud
 import com.nextcloud.talk.ui.StatusDrawable
 import com.nextcloud.talk.ui.bottom.sheet.ProfileBottomSheet
 import com.nextcloud.talk.ui.dialog.AttachmentDialog
+import com.nextcloud.talk.ui.dialog.DateTimePickerFragment
 import com.nextcloud.talk.ui.dialog.MessageActionsDialog
 import com.nextcloud.talk.ui.dialog.ShowReactionsDialog
 import com.nextcloud.talk.ui.recyclerview.MessageSwipeActions
@@ -263,7 +266,8 @@ class ChatActivity :
     ContentChecker<ChatMessage>,
     VoiceMessageInterface,
     CommonMessageInterface,
-    PreviewMessageInterface {
+    PreviewMessageInterface,
+    SystemMessageInterface {
 
     var active = false
 
@@ -1908,6 +1912,45 @@ class ChatActivity :
         }
     }
 
+    @SuppressLint("NotifyDataSetChanged")
+    override fun collapseSystemMessages() {
+        adapter?.items?.forEach {
+            if (it.item is ChatMessage) {
+                val chatMessage = it.item as ChatMessage
+                if (isChildOfExpandableSystemMessage(chatMessage)) {
+                    chatMessage.hiddenByCollapse = true
+                }
+                chatMessage.isExpanded = false
+            }
+        }
+
+        adapter?.notifyDataSetChanged()
+    }
+
+    private fun isChildOfExpandableSystemMessage(chatMessage: ChatMessage): Boolean {
+        return isSystemMessage(chatMessage) &&
+            !chatMessage.expandableParent &&
+            chatMessage.lastItemOfExpandableGroup != 0
+    }
+
+    @SuppressLint("NotifyDataSetChanged")
+    override fun expandSystemMessage(chatMessageToExpand: ChatMessage) {
+        adapter?.items?.forEach {
+            if (it.item is ChatMessage) {
+                val belongsToGroupToExpand =
+                    (it.item as ChatMessage).lastItemOfExpandableGroup == chatMessageToExpand.lastItemOfExpandableGroup
+
+                if (belongsToGroupToExpand) {
+                    (it.item as ChatMessage).hiddenByCollapse = false
+                }
+            }
+        }
+
+        chatMessageToExpand.isExpanded = true
+
+        adapter?.notifyDataSetChanged()
+    }
+
     @SuppressLint("LongLogTag")
     private fun downloadFileToCache(message: ChatMessage) {
         message.isDownloadingVoiceMessage = true
@@ -3106,7 +3149,14 @@ class ChatActivity :
                             Log.d(TAG, "pullChatMessages - HTTP_CODE_OK.")
 
                             val chatOverall = response.body() as ChatOverall?
-                            val chatMessageList = handleSystemMessages(chatOverall?.ocs!!.data!!)
+
+                            var chatMessageList = chatOverall?.ocs!!.data!!
+
+                            chatMessageList = handleSystemMessages(chatMessageList)
+
+                            determinePreviousMessageIds(chatMessageList)
+
+                            handleExpandableSystemMessages(chatMessageList)
 
                             processHeaderChatLastGiven(response, lookIntoFuture)
 
@@ -3121,6 +3171,8 @@ class ChatActivity :
                                 processMessagesFromTheFuture(chatMessageList)
                             } else {
                                 processMessagesNotFromTheFuture(chatMessageList)
+
+                                collapseSystemMessages()
                             }
 
                             val newXChatLastCommonRead = response.headers()["X-Chat-Last-Common-Read"]?.let {
@@ -3144,6 +3196,8 @@ class ChatActivity :
                         isFirstMessagesProcessing = false
                         binding.progressBar.visibility = View.GONE
                         binding.messagesListView.visibility = View.VISIBLE
+
+                        collapseSystemMessages()
                     }
                 }
 
@@ -3209,6 +3263,7 @@ class ChatActivity :
     }
 
     private fun processExpiredMessages() {
+        @SuppressLint("NotifyDataSetChanged")
         fun deleteExpiredMessages() {
             val messagesToDelete: ArrayList<ChatMessage> = ArrayList()
             val systemTime = System.currentTimeMillis() / ONE_SECOND_IN_MILLIS
@@ -3269,8 +3324,6 @@ class ChatActivity :
             adapter?.addToStart(unreadChatMessage, false)
         }
 
-        determinePreviousMessageIds(chatMessageList)
-
         addMessagesToAdapter(shouldAddNewMessagesNotice, chatMessageList)
 
         if (shouldAddNewMessagesNotice && adapter != null) {
@@ -3278,6 +3331,36 @@ class ChatActivity :
         }
     }
 
+    private fun processMessagesNotFromTheFuture(chatMessageList: List<ChatMessage>) {
+        var countGroupedMessages = 0
+
+        for (i in chatMessageList.indices) {
+            if (chatMessageList.size > i + 1) {
+                if (isSameDayNonSystemMessages(chatMessageList[i], chatMessageList[i + 1]) &&
+                    chatMessageList[i + 1].actorId == chatMessageList[i].actorId &&
+                    countGroupedMessages < GROUPED_MESSAGES_THRESHOLD
+                ) {
+                    chatMessageList[i].isGrouped = true
+                    countGroupedMessages++
+                } else {
+                    countGroupedMessages = 0
+                }
+            }
+
+            val chatMessage = chatMessageList[i]
+            chatMessage.isOneToOneConversation =
+                currentConversation?.type == ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
+            chatMessage.isFormerOneToOneConversation =
+                (currentConversation?.type == ConversationType.FORMER_ONE_TO_ONE)
+            chatMessage.activeUser = conversationUser
+        }
+
+        if (adapter != null) {
+            adapter?.addToEnd(chatMessageList, false)
+        }
+        scrollToRequestedMessageIfNeeded()
+    }
+
     private fun scrollToFirstUnreadMessage() {
         adapter?.let {
             layoutManager?.scrollToPositionWithOffset(
@@ -3307,10 +3390,8 @@ class ChatActivity :
 
             adapter?.let {
                 chatMessage.isGrouped = (
-                    it.isPreviousSameAuthor(
-                        chatMessage.actorId,
-                        -1
-                    ) && it.getSameAuthorLastMessagesCount(chatMessage.actorId) %
+                    it.isPreviousSameAuthor(chatMessage.actorId, -1) &&
+                        it.getSameAuthorLastMessagesCount(chatMessage.actorId) %
                         GROUPED_MESSAGES_SAME_AUTHOR_THRESHOLD > 0
                     )
                 chatMessage.isOneToOneConversation =
@@ -3339,37 +3420,6 @@ class ChatActivity :
         }
     }
 
-    private fun processMessagesNotFromTheFuture(chatMessageList: List<ChatMessage>) {
-        var countGroupedMessages = 0
-        determinePreviousMessageIds(chatMessageList)
-
-        for (i in chatMessageList.indices) {
-            if (chatMessageList.size > i + 1) {
-                if (isSameDayNonSystemMessages(chatMessageList[i], chatMessageList[i + 1]) &&
-                    chatMessageList[i + 1].actorId == chatMessageList[i].actorId &&
-                    countGroupedMessages < GROUPED_MESSAGES_THRESHOLD
-                ) {
-                    chatMessageList[i].isGrouped = true
-                    countGroupedMessages++
-                } else {
-                    countGroupedMessages = 0
-                }
-            }
-
-            val chatMessage = chatMessageList[i]
-            chatMessage.isOneToOneConversation =
-                currentConversation?.type == ConversationType.ROOM_TYPE_ONE_TO_ONE_CALL
-            chatMessage.isFormerOneToOneConversation =
-                (currentConversation?.type == ConversationType.FORMER_ONE_TO_ONE)
-            chatMessage.activeUser = conversationUser
-        }
-
-        if (adapter != null) {
-            adapter?.addToEnd(chatMessageList, false)
-        }
-        scrollToRequestedMessageIfNeeded()
-    }
-
     private fun determinePreviousMessageIds(chatMessageList: List<ChatMessage>) {
         var previousMessageId = NO_PREVIOUS_MESSAGE_ID
         for (i in chatMessageList.indices.reversed()) {
@@ -3595,6 +3645,30 @@ class ChatActivity :
         return chatMessageMap.values.toList()
     }
 
+    private fun handleExpandableSystemMessages(chatMessageList: List<ChatMessage>): List<ChatMessage> {
+        val chatMessageMap = chatMessageList.map { it.id to it }.toMap().toMutableMap()
+        val chatMessageIterator = chatMessageMap.iterator()
+        while (chatMessageIterator.hasNext()) {
+            val currentMessage = chatMessageIterator.next()
+
+            val previousMessage = chatMessageMap[currentMessage.value.previousMessageId.toString()]
+            if (isSystemMessage(currentMessage.value) &&
+                previousMessage?.systemMessageType == currentMessage.value.systemMessageType
+            ) {
+                previousMessage?.expandableParent = true
+                currentMessage.value.expandableParent = false
+
+                if (currentMessage.value.lastItemOfExpandableGroup == 0) {
+                    currentMessage.value.lastItemOfExpandableGroup = currentMessage.value.jsonMessageId
+                }
+
+                previousMessage?.lastItemOfExpandableGroup = currentMessage.value.lastItemOfExpandableGroup
+                previousMessage?.expandableChildrenAmount = currentMessage.value.expandableChildrenAmount + 1
+            }
+        }
+        return chatMessageMap.values.toList()
+    }
+
     private fun isInfoMessageAboutDeletion(currentMessage: MutableMap.MutableEntry<String, ChatMessage>): Boolean {
         return currentMessage.value.parentMessage != null && currentMessage.value.systemMessageType == ChatMessage
             .SystemMessageType.MESSAGE_DELETED
@@ -3883,6 +3957,16 @@ class ChatActivity :
         startActivity(intent)
     }
 
+    fun remindMeLater(message: ChatMessage?) {
+        Log.d(TAG, "remindMeLater called")
+        val newFragment: DialogFragment = DateTimePickerFragment.newInstance(
+            roomToken,
+            message!!.id,
+            chatViewModel
+        )
+        newFragment.show(supportFragmentManager, DateTimePickerFragment.TAG)
+    }
+
     fun markAsUnread(message: IMessage?) {
         val chatMessage = message as ChatMessage?
         if (chatMessage!!.previousMessageId > NO_PREVIOUS_MESSAGE_ID) {

+ 5 - 1
app/src/main/java/com/nextcloud/talk/chat/data/ChatRepository.kt

@@ -22,10 +22,14 @@ package com.nextcloud.talk.chat.data
 
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.models.domain.ConversationModel
-
+import com.nextcloud.talk.models.json.generic.GenericOverall
+import com.nextcloud.talk.models.json.reminder.Reminder
 import io.reactivex.Observable
 
 interface ChatRepository {
     fun getRoom(user: User, roomToken: String): Observable<ConversationModel>
     fun joinRoom(user: User, roomToken: String, roomPassword: String): Observable<ConversationModel>
+    fun setReminder(user: User, roomToken: String, messageId: String, timeStamp: Int): Observable<Reminder>
+    fun getReminder(user: User, roomToken: String, messageId: String): Observable<Reminder>
+    fun deleteReminder(user: User, roomToken: String, messageId: String): Observable<GenericOverall>
 }

+ 36 - 0
app/src/main/java/com/nextcloud/talk/chat/data/ChatRepositoryImpl.kt

@@ -23,6 +23,8 @@ package com.nextcloud.talk.chat.data
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.models.domain.ConversationModel
+import com.nextcloud.talk.models.json.generic.GenericOverall
+import com.nextcloud.talk.models.json.reminder.Reminder
 import com.nextcloud.talk.utils.ApiUtils
 import io.reactivex.Observable
 
@@ -54,4 +56,38 @@ class ChatRepositoryImpl(private val ncApi: NcApi) : ChatRepository {
             roomPassword
         ).map { ConversationModel.mapToConversationModel(it.ocs?.data!!) }
     }
+
+    override fun setReminder(user: User, roomToken: String, messageId: String, timeStamp: Int): Observable<Reminder> {
+        val credentials: String = ApiUtils.getCredentials(user.username, user.token)
+        val apiVersion = ApiUtils.getChatApiVersion(user, intArrayOf(ApiUtils.APIv1, 1))
+        return ncApi.setReminder(
+            credentials,
+            ApiUtils.getUrlForReminder(user, roomToken, messageId, apiVersion),
+            timeStamp
+        ).map {
+            it.ocs!!.data
+        }
+    }
+
+    override fun getReminder(user: User, roomToken: String, messageId: String): Observable<Reminder> {
+        val credentials: String = ApiUtils.getCredentials(user.username, user.token)
+        val apiVersion = ApiUtils.getChatApiVersion(user, intArrayOf(ApiUtils.APIv1, 1))
+        return ncApi.getReminder(
+            credentials,
+            ApiUtils.getUrlForReminder(user, roomToken, messageId, apiVersion)
+        ).map {
+            it.ocs!!.data
+        }
+    }
+
+    override fun deleteReminder(user: User, roomToken: String, messageId: String): Observable<GenericOverall> {
+        val credentials: String = ApiUtils.getCredentials(user.username, user.token)
+        val apiVersion = ApiUtils.getChatApiVersion(user, intArrayOf(ApiUtils.APIv1, 1))
+        return ncApi.deleteReminder(
+            credentials,
+            ApiUtils.getUrlForReminder(user, roomToken, messageId, apiVersion)
+        ).map {
+            it
+        }
+    }
 }

+ 83 - 0
app/src/main/java/com/nextcloud/talk/chat/viewmodels/ChatViewModel.kt

@@ -27,6 +27,8 @@ import androidx.lifecycle.ViewModel
 import com.nextcloud.talk.chat.data.ChatRepository
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.models.domain.ConversationModel
+import com.nextcloud.talk.models.json.generic.GenericOverall
+import com.nextcloud.talk.models.json.reminder.Reminder
 import io.reactivex.Observer
 import io.reactivex.android.schedulers.AndroidSchedulers
 import io.reactivex.disposables.Disposable
@@ -40,6 +42,13 @@ class ChatViewModel @Inject constructor(private val repository: ChatRepository)
 
     object GetRoomStartState : ViewState
     object GetRoomErrorState : ViewState
+    object GetReminderStartState : ViewState
+    open class GetReminderExistState(val reminder: Reminder) : ViewState
+
+    private val _getReminderExistState: MutableLiveData<ViewState> = MutableLiveData(GetReminderStartState)
+    val getReminderExistState: LiveData<ViewState>
+        get() = _getReminderExistState
+
     open class GetRoomSuccessState(val conversationModel: ConversationModel) : ViewState
 
     private val _getRoomViewState: MutableLiveData<ViewState> = MutableLiveData(GetRoomStartState)
@@ -71,6 +80,43 @@ class ChatViewModel @Inject constructor(private val repository: ChatRepository)
             ?.subscribe(JoinRoomObserver())
     }
 
+    fun setReminder(user: User, roomToken: String, messageId: String, timestamp: Int) {
+        repository.setReminder(user, roomToken, messageId, timestamp)
+            .subscribeOn(Schedulers.io())
+            ?.observeOn(AndroidSchedulers.mainThread())
+            ?.subscribe(SetReminderObserver())
+    }
+
+    fun getReminder(user: User, roomToken: String, messageId: String) {
+        repository.getReminder(user, roomToken, messageId)
+            .subscribeOn(Schedulers.io())
+            ?.observeOn(AndroidSchedulers.mainThread())
+            ?.subscribe(GetReminderObserver())
+    }
+
+    fun deleteReminder(user: User, roomToken: String, messageId: String) {
+        repository.deleteReminder(user, roomToken, messageId)
+            .subscribeOn(Schedulers.io())
+            ?.observeOn(AndroidSchedulers.mainThread())
+            ?.subscribe(object : Observer<GenericOverall> {
+                override fun onSubscribe(d: Disposable) {
+                    // unused atm
+                }
+
+                override fun onNext(genericOverall: GenericOverall) {
+                    _getReminderExistState.value = GetReminderStartState
+                }
+
+                override fun onError(e: Throwable) {
+                    Log.d(TAG, "Error when deleting reminder $e")
+                }
+
+                override fun onComplete() {
+                    // unused atm
+                }
+            })
+    }
+
     inner class GetRoomObserver : Observer<ConversationModel> {
         override fun onSubscribe(d: Disposable) {
             // unused atm
@@ -109,6 +155,43 @@ class ChatViewModel @Inject constructor(private val repository: ChatRepository)
         }
     }
 
+    inner class SetReminderObserver : Observer<Reminder> {
+        override fun onSubscribe(d: Disposable) {
+            // unused atm
+        }
+
+        override fun onNext(reminder: Reminder) {
+            Log.d(TAG, "reminder set successfully")
+        }
+
+        override fun onError(e: Throwable) {
+            Log.e(TAG, "Error when sending reminder, $e")
+        }
+
+        override fun onComplete() {
+            // unused atm
+        }
+    }
+
+    inner class GetReminderObserver : Observer<Reminder> {
+        override fun onSubscribe(d: Disposable) {
+            // unused atm
+        }
+
+        override fun onNext(reminder: Reminder) {
+            _getReminderExistState.value = GetReminderExistState(reminder)
+        }
+
+        override fun onError(e: Throwable) {
+            Log.d(TAG, "Error when getting reminder $e")
+            _getReminderExistState.value = GetReminderStartState
+        }
+
+        override fun onComplete() {
+            // unused atm
+        }
+    }
+
     companion object {
         private val TAG = ChatViewModel::class.simpleName
         const val JOIN_ROOM_RETRY_COUNT: Long = 3

+ 9 - 4
app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt

@@ -175,7 +175,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
         } else if (isSpreedNotification()) {
             Log.d(TAG, "pushMessage.type: " + pushMessage.type)
             when (pushMessage.type) {
-                TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING -> handleNonCallPushMessage()
+                TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING, TYPE_REMINDER -> handleNonCallPushMessage()
                 TYPE_CALL -> handleCallPushMessage()
                 else -> Log.e(TAG, "unknown pushMessage.type")
             }
@@ -407,7 +407,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
     ) {
         var category = ""
         when (pushMessage.type) {
-            TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING -> category = Notification.CATEGORY_MESSAGE
+            TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING, TYPE_REMINDER -> category = Notification.CATEGORY_MESSAGE
             TYPE_CALL -> category = Notification.CATEGORY_CALL
             else -> Log.e(TAG, "unknown pushMessage.type")
         }
@@ -464,7 +464,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             when (pushMessage.type) {
-                TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING -> {
+                TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING, TYPE_REMINDER -> {
                     notificationBuilder.setChannelId(
                         NotificationUtils.NotificationChannels.NOTIFICATION_CHANNEL_MESSAGES_V4.name
                     )
@@ -489,7 +489,9 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
         val systemNotificationId: Int =
             activeStatusBarNotification?.id ?: calculateCRC32(System.currentTimeMillis().toString()).toInt()
 
-        if (TYPE_CHAT == pushMessage.type && pushMessage.notificationUser != null) {
+        if ((TYPE_CHAT == pushMessage.type || TYPE_REMINDER == pushMessage.type) &&
+            pushMessage.notificationUser != null
+        ) {
             prepareChatNotification(notificationBuilder, activeStatusBarNotification, systemNotificationId)
             addReplyAction(notificationBuilder, systemNotificationId)
             addMarkAsReadAction(notificationBuilder, systemNotificationId)
@@ -522,6 +524,8 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
                 else -> // assuming one2one
                     largeIcon = if (TYPE_CHAT == pushMessage.type || TYPE_ROOM == pushMessage.type) {
                         ContextCompat.getDrawable(context!!, R.drawable.ic_comment)?.toBitmap()!!
+                    } else if (TYPE_REMINDER == pushMessage.type) {
+                        ContextCompat.getDrawable(context!!, R.drawable.ic_timer_black_24dp)?.toBitmap()!!
                     } else {
                         ContextCompat.getDrawable(context!!, R.drawable.ic_call_black_24dp)?.toBitmap()!!
                     }
@@ -984,6 +988,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
         private const val TYPE_ROOM = "room"
         private const val TYPE_CALL = "call"
         private const val TYPE_RECORDING = "recording"
+        private const val TYPE_REMINDER = "reminder"
         private const val SPREED_APP = "spreed"
         private const val TIMER_START = 1
         private const val TIMER_COUNT = 12

+ 11 - 1
app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.kt

@@ -135,7 +135,17 @@ data class ChatMessage(
 
     var voiceMessageSeekbarProgress: Int = 0,
 
-    var voiceMessageFloatArray: FloatArray? = null
+    var voiceMessageFloatArray: FloatArray? = null,
+
+    var expandableParent: Boolean = false,
+
+    var isExpanded: Boolean = false,
+
+    var lastItemOfExpandableGroup: Int = 0,
+
+    var expandableChildrenAmount: Int = 0,
+
+    var hiddenByCollapse: Boolean = false
 
 ) : Parcelable, MessageContentType, MessageContentType.Image {
 

+ 41 - 0
app/src/main/java/com/nextcloud/talk/models/json/reminder/Reminder.kt

@@ -0,0 +1,41 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Julius Linus
+ * Copyright (C) 2023 Julius Linus <julius.linus@nextcloud.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.nextcloud.talk.models.json.reminder
+
+import android.os.Parcelable
+import com.bluelinelabs.logansquare.annotation.JsonField
+import com.bluelinelabs.logansquare.annotation.JsonObject
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+@JsonObject
+data class Reminder(
+    @JsonField(name = ["userid"])
+    var userid: String? = null,
+    @JsonField(name = ["token"])
+    var token: String? = null,
+    @JsonField(name = ["messageId"])
+    var messageId: Int? = null,
+    @JsonField(name = ["timestamp"])
+    var timestamp: Int? = null
+) : Parcelable {
+    // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
+    constructor() : this(null, null, null, null)
+}

+ 38 - 0
app/src/main/java/com/nextcloud/talk/models/json/reminder/ReminderOCS.kt

@@ -0,0 +1,38 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Julius Linus
+ * Copyright (C) 2023 Julius Linus <julius.linus@nextcloud.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.nextcloud.talk.models.json.reminder
+
+import android.os.Parcelable
+import com.bluelinelabs.logansquare.annotation.JsonField
+import com.bluelinelabs.logansquare.annotation.JsonObject
+import com.nextcloud.talk.models.json.generic.GenericMeta
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+@JsonObject
+data class ReminderOCS(
+    @JsonField(name = ["meta"])
+    var meta: GenericMeta? = null,
+    @JsonField(name = ["data"])
+    var data: Reminder? = null
+) : Parcelable {
+    // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
+    constructor() : this(null, null)
+}

+ 35 - 0
app/src/main/java/com/nextcloud/talk/models/json/reminder/ReminderOverall.kt

@@ -0,0 +1,35 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Julius Linus
+ * Copyright (C) 2023 Julius Linus <julius.linus@nextcloud.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.nextcloud.talk.models.json.reminder
+
+import android.os.Parcelable
+import com.bluelinelabs.logansquare.annotation.JsonField
+import com.bluelinelabs.logansquare.annotation.JsonObject
+import kotlinx.parcelize.Parcelize
+
+@Parcelize
+@JsonObject
+data class ReminderOverall(
+    @JsonField(name = ["ocs"])
+    var ocs: ReminderOCS? = null
+) : Parcelable {
+    // This constructor is added to work with the 'com.bluelinelabs.logansquare.annotation.JsonObject'
+    constructor() : this(null)
+}

+ 309 - 0
app/src/main/java/com/nextcloud/talk/ui/dialog/DateTimePickerFragment.kt

@@ -0,0 +1,309 @@
+/*
+ * Nextcloud Talk application
+ *
+ * @author Julius Linus
+ * Copyright (C) 2023 Julius Linus <julius.linu@nextcloud.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.nextcloud.talk.ui.dialog
+
+import android.app.Dialog
+import android.os.Bundle
+import android.text.format.DateUtils
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.DialogFragment
+import autodagger.AutoInjector
+import com.google.android.material.datepicker.CalendarConstraints
+import com.google.android.material.datepicker.DateValidatorPointForward
+import com.google.android.material.datepicker.MaterialDatePicker
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.timepicker.MaterialTimePicker
+import com.nextcloud.android.common.ui.theme.utils.ColorRole
+import com.nextcloud.talk.R
+import com.nextcloud.talk.application.NextcloudTalkApplication
+import com.nextcloud.talk.chat.viewmodels.ChatViewModel
+import com.nextcloud.talk.databinding.DialogDateTimePickerBinding
+import com.nextcloud.talk.ui.theme.ViewThemeUtils
+import com.nextcloud.talk.users.UserManager
+import java.util.Calendar
+import java.util.TimeZone
+import javax.inject.Inject
+
+@Suppress("TooManyFunctions")
+@AutoInjector(NextcloudTalkApplication::class)
+class DateTimePickerFragment(
+    token: String,
+    id: String,
+    chatViewModel: ChatViewModel
+) : DialogFragment() {
+    lateinit var binding: DialogDateTimePickerBinding
+    private var dialogView: View? = null
+    private var viewModel = chatViewModel
+    private var currentTimeStamp: Long? = null
+    private var roomToken = token
+    private var messageId = id
+    private var laterTodayTimeStamp = 0L
+    private var tomorrowTimeStamp = 0L
+    private var weekendTimeStamp = 0L
+    private var nextWeekTimeStamp = 0L
+
+    @Inject
+    lateinit var userManager: UserManager
+
+    @Inject
+    lateinit var viewThemeUtils: ViewThemeUtils
+
+    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+        binding = DialogDateTimePickerBinding.inflate(LayoutInflater.from(context))
+        dialogView = binding.root
+        return MaterialAlertDialogBuilder(requireContext()).setView(dialogView).create()
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this)
+        setUpDefaults()
+        setUpColors()
+        setListeners()
+        getReminder()
+        viewModel.getReminderExistState.observe(this) { state ->
+            when (state) {
+                is ChatViewModel.GetReminderExistState -> {
+                    val timeStamp = state.reminder.timestamp?.toLong()?.times(ONE_SEC)
+                    showDelete(true)
+                    setTimeStamp(getTimeFromTimeStamp(timeStamp!!))
+                }
+
+                else -> {
+                    showDelete(false)
+                    binding.dateTimePickerTimestamp.text = ""
+                }
+            }
+        }
+
+        return inflater.inflate(R.layout.dialog_date_time_picker, container, false)
+    }
+
+    private fun setUpDefaults() {
+        val currTime = getTimeFromCalendar()
+        val currentWeekInYear = Calendar.getInstance().get(Calendar.WEEK_OF_YEAR)
+
+        laterTodayTimeStamp = getTimeFromCalendar(hour = HOUR_SIX_PM, minute = 0)
+        binding.dateTimePickerLaterTodayTextview.text = getTimeFromTimeStamp(laterTodayTimeStamp)
+
+        if (Calendar.getInstance().get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
+            tomorrowTimeStamp = getTimeFromCalendar(
+                hour = HOUR_EIGHT_AM,
+                minute = 0,
+                daysToAdd = 1,
+                weekInYear =
+                currentWeekInYear + 1
+            )
+
+            binding.dateTimePickerWeekend.visibility = View.GONE // because today is the weekend
+        } else {
+            tomorrowTimeStamp = getTimeFromCalendar(hour = HOUR_EIGHT_AM, minute = 0, daysToAdd = 1)
+            weekendTimeStamp = getTimeFromCalendar(hour = HOUR_EIGHT_AM, day = Calendar.SATURDAY, minute = 0)
+        }
+        binding.dateTimePickerTomorrowTextview.text = getTimeFromTimeStamp(tomorrowTimeStamp)
+        binding.dateTimePickerWeekendTextview.text = getTimeFromTimeStamp(weekendTimeStamp)
+
+        nextWeekTimeStamp = getTimeFromCalendar(
+            hour = HOUR_EIGHT_AM,
+            day = Calendar.MONDAY,
+            minute = 0,
+            weekInYear =
+            currentWeekInYear + 1
+        ) // this should only pick mondays from next week only
+        binding.dateTimePickerNextWeekTextview.text = getTimeFromTimeStamp(nextWeekTimeStamp)
+
+        // This is to hide the later today option, if it's past 6pm
+        if (currTime > laterTodayTimeStamp) {
+            binding.dateTimePickerLaterToday.visibility = View.GONE
+        }
+
+        // This is to hide the tomorrow option, if that's also the weekend
+        if (binding.dateTimePickerTomorrowTextview.text == binding.dateTimePickerWeekendTextview.text) {
+            binding.dateTimePickerTomorrow.visibility = View.GONE
+        }
+    }
+
+    private fun getReminder() {
+        viewModel.getReminder(userManager.currentUser.blockingGet(), roomToken, messageId)
+    }
+
+    private fun showDelete(value: Boolean) {
+        if (value) {
+            binding.buttonDelete.visibility = View.VISIBLE
+        } else {
+            binding.buttonDelete.visibility = View.GONE
+        }
+    }
+
+    private fun setUpColors() {
+        binding.root.let {
+            viewThemeUtils.platform.colorViewBackground(it)
+        }
+
+        binding.dateTimePickerCustomIcon.let {
+            viewThemeUtils.platform.colorImageView(it, ColorRole.PRIMARY)
+        }
+
+        binding.dateTimePickerTimestamp.let {
+            viewThemeUtils.material.themeSearchBarText(it)
+        }
+
+        binding.run {
+            listOf(
+                binding.buttonClose,
+                binding.buttonSet
+            )
+        }.forEach(viewThemeUtils.material::colorMaterialButtonPrimaryBorderless)
+    }
+
+    private fun setListeners() {
+        binding.dateTimePickerLaterToday.setOnClickListener {
+            currentTimeStamp = laterTodayTimeStamp / ONE_SEC
+            setTimeStamp(getTimeFromTimeStamp(laterTodayTimeStamp))
+        }
+        binding.dateTimePickerTomorrow.setOnClickListener {
+            currentTimeStamp = tomorrowTimeStamp / ONE_SEC
+            setTimeStamp(getTimeFromTimeStamp(tomorrowTimeStamp))
+        }
+        binding.dateTimePickerWeekend.setOnClickListener {
+            currentTimeStamp = weekendTimeStamp / ONE_SEC
+            setTimeStamp(getTimeFromTimeStamp(weekendTimeStamp))
+        }
+        binding.dateTimePickerNextWeek.setOnClickListener {
+            currentTimeStamp = nextWeekTimeStamp / ONE_SEC
+            setTimeStamp(getTimeFromTimeStamp(nextWeekTimeStamp))
+        }
+        binding.dateTimePickerCustom.setOnClickListener {
+            val constraintsBuilder = CalendarConstraints.Builder()
+                .setValidator(DateValidatorPointForward.now())
+                .build()
+            val time = System.currentTimeMillis()
+            val datePicker = MaterialDatePicker.Builder.datePicker()
+                .setTitleText(R.string.nc_remind)
+                .setSelection(time + TimeZone.getDefault().getOffset(time))
+                .setCalendarConstraints(constraintsBuilder).build()
+
+            datePicker.addOnPositiveButtonClickListener { selection ->
+                val localTimeInMillis = selection - TimeZone.getDefault().getOffset(selection)
+                val calendar = Calendar.getInstance()
+                calendar.timeInMillis = localTimeInMillis
+
+                val year = calendar.get(Calendar.YEAR)
+                val month = calendar.get(Calendar.MONTH)
+                val day = calendar.get(Calendar.DAY_OF_WEEK)
+                val weekInYear = calendar.get(Calendar.WEEK_OF_YEAR)
+
+                setUpTimePicker(year, month, day, weekInYear)
+            }
+            datePicker.show(this.parentFragmentManager, TAG)
+        }
+
+        binding.buttonClose.setOnClickListener { dismiss() }
+        binding.buttonSet.setOnClickListener {
+            currentTimeStamp?.let { time ->
+                viewModel.setReminder(userManager.currentUser.blockingGet(), roomToken, messageId, time.toInt())
+            }
+            dismiss()
+        }
+        binding.buttonDelete.setOnClickListener {
+            viewModel.deleteReminder(userManager.currentUser.blockingGet(), roomToken, messageId)
+        }
+    }
+
+    private fun setUpTimePicker(year: Int, month: Int, day: Int, weekInYear: Int) {
+        val timePicker = MaterialTimePicker
+            .Builder()
+            .setTitleText(R.string.nc_remind)
+            .build()
+
+        timePicker.addOnPositiveButtonClickListener {
+            val timestamp = getTimeFromCalendar(
+                year,
+                month,
+                day,
+                timePicker.hour,
+                timePicker.minute,
+                weekInYear = weekInYear
+            )
+            setTimeStamp(getTimeFromTimeStamp(timestamp))
+            currentTimeStamp = timestamp / ONE_SEC
+        }
+
+        timePicker.show(this.parentFragmentManager, TAG)
+    }
+
+    @Suppress("LongParameterList")
+    private fun getTimeFromCalendar(
+        year: Int = Calendar.getInstance().get(Calendar.YEAR),
+        month: Int = Calendar.getInstance().get(Calendar.MONTH),
+        day: Int = Calendar.getInstance().get(Calendar.DAY_OF_WEEK),
+        hour: Int = Calendar.getInstance().get(Calendar.HOUR_OF_DAY),
+        minute: Int = Calendar.getInstance().get(Calendar.MINUTE),
+        daysToAdd: Int = 0,
+        weekInYear: Int = Calendar.getInstance().get(Calendar.WEEK_OF_YEAR)
+    ): Long {
+        val calendar: Calendar = Calendar.getInstance().apply {
+            set(Calendar.YEAR, year)
+            set(Calendar.MONTH, month)
+            set(Calendar.DAY_OF_WEEK, day)
+            add(Calendar.DAY_OF_WEEK, daysToAdd)
+            set(Calendar.WEEK_OF_YEAR, weekInYear)
+            set(Calendar.HOUR_OF_DAY, hour)
+            set(Calendar.MINUTE, minute)
+            set(Calendar.SECOND, 0)
+        }
+        return calendar.timeInMillis
+    }
+
+    private fun setTimeStamp(date: String) {
+        binding.dateTimePickerTimestamp.text = date
+    }
+
+    private fun getTimeFromTimeStamp(time: Long): String {
+        return DateUtils.formatDateTime(
+            requireContext(),
+            time,
+            DateUtils.FORMAT_SHOW_DATE
+        ) + ", " + DateUtils.formatDateTime(
+            requireContext(),
+            time,
+            DateUtils.FORMAT_SHOW_TIME
+        )
+    }
+
+    companion object {
+        val TAG = DateTimePickerFragment::class.simpleName
+        private const val ONE_SEC = 1000
+        private const val HOUR_EIGHT_AM = 8
+        private const val HOUR_SIX_PM = 18
+
+        @JvmStatic
+        fun newInstance(
+            token: String,
+            id: String,
+            chatViewModel: ChatViewModel
+        ) = DateTimePickerFragment(
+            token,
+            id,
+            chatViewModel
+        )
+    }
+}

+ 12 - 0
app/src/main/java/com/nextcloud/talk/ui/dialog/MessageActionsDialog.kt

@@ -109,6 +109,7 @@ class MessageActionsDialog(
             ChatMessage.MessageType.REGULAR_TEXT_MESSAGE == message.getCalculateMessageType() &&
                 !(message.isDeletedCommentMessage || message.isDeleted)
         )
+        initMenuRemindMessage(!message.isDeleted && CapabilitiesUtilNew.isRemindSupported(user))
         initMenuMarkAsUnread(
             message.previousMessageId > NO_PREVIOUS_MESSAGE_ID &&
                 ChatMessage.MessageType.SYSTEM_MESSAGE != message.getCalculateMessageType()
@@ -265,6 +266,17 @@ class MessageActionsDialog(
         dialogMessageActionsBinding.menuForwardMessage.visibility = getVisibility(visible)
     }
 
+    private fun initMenuRemindMessage(visible: Boolean) {
+        if (visible) {
+            dialogMessageActionsBinding.menuNotifyMessage.setOnClickListener {
+                chatActivity.remindMeLater(message)
+                dismiss()
+            }
+        }
+
+        dialogMessageActionsBinding.menuNotifyMessage.visibility = getVisibility(visible)
+    }
+
     private fun initMenuDeleteMessage(visible: Boolean) {
         if (visible) {
             dialogMessageActionsBinding.menuDeleteMessage.setOnClickListener {

+ 5 - 0
app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java

@@ -530,4 +530,9 @@ public class ApiUtils {
     public static String getUrlForTranslation(String baseUrl) {
         return baseUrl + ocsApiVersion + "/translation/translate";
     }
+
+    public static String getUrlForReminder(User user, String roomToken, String messageId, int version) {
+        String url = ApiUtils.getUrlForChatMessage(version, user.getBaseUrl(), roomToken, messageId);
+        return url + "/reminder";
+    }
 }

+ 10 - 1
app/src/main/java/com/nextcloud/talk/utils/database/user/CapabilitiesUtilNew.kt

@@ -145,7 +145,7 @@ object CapabilitiesUtilNew {
     }
 
     @JvmStatic
-    fun getAttachmentFolder(user: User): String? {
+    fun getAttachmentFolder(user: User): String {
         if (user.capabilities?.spreedCapability?.config?.containsKey("attachments") == true) {
             val map = user.capabilities!!.spreedCapability!!.config!!["attachments"]
             if (map?.containsKey("folder") == true) {
@@ -241,5 +241,14 @@ object CapabilitiesUtilNew {
         }
     }
 
+    fun isRemindSupported(user: User?): Boolean {
+        if (user?.capabilities != null) {
+            val capabilities = user.capabilities
+            return capabilities?.spreedCapability?.features?.contains("remind-me-later") == true
+        }
+
+        return false
+    }
+
     const val DEFAULT_CHAT_SIZE = 1000
 }

+ 27 - 0
app/src/main/res/drawable/baseline_calendar_month_24.xml

@@ -0,0 +1,27 @@
+<!--
+    @author Google LLC
+    Copyright (C) 2018 Google LLC
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+
+<vector android:height="24dp"
+    android:tint="#000000"
+    android:viewportHeight="24"
+    android:viewportWidth="24"
+    android:width="24dp"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4 3.01,4.9 3.01,6L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V6C21,4.9 20.1,4 19,4zM19,20H5V10h14V20zM9,14H7v-2h2V14zM13,14h-2v-2h2V14zM17,14h-2v-2h2V14zM9,18H7v-2h2V18zM13,18h-2v-2h2V18zM17,18h-2v-2h2V18z" />
+</vector>

+ 9 - 0
app/src/main/res/drawable/baseline_unfold_less_24.xml

@@ -0,0 +1,9 @@
+<vector
+    android:height="24dp"
+    android:tint="?attr/colorControlNormal"
+    android:viewportHeight="24"
+    android:viewportWidth="24"
+    android:width="24dp"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M7.41,18.59L8.83,20 12,16.83 15.17,20l1.41,-1.41L12,14l-4.59,4.59zM16.59,5.41L15.17,4 12,7.17 8.83,4 7.41,5.41 12,10l4.59,-4.59z"/>
+</vector>

+ 9 - 0
app/src/main/res/drawable/baseline_unfold_more_24.xml

@@ -0,0 +1,9 @@
+<vector
+    android:height="24dp"
+    android:tint="?attr/colorControlNormal"
+    android:viewportHeight="24"
+    android:viewportWidth="24"
+    android:width="24dp"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/white" android:pathData="M12,5.83L15.17,9l1.41,-1.41L12,3 7.41,7.59 8.83,9 12,5.83zM12,18.17L8.83,15l-1.41,1.41L12,21l4.59,-4.59L15.17,15 12,18.17z"/>
+</vector>

+ 218 - 0
app/src/main/res/layout/dialog_date_time_picker.xml

@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Nextcloud Talk application
+  ~
+  ~ @author Julius Linus
+  ~ Copyright (C) 2023 Julius Linus <julius.linus@nextcloud.com>
+  ~
+  ~ This program is free software: you can redistribute it and/or modify
+  ~ it under the terms of the GNU General Public License as published by
+  ~ the Free Software Foundation, either version 3 of the License, or
+  ~ at your option) any later version.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ~ GNU General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU General Public License
+  ~ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:background="@color/white">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/standard_margin"
+        android:orientation="horizontal">
+
+        <com.google.android.material.textview.MaterialTextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="@string/nc_remind"
+            android:layout_weight="1"
+            android:textSize="@dimen/md_title_textsize" />
+
+        <com.google.android.material.textview.MaterialTextView
+            android:id="@+id/date_time_picker_timestamp"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            tools:text="Apr 15th, 8:00 AM"
+            android:textSize="@dimen/supporting_text_text_size"
+            android:textStyle="bold" />
+
+    </LinearLayout>
+
+
+    <com.google.android.material.divider.MaterialDivider
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+    <LinearLayout
+        android:id="@+id/date_time_picker_later_today"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="?android:attr/selectableItemBackground"
+        android:orientation="horizontal"
+        android:padding="@dimen/standard_padding">
+
+        <com.google.android.material.textview.MaterialTextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:text="@string/later_today"
+            android:textSize="@dimen/headline_text_size" />
+
+        <com.google.android.material.textview.MaterialTextView
+            android:id="@+id/date_time_picker_later_today_textview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="@dimen/headline_text_size"
+            android:text="" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/date_time_picker_tomorrow"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="?android:attr/selectableItemBackground"
+        android:orientation="horizontal"
+        android:padding="@dimen/standard_padding">
+
+        <com.google.android.material.textview.MaterialTextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:text="@string/tomorrow"
+            android:textSize="@dimen/headline_text_size" />
+
+        <com.google.android.material.textview.MaterialTextView
+            android:id="@+id/date_time_picker_tomorrow_textview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="@dimen/headline_text_size"
+            android:text="" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/date_time_picker_weekend"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="?android:attr/selectableItemBackground"
+        android:orientation="horizontal"
+        android:padding="@dimen/standard_padding">
+
+        <com.google.android.material.textview.MaterialTextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:text="@string/this_weekend"
+            android:textSize="@dimen/headline_text_size" />
+
+        <com.google.android.material.textview.MaterialTextView
+            android:id="@+id/date_time_picker_weekend_textview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="@dimen/headline_text_size"
+            android:text="" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/date_time_picker_next_week"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="?android:attr/selectableItemBackground"
+        android:orientation="horizontal"
+        android:padding="@dimen/standard_padding">
+
+        <com.google.android.material.textview.MaterialTextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:text="@string/next_week"
+            android:textSize="@dimen/headline_text_size" />
+
+        <com.google.android.material.textview.MaterialTextView
+            android:id="@+id/date_time_picker_next_week_textview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="@dimen/headline_text_size"
+            android:text="" />
+    </LinearLayout>
+
+    <com.google.android.material.divider.MaterialDivider
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+    <LinearLayout
+        android:id="@+id/date_time_picker_custom"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:padding="@dimen/standard_padding"
+        android:background="?android:attr/selectableItemBackground">
+
+        <ImageView
+            android:id="@+id/date_time_picker_custom_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/baseline_calendar_month_24"
+            android:paddingEnd="@dimen/standard_double_padding"
+            tools:ignore="RtlSymmetry"
+            android:contentDescription="@string/calendar" />
+
+        <com.google.android.material.textview.MaterialTextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:text="@string/custom"
+            android:layout_weight="1"
+            android:textSize="@dimen/headline_text_size" />
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:layout_weight="1">
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/button_delete"
+                style="@style/Button.Borderless"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:minHeight="@dimen/min_size_clickable_area"
+                android:text="@string/nc_delete"
+                android:textColor="@color/design_default_color_error" />
+
+        </LinearLayout>
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/button_set"
+            style="@style/Button.Borderless"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:minHeight="@dimen/min_size_clickable_area"
+            android:text="@string/set" />
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/button_close"
+            style="@style/Button.Borderless"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="end"
+            android:minHeight="@dimen/min_size_clickable_area"
+            android:text="@string/close" />
+
+    </LinearLayout>
+
+
+</LinearLayout>

+ 33 - 0
app/src/main/res/layout/dialog_message_actions.xml

@@ -221,6 +221,39 @@
 
         </LinearLayout>
 
+        <LinearLayout
+            android:id="@+id/menu_notify_message"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/bottom_sheet_item_height"
+            android:background="?android:attr/selectableItemBackground"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            tools:ignore="UseCompoundDrawables">
+
+            <ImageView
+                android:id="@+id/menu_icon_notify_message"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:contentDescription="@null"
+                android:paddingStart="@dimen/standard_padding"
+                android:paddingEnd="@dimen/zero"
+                android:src="@drawable/ic_timer_black_24dp"
+                app:tint="@color/high_emphasis_menu_icon" />
+
+            <androidx.appcompat.widget.AppCompatTextView
+                android:id="@+id/menu_text_notify_message"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="start|center_vertical"
+                android:paddingStart="@dimen/standard_double_padding"
+                android:paddingEnd="@dimen/standard_padding"
+                android:text="@string/nc_remind"
+                android:textAlignment="viewStart"
+                android:textColor="@color/high_emphasis_text"
+                android:textSize="@dimen/bottom_sheet_text_size" />
+
+        </LinearLayout>
+
         <LinearLayout
             android:id="@+id/menu_mark_as_unread"
             android:layout_width="match_parent"

+ 78 - 42
app/src/main/res/layout/item_system_message.xml

@@ -24,52 +24,88 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginStart="@dimen/standard_margin"
-    android:layout_marginTop="@dimen/standard_eighth_margin"
-    android:layout_marginEnd="@dimen/standard_margin"
-    android:layout_marginBottom="@dimen/standard_eighth_margin">
+    android:layout_height="wrap_content">
 
-    <com.google.android.flexbox.FlexboxLayout
-        android:id="@id/container"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:orientation="vertical"
-        android:padding="@dimen/standard_half_padding"
-        app:alignContent="stretch"
-        app:alignItems="stretch"
-        app:flexWrap="wrap"
-        app:justifyContent="flex_end">
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:id="@+id/systemMessageLayout"
+        android:layout_marginStart="@dimen/standard_margin"
+        android:layout_marginTop="@dimen/standard_eighth_margin"
+        android:layout_marginEnd="@dimen/standard_margin"
+        android:layout_marginBottom="@dimen/standard_eighth_margin">
 
-        <androidx.emoji2.widget.EmojiTextView
-            android:id="@+id/messageText"
+        <ImageView
+            android:id="@+id/expandCollapseIcon"
+            android:layout_width="24dp"
+            android:layout_height="24dp"
+            android:layout_alignParentTop="true"
+            android:layout_margin="10dp"
+            android:contentDescription="@null"
+            android:visibility="gone"
+            tools:visibility="visible"/>
+
+        <com.google.android.flexbox.FlexboxLayout
+            android:id="@id/container"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerHorizontal="true"
-            android:layout_marginStart="@dimen/standard_margin"
-            android:layout_marginEnd="@dimen/standard_margin"
-            android:gravity="center_horizontal"
-            android:textAlignment="center"
-            android:textColor="@color/textColorMaxContrast"
-            android:textSize="14sp"
-            app:layout_alignSelf="flex_start"
-            app:layout_flexGrow="1"
-            app:layout_wrapBefore="true"
-            tools:text="System message" />
+            android:orientation="vertical"
+            android:padding="@dimen/standard_half_padding"
+            app:alignContent="stretch"
+            app:alignItems="stretch"
+            app:flexWrap="wrap"
+            app:justifyContent="flex_end">
+
+            <androidx.emoji2.widget.EmojiTextView
+                android:id="@+id/messageText"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerHorizontal="true"
+                android:layout_marginStart="@dimen/standard_margin"
+                android:layout_marginEnd="@dimen/standard_margin"
+                android:gravity="center_horizontal"
+                android:textAlignment="center"
+                android:textColor="@color/textColorMaxContrast"
+                android:textSize="14sp"
+                app:layout_alignSelf="flex_start"
+                app:layout_flexGrow="1"
+                app:layout_wrapBefore="true"
+                tools:text="System message" />
+
+            <TextView
+                android:id="@id/messageTime"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/standard_half_margin"
+                android:layout_marginEnd="@dimen/standard_margin"
+                android:gravity="end"
+                android:textColor="@color/warm_grey_four"
+                android:textSize="12sp"
+                app:layout_alignSelf="center"
+                app:layout_flexGrow="1"
+                app:layout_wrapBefore="false"
+                tools:text="17:30" />
+
+            <androidx.emoji2.widget.EmojiTextView
+                android:id="@+id/similarMessagesHint"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerHorizontal="true"
+                android:layout_marginStart="@dimen/standard_margin"
+                android:layout_marginEnd="@dimen/standard_margin"
+                android:gravity="center_horizontal"
+                android:textAlignment="center"
+                android:textColor="@color/grey_600"
+                android:textStyle="bold"
+                android:textSize="14sp"
+                app:layout_alignSelf="center"
+                app:layout_flexGrow="1"
+                app:layout_wrapBefore="true"
+                tools:text="See 5 similar messages" />
+        </com.google.android.flexbox.FlexboxLayout>
+
+    </RelativeLayout>
+
 
-        <TextView
-            android:id="@id/messageTime"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="@dimen/standard_half_margin"
-            android:layout_marginEnd="@dimen/standard_margin"
-            android:gravity="end"
-            android:textColor="@color/warm_grey_four"
-            android:textSize="12sp"
-            app:layout_alignSelf="center"
-            app:layout_flexGrow="1"
-            app:layout_wrapBefore="false"
-            tools:text="17:30" />
-    </com.google.android.flexbox.FlexboxLayout>
 </RelativeLayout>

+ 2 - 0
app/src/main/res/values-es-rEC/strings.xml

@@ -395,6 +395,7 @@
     <string name="nc_wrong_link">La liga de la conversación no es válida</string>
     <string name="nc_wrong_password">Contraseña equivocada</string>
     <string name="nc_yes">Sí</string>
+    <string name="next_week">Semana siguiente</string>
     <string name="no_phone_book_integration_due_to_permissions">No hay integración de número de teléfono debido a permisos faltantes</string>
     <string name="oneHour">1 hora</string>
     <string name="online">En línea</string>
@@ -448,6 +449,7 @@
     <string name="send_to_forbidden">No tienes permiso para compartir contenido en este chat</string>
     <string name="send_to_three_dots">Enviar a...</string>
     <string name="send_without_notification">Enviar sin notificación</string>
+    <string name="set">Establecer</string>
     <string name="set_avatar_from_camera">Establecer avatar desde la cámara</string>
     <string name="set_status">Establecer estado</string>
     <string name="set_status_message">Establecer mensaje de estado</string>

+ 3 - 0
app/src/main/res/values-eu/strings.xml

@@ -35,6 +35,7 @@
     <string name="filename_progress">%1$s(%2$d)</string>
     <string name="fourHours">4 ordu</string>
     <string name="invisible">Ikusezina</string>
+    <string name="later_today">Beranduago gaur</string>
     <string name="load_more_results">Kargatu emaitza gehiago </string>
     <string name="lock_symbol">Blokeo sinboloa</string>
     <string name="lower_hand">Jaitsi eskua</string>
@@ -403,6 +404,7 @@
     <string name="nc_wrong_link">Elkarrizketa esteka ez da baliozkoa</string>
     <string name="nc_wrong_password">Pasahitz okerra</string>
     <string name="nc_yes">Bai</string>
+    <string name="next_week">Hurrengo astea</string>
     <string name="no_phone_book_integration_due_to_permissions">Ezin izan da telefono zenbakia integratu, baimen falta dela eta</string>
     <string name="oneHour">Ordu 1</string>
     <string name="online">Linean</string>
@@ -456,6 +458,7 @@
     <string name="send_to_forbidden">Ez duzu edukirik partekatzeko baimentik txat honetan</string>
     <string name="send_to_three_dots">Bidali honi …</string>
     <string name="send_without_notification">Bidali jakinarazpenik gabe</string>
+    <string name="set">Ezarri</string>
     <string name="set_avatar_from_camera">Ezarri avatarra kameraren bidez</string>
     <string name="set_status">Ezarri egoera</string>
     <string name="set_status_message">Ezarri egoera-mezua</string>

+ 2 - 0
app/src/main/res/values-fa/strings.xml

@@ -403,6 +403,7 @@
     <string name="nc_wrong_link">پیوند مکالمه معتبر نیست</string>
     <string name="nc_wrong_password">کلمه عبور اشتباه</string>
     <string name="nc_yes">بله</string>
+    <string name="next_week">هفتهٔ بعد</string>
     <string name="no_phone_book_integration_due_to_permissions">No phone number integration due to missing permissions</string>
     <string name="oneHour">۱ ساعت</string>
     <string name="online">آنلاین</string>
@@ -456,6 +457,7 @@
     <string name="send_to_forbidden">You are not allowed to share content to this chat</string>
     <string name="send_to_three_dots">Send to …</string>
     <string name="send_without_notification">Send without notification</string>
+    <string name="set">تنظیم</string>
     <string name="set_avatar_from_camera">Set avatar from camera</string>
     <string name="set_status">تنظیم وضعیت</string>
     <string name="set_status_message">تنظیم پیام وضعیت</string>

+ 3 - 0
app/src/main/res/values-fi-rFI/strings.xml

@@ -27,6 +27,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4 tuntia</string>
     <string name="invisible">Näkymätön</string>
+    <string name="later_today">Myöhemmin tänään</string>
     <string name="load_more_results">Lataa lisää tuloksia</string>
     <string name="lower_hand">Laske käsi</string>
     <string name="menu_item_sort_by_date_newest_first">Uusin ensin</string>
@@ -310,6 +311,7 @@
     <string name="nc_wrong_link">Keskustelulinkki ei ole kelvollinen</string>
     <string name="nc_wrong_password">Väärä salasana</string>
     <string name="nc_yes">Kyllä</string>
+    <string name="next_week">Seuraava viikko</string>
     <string name="oneHour">1 tunti</string>
     <string name="online">Paikalla</string>
     <string name="online_status">Online-tila</string>
@@ -344,6 +346,7 @@
     <string name="send_to_forbidden">Sinulla ei ole oikeutta jakaa sisältöä tähän keskusteluun</string>
     <string name="send_to_three_dots">Lähetä…</string>
     <string name="send_without_notification">Lähetä ilman ilmoitusta</string>
+    <string name="set">Aseta</string>
     <string name="set_status">Aseta tilatieto</string>
     <string name="set_status_message">Aseta tilaviesti</string>
     <string name="share">Jaa</string>

+ 11 - 0
app/src/main/res/values-fr/strings.xml

@@ -10,12 +10,14 @@
     <string name="avatar">Avatar</string>
     <string name="away">Absent(e)</string>
     <string name="call_more_actions_dialog_headline">Options d\'appel avancées</string>
+    <string name="call_running_since_one_hour">L\'appel est en cours depuis une heure.</string>
     <string name="call_without_notification">Appeler sans notification</string>
     <string name="camera_permission_granted">Caméra autorisée. Merci de choisir à nouveau la caméra .</string>
     <string name="choose_avatar_from_cloud">Sélectionner l\'avatar depuis le cloud</string>
     <string name="clear_status_message">Effacer le message d\'état</string>
     <string name="clear_status_message_after">Effacer le message d\'état après</string>
     <string name="close">Fermer</string>
+    <string name="continuous_voice_message_recording">Verrouiller l\'enregistrement pour enregistrer en continu le message vocal</string>
     <string name="conversations">Discussions</string>
     <string name="danger_zone">Zone de danger</string>
     <string name="delete_avatar">Supprimer l\'avatar</string>
@@ -63,6 +65,7 @@
     <string name="nc_allow_guests">Autoriser les invités</string>
     <string name="nc_attendee_pin">Épingler : %1$s</string>
     <string name="nc_biometric_unlock">Déverrouiller %1$s</string>
+    <string name="nc_bluetooth_permission_hint">Pour activer les écouteurs bluetooth, merci de donner la permission \"Appareils à proximité\".</string>
     <string name="nc_call_button_content_description_advanced">Options d\'appel avancées</string>
     <string name="nc_call_button_content_description_answer_video_call">Répondre par appel vidéo</string>
     <string name="nc_call_button_content_description_answer_voice_only">Répondre par appel vocal uniquement</string>
@@ -86,6 +89,7 @@
     <string name="nc_call_unknown">%s appel</string>
     <string name="nc_call_video">%s appel vidéo</string>
     <string name="nc_call_voice">%s appel audio</string>
+    <string name="nc_camera_permission_hint">Pour activer la communication vidéo, merci de donner l\'autorisation \"Appareil photo\".</string>
     <string name="nc_camera_permission_permanently_denied">Pour permettre les communications vidéo, veuillez autoriser l’utilisation de la caméra dans les paramètres du système.</string>
     <string name="nc_cancel">Annuler</string>
     <string name="nc_capabilities_failed">Échec de la récupération des capacités, abandon</string>
@@ -207,6 +211,7 @@
     <string name="nc_message_quote_cancel_reply">Annuler la réponse</string>
     <string name="nc_message_read">Message lu</string>
     <string name="nc_message_sent">Message envoyé</string>
+    <string name="nc_microphone_permission_hint">Pour autoriser la communication audio, merci de donner l\'autorisation \"Microphone\".</string>
     <string name="nc_microphone_permission_permanently_denied">Pour permettre les communications audio, veuillez autoriser l’utilisation du microphone dans les paramètres du système.</string>
     <string name="nc_missed_call">Vous avez manqué un appel de %s</string>
     <string name="nc_moderator">Modérateur</string>
@@ -240,7 +245,11 @@
     <string name="nc_participants">Participants</string>
     <string name="nc_participants_add">Ajouter des participants</string>
     <string name="nc_password">Mot de passe</string>
+    <string name="nc_permissions_ask">Définir les autorisations</string>
+    <string name="nc_permissions_denied">Certaines autorisations n\'ont pas été accordées.</string>
+    <string name="nc_permissions_rationale_dialog_title">Merci de donner les autorisations</string>
     <string name="nc_permissions_settings">Ouvrir les paramètres</string>
+    <string name="nc_permissions_settings_hint">Merci de donner les autorisations dans Paramètres > Autorisations</string>
     <string name="nc_phone_book_integration_account_not_found">Compte introuvable</string>
     <string name="nc_phone_book_integration_chat_via">Chat via %s</string>
     <string name="nc_pip_microphone_mute">Désactiver le micro</string>
@@ -394,6 +403,7 @@
     <string name="nc_wrong_link">Le lien de conversation n\'est pas valide.</string>
     <string name="nc_wrong_password">Mot de passe incorrect</string>
     <string name="nc_yes">Oui</string>
+    <string name="next_week">Semaine suivante</string>
     <string name="no_phone_book_integration_due_to_permissions">Pas d\'intégration avec le carnet d\'adresses à cause d\'autorisations manquantes</string>
     <string name="oneHour">1 heure</string>
     <string name="online">En ligne</string>
@@ -447,6 +457,7 @@
     <string name="send_to_forbidden">Vous n\'êtes pas autorisé à partager du contenu dans cette conversation</string>
     <string name="send_to_three_dots">Envoyer a…</string>
     <string name="send_without_notification">Envoyer sans notification</string>
+    <string name="set">Affecter</string>
     <string name="set_avatar_from_camera">Définir l\'avatar depuis la caméra</string>
     <string name="set_status">Définir le statut</string>
     <string name="set_status_message">Définir le message de statut</string>

+ 5 - 0
app/src/main/res/values-gl/strings.xml

@@ -19,6 +19,7 @@
     <string name="close">Pechar</string>
     <string name="continuous_voice_message_recording">Bloquear a gravación para gravar continuamente a mensaxe de voz</string>
     <string name="conversations">Conversas</string>
+    <string name="custom">Personalizado</string>
     <string name="danger_zone">Zona de perigo</string>
     <string name="delete_avatar">Eliminar avatar</string>
     <string name="dnd">Non molestar</string>
@@ -35,6 +36,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4 horas</string>
     <string name="invisible">Invisíbel</string>
+    <string name="later_today">Hoxe máis tarde</string>
     <string name="load_more_results">Cargando máis resultados</string>
     <string name="lock_symbol">Símbolo de bloqueo</string>
     <string name="lower_hand">Baixar a man</string>
@@ -403,6 +405,7 @@
     <string name="nc_wrong_link">A ligazón da conversa non é válida</string>
     <string name="nc_wrong_password">Contrasinal incorrecto </string>
     <string name="nc_yes">Si</string>
+    <string name="next_week">Semana seguinte</string>
     <string name="no_phone_book_integration_due_to_permissions">Non hai integración do número de teléfono por mor da falta de permisos</string>
     <string name="oneHour">1 hora</string>
     <string name="online">En liña</string>
@@ -456,6 +459,7 @@
     <string name="send_to_forbidden">Non ten permiso para compartir contido nesta parola</string>
     <string name="send_to_three_dots">Enviar a…</string>
     <string name="send_without_notification">Enviar sen notificación</string>
+    <string name="set">Estabelecer</string>
     <string name="set_avatar_from_camera">Estabelecer o avatar dende a cámara</string>
     <string name="set_status">Estabelecer o estado</string>
     <string name="set_status_message">Estabelecer a mensaxe de estado</string>
@@ -484,6 +488,7 @@
     <string name="thirtyMinutes">30 minutos</string>
     <string name="thisWeek">Esta semana</string>
     <string name="this_is_a_test_message">Esta é unha mensaxe de proba</string>
+    <string name="this_weekend">Este fin de semana</string>
     <string name="title_attachments">Anexos</string>
     <string name="today">Hoxe</string>
     <string name="translate">Traducir</string>

+ 3 - 0
app/src/main/res/values-hr/strings.xml

@@ -11,6 +11,7 @@
     <string name="clear_status_message_after">Izbriši poruku statusa nakon</string>
     <string name="close">Zatvori</string>
     <string name="conversations">Razgovori</string>
+    <string name="custom">Prilagođeno</string>
     <string name="delete_avatar">Izbriši avatar</string>
     <string name="dnd">Ne ometaj</string>
     <string name="dontClear">Ne briši</string>
@@ -328,6 +329,7 @@
     <string name="nc_wrong_link">Poveznica za razgovor nije valjana</string>
     <string name="nc_wrong_password">Pogrešna zaporka</string>
     <string name="nc_yes">Da</string>
+    <string name="next_week">Sljedeći tjedan</string>
     <string name="no_phone_book_integration_due_to_permissions">Integracija broja telefona nije moguća jer nedostaje dopuštenje</string>
     <string name="oneHour">1 sat</string>
     <string name="online">Na mreži</string>
@@ -358,6 +360,7 @@
     <string name="selected_list_item">Odabrano</string>
     <string name="send_to">Pošalji na</string>
     <string name="send_to_three_dots">Pošalji na…</string>
+    <string name="set">Postavi</string>
     <string name="set_status">Postavi status</string>
     <string name="set_status_message">Postavi poruku statusa</string>
     <string name="share">Dijeli</string>

+ 3 - 0
app/src/main/res/values-hu-rHU/strings.xml

@@ -17,6 +17,7 @@
     <string name="clear_status_message_after">Állapotüzenet törlése ennyi idő után:</string>
     <string name="close">Bezárás</string>
     <string name="conversations">Beszélgetések</string>
+    <string name="custom">Egyéni</string>
     <string name="delete_avatar">Profilkép törlése</string>
     <string name="dnd">Ne zavarjanak</string>
     <string name="dontClear">Ne törölje</string>
@@ -388,6 +389,7 @@
     <string name="nc_wrong_link">A beszélgetési hivatkozás nem érvényes</string>
     <string name="nc_wrong_password">Hibás jelszó</string>
     <string name="nc_yes">Igen</string>
+    <string name="next_week">Következő hét</string>
     <string name="no_phone_book_integration_due_to_permissions">Nincs telefonszám integráció hiányzó engedélyek miatt</string>
     <string name="oneHour">1 óra</string>
     <string name="online">Elérhető</string>
@@ -441,6 +443,7 @@
     <string name="send_to_forbidden">Nincs jogosultsága, hogy tartalmat osszon meg ebben a csevegésben</string>
     <string name="send_to_three_dots">Küldés…</string>
     <string name="send_without_notification">Küldés értesítés nélkül</string>
+    <string name="set">Beállítás</string>
     <string name="set_avatar_from_camera">Profilkép beállítása a kamerával</string>
     <string name="set_status">Állapot beállítása</string>
     <string name="set_status_message">Állapotüzenet beállítása</string>

+ 3 - 0
app/src/main/res/values-is/strings.xml

@@ -10,6 +10,7 @@
     <string name="clear_status_message_after">Hreinsa stöðuskilaboð eftir</string>
     <string name="close">Loka</string>
     <string name="conversations">Samtöl</string>
+    <string name="custom">Sérsniðið</string>
     <string name="dnd">Ónáðið ekki</string>
     <string name="dontClear">Ekki hreinsa</string>
     <string name="edit">Breyta</string>
@@ -233,6 +234,7 @@
     <string name="nc_wrong_link">Samskiptatengill er ekki gildur</string>
     <string name="nc_wrong_password">Rangt lykilorð</string>
     <string name="nc_yes">Já</string>
+    <string name="next_week">Næsta viku</string>
     <string name="oneHour">1 klukkustund</string>
     <string name="online">Á netinu</string>
     <string name="online_status">Staða á netinu</string>
@@ -248,6 +250,7 @@
     <string name="scope_published_title">Útgefið</string>
     <string name="secondsAgo">sekúndum síðan</string>
     <string name="selected_list_item">Valið</string>
+    <string name="set">Setja</string>
     <string name="set_status">Setja stöðu</string>
     <string name="set_status_message">Setja stöðuskilaboð</string>
     <string name="share">Deila</string>

+ 4 - 0
app/src/main/res/values-it/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Auricolare cablato</string>
     <string name="avatar">Avatar</string>
     <string name="away">Assente</string>
+    <string name="calendar">Calendario</string>
     <string name="call_more_actions_dialog_headline">Opzioni avanzate per le chiamate</string>
     <string name="call_without_notification">Chiama senza notifica</string>
     <string name="camera_permission_granted">Autorizzazione fotocamera concessa. Scegli di nuovo la fotocamera.</string>
@@ -17,6 +18,7 @@
     <string name="clear_status_message_after">Cancella il messaggio di stato dopo</string>
     <string name="close">Chiudi</string>
     <string name="conversations">Conversazioni</string>
+    <string name="custom">Personalizzato</string>
     <string name="delete_avatar">Elimina avatar</string>
     <string name="dnd">Non disturbare</string>
     <string name="dontClear">Non cancellare</string>
@@ -349,6 +351,7 @@
     <string name="nc_wrong_link">Il collegamento della conversazione non è valido</string>
     <string name="nc_wrong_password">Password errata</string>
     <string name="nc_yes">Sì</string>
+    <string name="next_week">Settimana successiva</string>
     <string name="no_phone_book_integration_due_to_permissions">Nessuna integrazione del numero di telefono a causa di autorizzazioni mancanti</string>
     <string name="oneHour">1 ora</string>
     <string name="online">In linea</string>
@@ -381,6 +384,7 @@
     <string name="selected_list_item">Selezionato</string>
     <string name="send_to">Invia a</string>
     <string name="send_to_three_dots">Invia a…</string>
+    <string name="set">Imposta</string>
     <string name="set_status">Imposta stato</string>
     <string name="set_status_message">Imposta messaggio di stato</string>
     <string name="share">Condividi</string>

+ 3 - 0
app/src/main/res/values-iw/strings.xml

@@ -9,6 +9,7 @@
     <string name="clear_status_message_after">מחיקת הודעת מצב לאחר</string>
     <string name="close">סגירה</string>
     <string name="conversations">דיונים</string>
+    <string name="custom">מותאם אישית</string>
     <string name="dnd">לא להפריע</string>
     <string name="dontClear">לא לפנות</string>
     <string name="edit">עריכה</string>
@@ -246,6 +247,7 @@
     <string name="nc_wrong_link">הקישור לדיון אינו תקף</string>
     <string name="nc_wrong_password">ססמה שגויה</string>
     <string name="nc_yes">כן</string>
+    <string name="next_week">השבוע הבא</string>
     <string name="oneHour">שעה</string>
     <string name="online">מקוון</string>
     <string name="online_status">מצב מקוון</string>
@@ -260,6 +262,7 @@
     <string name="scope_published_description">לסנכרן מול שרתים מהימנים וספר הכתובות הגלובלי והציבורי</string>
     <string name="secondsAgo">לפני מספר שניות</string>
     <string name="selected_list_item">Selected</string>
+    <string name="set">הגדרה</string>
     <string name="set_status">הגדרת מצב</string>
     <string name="set_status_message">הגדרת הודעת מצב</string>
     <string name="share">שתף</string>

+ 4 - 0
app/src/main/res/values-ja-rJP/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">有線ヘッドセット</string>
     <string name="avatar">アバター</string>
     <string name="away">離席中</string>
+    <string name="calendar">カレンダー</string>
     <string name="call_running_since_one_hour">通話が1 時間経過</string>
     <string name="call_without_notification">通知なしで通話</string>
     <string name="choose_avatar_from_cloud">クラウドからアバターを選択</string>
@@ -16,6 +17,7 @@
     <string name="clear_status_message_after">ステータスメッセージの有効期限</string>
     <string name="close">閉じる</string>
     <string name="conversations">会話</string>
+    <string name="custom">カスタム</string>
     <string name="delete_avatar">アバターを削除</string>
     <string name="dnd">取り込み中</string>
     <string name="dontClear">消去しない</string>
@@ -345,6 +347,7 @@
     <string name="nc_wrong_link">会話リンクが無効です</string>
     <string name="nc_wrong_password">パスワードが間違っています</string>
     <string name="nc_yes">はい</string>
+    <string name="next_week">来週</string>
     <string name="no_phone_book_integration_due_to_permissions">利用権限がないため、電話番号統合ができません。</string>
     <string name="oneHour">1時間</string>
     <string name="online">オンライン</string>
@@ -382,6 +385,7 @@
     <string name="send_to_forbidden">このチャットにコンテンツを許可する権限がありません</string>
     <string name="send_to_three_dots">送信…</string>
     <string name="send_without_notification">通知なしで送信</string>
+    <string name="set">セット</string>
     <string name="set_status">ステータスを設定</string>
     <string name="set_status_message">メッセージを設定</string>
     <string name="share">共有</string>

+ 3 - 0
app/src/main/res/values-ko/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">유선 헤드셋</string>
     <string name="avatar">아바타</string>
     <string name="away">자리비움</string>
+    <string name="calendar">일정</string>
     <string name="call_without_notification">알림 없이 전화하기</string>
     <string name="camera_permission_granted">카메라 권한이 부여되었습니다 . 카메라를 다시 선택해주세요.</string>
     <string name="choose_avatar_from_cloud">클라우드에서 아바타 선택</string>
@@ -16,6 +17,7 @@
     <string name="clear_status_message_after">상태 메시지 지우기 예약</string>
     <string name="close">닫기</string>
     <string name="conversations">대화</string>
+    <string name="custom">사용자 정의</string>
     <string name="delete_avatar">아바타 삭제</string>
     <string name="dnd">방해 없음</string>
     <string name="dontClear">지우지 않음</string>
@@ -367,6 +369,7 @@
     <string name="nc_wrong_link">무효한 대화 링크</string>
     <string name="nc_wrong_password">잘못된 암호</string>
     <string name="nc_yes">예</string>
+    <string name="next_week">다음주</string>
     <string name="no_phone_book_integration_due_to_permissions">권한 없음으로 인하여 전화 번호를 통합하지 않습니다.</string>
     <string name="oneHour">1시간</string>
     <string name="online">접속 중</string>

+ 4 - 0
app/src/main/res/values-lt-rLT/strings.xml

@@ -5,10 +5,12 @@
     <string name="audio_output_phone">Telefonas</string>
     <string name="avatar">Avataras</string>
     <string name="away">Atsitraukęs</string>
+    <string name="calendar">Kalendorius</string>
     <string name="clear_status_message">Išvalyti būsenos žinutę</string>
     <string name="clear_status_message_after">Išvalyti būsenos žinutę po</string>
     <string name="close">Užverti</string>
     <string name="conversations">Pokalbiai</string>
+    <string name="custom">Tinkinti</string>
     <string name="dnd">Netrukdyti</string>
     <string name="dontClear">Neišvalyti</string>
     <string name="edit">Taisyti</string>
@@ -247,6 +249,7 @@
     <string name="nc_wrong_link">Pokalbio nuoroda negalioja</string>
     <string name="nc_wrong_password">Neteisingas slaptažodis</string>
     <string name="nc_yes">Taip</string>
+    <string name="next_week">Kita savaitė</string>
     <string name="oneHour">1 valanda</string>
     <string name="online">Prisijungęs</string>
     <string name="online_status">Prisijungimo būsena</string>
@@ -274,6 +277,7 @@
     <string name="scroll_to_bottom">Slinkti į apačią</string>
     <string name="secondsAgo">prieš keletą sekundžių</string>
     <string name="selected_list_item">Pasirinkta</string>
+    <string name="set">Nustatyti</string>
     <string name="set_status">Nustatyti būseną</string>
     <string name="set_status_message">Nustatyti būsenos žinutę</string>
     <string name="share">Bendrinti</string>

+ 6 - 0
app/src/main/res/values-nb-rNO/strings.xml

@@ -8,10 +8,12 @@
     <string name="audio_output_speaker">Høytaler</string>
     <string name="avatar">Avatar</string>
     <string name="away">Borte</string>
+    <string name="calendar">Kalender</string>
     <string name="clear_status_message">Fjern statusmelding</string>
     <string name="clear_status_message_after">Fjern statusmelding etter</string>
     <string name="close">Lukk</string>
     <string name="conversations">Samtaler</string>
+    <string name="custom">Egendefinert</string>
     <string name="delete_avatar">Slett data</string>
     <string name="dnd">Ikke forstyrr</string>
     <string name="dontClear">Ikke fjern</string>
@@ -23,6 +25,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4 timer</string>
     <string name="invisible">Usynlig</string>
+    <string name="later_today">Senere i dag</string>
     <string name="load_more_results">Hent flere resultat</string>
     <string name="lower_hand">Senk hånden</string>
     <string name="menu_item_sort_by_date_newest_first">Nyeste først</string>
@@ -267,6 +270,7 @@
     <string name="nc_wrong_link">Samtale lenke er ikke gyldig</string>
     <string name="nc_wrong_password">Feil passord</string>
     <string name="nc_yes">Ja</string>
+    <string name="next_week">Neste uke</string>
     <string name="oneHour">1 time</string>
     <string name="online">Pålogget</string>
     <string name="online_status">Online-status</string>
@@ -290,6 +294,7 @@
     <string name="selected_list_item">Valgt</string>
     <string name="send_to">Send til</string>
     <string name="send_to_three_dots">Send til...</string>
+    <string name="set">Sett</string>
     <string name="set_status">Velg status</string>
     <string name="set_status_message">Velg statusmelding</string>
     <string name="share">Del</string>
@@ -309,6 +314,7 @@
     <string name="take_photo_toggle_torch">Lommelykt av/på</string>
     <string name="thirtyMinutes">30 minutter</string>
     <string name="thisWeek">Denne uken</string>
+    <string name="this_weekend">Denne helgen</string>
     <string name="title_attachments">Vedlegg</string>
     <string name="today">I dag</string>
     <string name="translate">Oversette</string>

+ 5 - 0
app/src/main/res/values-nl/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Bedrade headset</string>
     <string name="avatar">Avatar</string>
     <string name="away">Afwezig</string>
+    <string name="calendar">Agenda</string>
     <string name="call_more_actions_dialog_headline">Geavanceerde oproepopties</string>
     <string name="call_without_notification">Oproepen zonder melding</string>
     <string name="camera_permission_granted">Toegang tot camera verleend. Kies aub. uw camera opnieuw.</string>
@@ -17,6 +18,7 @@
     <string name="clear_status_message_after">Statusbericht wissen na</string>
     <string name="close">Sluit</string>
     <string name="conversations">Gesprekken</string>
+    <string name="custom">Aangepast</string>
     <string name="delete_avatar">Verwijder avatar</string>
     <string name="dnd">Niet storen</string>
     <string name="dontClear">Niet opruimen</string>
@@ -357,6 +359,7 @@ Kies er eentje van een provider.</string>
     <string name="nc_wrong_link">Gesprekslink is niet geldig</string>
     <string name="nc_wrong_password">Onjuist wachtwoord</string>
     <string name="nc_yes">Ja</string>
+    <string name="next_week">Volgende week</string>
     <string name="no_phone_book_integration_due_to_permissions">Geen telefoonnummer-integratie wegens ontbrekende machtigingen</string>
     <string name="oneHour">1 uur</string>
     <string name="online">Online</string>
@@ -400,6 +403,7 @@ Kies er eentje van een provider.</string>
     <string name="send_to">Versturen naar</string>
     <string name="send_to_three_dots">Versturen naar …</string>
     <string name="send_without_notification">Versturen zonder melding</string>
+    <string name="set">Stel in</string>
     <string name="set_status">Instellen status</string>
     <string name="set_status_message">Statusbericht instellen</string>
     <string name="share">Delen</string>
@@ -424,6 +428,7 @@ Kies er eentje van een provider.</string>
     <string name="thisWeek">Deze week</string>
     <string name="title_attachments">Bijlagen</string>
     <string name="today">Vandaag</string>
+    <string name="tomorrow">Morgen</string>
     <string name="translation_device_settings">Apparaatinstellingen</string>
     <string name="translation_error_message">Kan taal niet detecteren</string>
     <string name="translation_from">Van</string>

+ 5 - 0
app/src/main/res/values-pl/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Słuchawki przewodowe</string>
     <string name="avatar">Awatar</string>
     <string name="away">Bezczynny</string>
+    <string name="calendar">Kalendarz</string>
     <string name="call_more_actions_dialog_headline">Zaawansowane opcje połączeń</string>
     <string name="call_without_notification">Połącz bez powiadomienia</string>
     <string name="camera_permission_granted">Udzielono dostępu do kamery. Proszę ponownie wybrać kamerę.</string>
@@ -18,6 +19,7 @@
     <string name="close">Zamknij</string>
     <string name="continuous_voice_message_recording">Zablokuj nagrywanie w celu ciągłego nagrywania wiadomości głosowej</string>
     <string name="conversations">Rozmowy</string>
+    <string name="custom">Dowolnie</string>
     <string name="danger_zone">Strefa niebezpieczeństwa</string>
     <string name="delete_avatar">Usuń awatar</string>
     <string name="dnd">Nie przeszkadzać</string>
@@ -395,6 +397,7 @@
     <string name="nc_wrong_link">Link rozmowy jest nieprawidłowy</string>
     <string name="nc_wrong_password">Złe hasło</string>
     <string name="nc_yes">Tak</string>
+    <string name="next_week">Następny tydzień</string>
     <string name="no_phone_book_integration_due_to_permissions">Brak integracji numeru telefonu z powodu braku uprawnień</string>
     <string name="oneHour">1 godzina</string>
     <string name="online">Online</string>
@@ -448,6 +451,7 @@
     <string name="send_to_forbidden">Nie możesz udostępniać treści na tym czacie</string>
     <string name="send_to_three_dots">Wyślij do…</string>
     <string name="send_without_notification">Wyślij bez powiadomienia</string>
+    <string name="set">Ustaw</string>
     <string name="set_avatar_from_camera">Ustaw awatar z aparatu</string>
     <string name="set_status">Ustaw status</string>
     <string name="set_status_message">Ustaw komunikat statusu</string>
@@ -478,6 +482,7 @@
     <string name="this_is_a_test_message">To jest wiadomość testowa</string>
     <string name="title_attachments">Załączniki</string>
     <string name="today">Dzisiaj</string>
+    <string name="tomorrow">Jutro</string>
     <string name="translate">Tłumaczenie</string>
     <string name="translation">Tłumaczenie</string>
     <string name="translation_copy_translated_text">Kopiuj przetłumaczony tekst</string>

+ 7 - 0
app/src/main/res/values-pt-rBR/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Fone de ouvido</string>
     <string name="avatar">Avatar</string>
     <string name="away">Ausente</string>
+    <string name="calendar">Calendário</string>
     <string name="call_more_actions_dialog_headline">Opções avançadas de chamada</string>
     <string name="call_running_since_one_hour">A chamada está em execução há uma hora.</string>
     <string name="call_without_notification">Ligue sem notificação</string>
@@ -19,6 +20,7 @@
     <string name="close">Fechar</string>
     <string name="continuous_voice_message_recording">Gravação de bloqueio para gravação contínua da mensagem de voz</string>
     <string name="conversations">Conversas</string>
+    <string name="custom">Personalizar</string>
     <string name="danger_zone">Zona de perigo</string>
     <string name="delete_avatar">Excluir avatar</string>
     <string name="dnd">Não perturbe</string>
@@ -35,6 +37,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4 horas</string>
     <string name="invisible">Invisível</string>
+    <string name="later_today">Hoje mais tarde</string>
     <string name="load_more_results">Carregar mais resultados </string>
     <string name="lock_symbol">Símbolo de cadeado</string>
     <string name="lower_hand">Baixar a mão</string>
@@ -403,6 +406,7 @@
     <string name="nc_wrong_link">O link de conversação não é válido</string>
     <string name="nc_wrong_password">Senha incorreta</string>
     <string name="nc_yes">Sim</string>
+    <string name="next_week">Próxima semana</string>
     <string name="no_phone_book_integration_due_to_permissions">Sem integração de número de telefone devido à falta de permissões</string>
     <string name="oneHour">1 hora</string>
     <string name="online">Online</string>
@@ -456,6 +460,7 @@
     <string name="send_to_forbidden">Você não tem permissão para compartilhar conteúdo neste bate-papo</string>
     <string name="send_to_three_dots">Enviar para …</string>
     <string name="send_without_notification">Enviar sem notificação</string>
+    <string name="set">Definir</string>
     <string name="set_avatar_from_camera">Definir avatar da câmera</string>
     <string name="set_status">Definir status</string>
     <string name="set_status_message">Definir mensagem de status</string>
@@ -484,8 +489,10 @@
     <string name="thirtyMinutes">30 minutos</string>
     <string name="thisWeek">Esta semana</string>
     <string name="this_is_a_test_message">Esta é uma mensagem de teste</string>
+    <string name="this_weekend">Este fim de semana</string>
     <string name="title_attachments">Anexos</string>
     <string name="today">Hoje</string>
+    <string name="tomorrow">Amanhã</string>
     <string name="translate">Traduzir</string>
     <string name="translation">Tradução</string>
     <string name="translation_copy_translated_text">Copiar texto traduzido</string>

+ 7 - 0
app/src/main/res/values-ru/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Проводная гарнитура</string>
     <string name="avatar">Аватар</string>
     <string name="away">Отошёл</string>
+    <string name="calendar">Календарь</string>
     <string name="call_more_actions_dialog_headline">Дополнительные настройки звонка</string>
     <string name="call_running_since_one_hour">Звонок длится уже час</string>
     <string name="call_without_notification">Звонок без уведомления</string>
@@ -18,6 +19,7 @@
     <string name="clear_status_message_after">Очищать статус после</string>
     <string name="close">Закрыть</string>
     <string name="conversations">Разговоры</string>
+    <string name="custom">Задать</string>
     <string name="delete_avatar">Удалить аватар</string>
     <string name="dnd">Не беспокоить</string>
     <string name="dontClear">Не очищать</string>
@@ -33,6 +35,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4 часа</string>
     <string name="invisible">Невидимый</string>
+    <string name="later_today">Позже сегодня</string>
     <string name="load_more_results">Показать больше результатов</string>
     <string name="lock_symbol">Символ блокировки</string>
     <string name="lower_hand">Опустить руку</string>
@@ -385,6 +388,7 @@
     <string name="nc_wrong_link">Ссылка на беседу более не действительна</string>
     <string name="nc_wrong_password">Неправильный пароль</string>
     <string name="nc_yes">Да</string>
+    <string name="next_week">Следующая неделя</string>
     <string name="no_phone_book_integration_due_to_permissions">Отсутствуют разрешения на интеграцию номера телефона</string>
     <string name="oneHour">1 час</string>
     <string name="online">В сети</string>
@@ -438,6 +442,7 @@
     <string name="send_to_forbidden">Вам не разрешено делиться контентом в этом чате</string>
     <string name="send_to_three_dots">Отправить …</string>
     <string name="send_without_notification">Отправить без уведомления</string>
+    <string name="set">Указать</string>
     <string name="set_avatar_from_camera">Установить аватар со снимка камерой</string>
     <string name="set_status">Установить статус</string>
     <string name="set_status_message">Установить статус</string>
@@ -465,8 +470,10 @@
     <string name="take_photo_toggle_torch">Переключатель фонарика</string>
     <string name="thirtyMinutes">30 минут</string>
     <string name="thisWeek">Эта неделя</string>
+    <string name="this_weekend">Эта неделя</string>
     <string name="title_attachments">Вложения</string>
     <string name="today">Сегодня</string>
+    <string name="tomorrow">Завтра</string>
     <string name="translate">Помочь с переводом</string>
     <string name="translation">Перевод</string>
     <string name="translation_copy_translated_text">Копировать переведенный текст</string>

+ 4 - 0
app/src/main/res/values-sc/strings.xml

@@ -6,11 +6,13 @@
     <string name="audio_output_speaker">Altoparlante</string>
     <string name="avatar">Avatar</string>
     <string name="away">Ausente</string>
+    <string name="calendar">Calendàriu</string>
     <string name="choose_avatar_from_cloud">Sèbera s\'avatar dae sa nue virtuale</string>
     <string name="clear_status_message">Lìmpia su messàgiu de istadu</string>
     <string name="clear_status_message_after">Lìmpia su messàgiu de istadu a pustis</string>
     <string name="close">Serra</string>
     <string name="conversations">Cunversatziones</string>
+    <string name="custom">Personaliza</string>
     <string name="delete_avatar">Cantzella s\'avatar</string>
     <string name="dnd">No istorbes</string>
     <string name="edit">Modìfica</string>
@@ -314,6 +316,7 @@
     <string name="nc_wrong_link">Ligòngiu de tzarrada non vàlidu</string>
     <string name="nc_wrong_password">Crae isballiada</string>
     <string name="nc_yes">Eja</string>
+    <string name="next_week">Sa chida chi benit</string>
     <string name="no_phone_book_integration_due_to_permissions">Peruna integratzione de nùmeru de telèfonu pro farta de permissos</string>
     <string name="oneHour">1 ora</string>
     <string name="online">In lìnia</string>
@@ -362,6 +365,7 @@
     <string name="thisWeek">Custa chida</string>
     <string name="title_attachments">Alligongiados</string>
     <string name="today">Oe</string>
+    <string name="tomorrow">Cras</string>
     <string name="translate">Borta</string>
     <string name="translation_device_settings">Impostatziones de su dispositivu</string>
     <string name="translation_from">Dae</string>

+ 6 - 0
app/src/main/res/values-sk-rSK/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Drátové sluchátka</string>
     <string name="avatar">Avatar</string>
     <string name="away">Preč</string>
+    <string name="calendar">Kalendár</string>
     <string name="call_without_notification">Volať bez upozornenia</string>
     <string name="camera_permission_granted">Povolenie fotoaparátu bolo udelené. Vyberte fotoaparát znova.</string>
     <string name="choose_avatar_from_cloud">Vyberte si avatara z cloudu</string>
@@ -16,6 +17,7 @@
     <string name="clear_status_message_after">Vyčistiť správu o stave po</string>
     <string name="close">Zatvoriť</string>
     <string name="conversations">Konverzácie</string>
+    <string name="custom">Vlastný</string>
     <string name="delete_avatar">Zmazať avatara</string>
     <string name="dnd">Nerušiť</string>
     <string name="dontClear">Nemazať</string>
@@ -233,6 +235,7 @@
     <string name="nc_push_disabled">Push notifikácie vypnuté</string>
     <string name="nc_push_to_talk">Stlač a hovor PTT</string>
     <string name="nc_push_to_talk_desc">S vypnutým mikrofónom, kliknite &amp;podržte pre použitie funkcie Stlač a hovor PTT</string>
+    <string name="nc_remind">Pripomenúť neskôr</string>
     <string name="nc_remote_audio_off">Vypnúť vzdialené audio</string>
     <string name="nc_remove_circle_and_members">Vymazať kruh a členov</string>
     <string name="nc_remove_from_favorites">Odstrániť z obľúbených</string>
@@ -369,6 +372,7 @@
     <string name="nc_wrong_link">Odkaz na rozhovor nie je platný!</string>
     <string name="nc_wrong_password">Nesprávne heslo</string>
     <string name="nc_yes">Áno</string>
+    <string name="next_week">Nasledujúci týždeň</string>
     <string name="no_phone_book_integration_due_to_permissions">Registrácia telefónneho čísla nie je povolená pre nedostatok práv</string>
     <string name="oneHour">1 hodina</string>
     <string name="online">Pripojený</string>
@@ -413,6 +417,7 @@
     <string name="send_to_forbidden">Nemáte oprávnenie zdieľať obsah tohto rozhovoru</string>
     <string name="send_to_three_dots">Odoslať do …</string>
     <string name="send_without_notification">Poslať bez upozornenia</string>
+    <string name="set">Nastaviť</string>
     <string name="set_avatar_from_camera">Nastaviť avatara z fotoaparátu</string>
     <string name="set_status">Nastaviť stav</string>
     <string name="set_status_message">Nastaviť správu o stave</string>
@@ -439,6 +444,7 @@
     <string name="thisWeek">Tento týždeň</string>
     <string name="title_attachments">Prílohy</string>
     <string name="today">Dnes</string>
+    <string name="tomorrow">Zajtra</string>
     <string name="translate">Preložiť</string>
     <string name="translation_device_settings">Nastavenia zariadenia</string>
     <string name="translation_from">Od</string>

+ 6 - 0
app/src/main/res/values-sl/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Ožičene slušalke</string>
     <string name="avatar">Podoba</string>
     <string name="away">Ne spremljam</string>
+    <string name="calendar">Koledar</string>
     <string name="call_more_actions_dialog_headline">Napredne možnosti klica</string>
     <string name="call_without_notification">Klic brez obvestila</string>
     <string name="camera_permission_granted">Dovoljenje za uporabo kamere je dodeljeno. Ponovno izberite kamero.</string>
@@ -17,6 +18,7 @@
     <string name="clear_status_message_after">Počisti sporočilo stanja po</string>
     <string name="close">Zapri</string>
     <string name="conversations">Pogovori</string>
+    <string name="custom">Po meri</string>
     <string name="delete_avatar">Izbriši podobo</string>
     <string name="dnd">Ne moti</string>
     <string name="dontClear">Ne počisti</string>
@@ -245,6 +247,7 @@
     <string name="nc_push_disabled">Potisno obveščanje je onemogočeno</string>
     <string name="nc_push_to_talk">Možnost »push-to-talk«</string>
     <string name="nc_push_to_talk_desc">Pri onemogočenem mikrofonu lahko za začetek govora kliknete in zadržite gumb</string>
+    <string name="nc_remind">Opomni me kasneje</string>
     <string name="nc_remote_audio_off">Oddaljen zvok je onemogočen</string>
     <string name="nc_remove_circle_and_members">Odstrani krog in člane</string>
     <string name="nc_remove_from_favorites">Odstrani iz priljubljenih</string>
@@ -381,6 +384,7 @@
     <string name="nc_wrong_link">Povezava do pogovora ni veljavna</string>
     <string name="nc_wrong_password">Napačno geslo</string>
     <string name="nc_yes">Da</string>
+    <string name="next_week">Naslednji teden</string>
     <string name="no_phone_book_integration_due_to_permissions">Povezava s telefonskim imenikom ni na voljo zaradi neustreznih dovoljenj.</string>
     <string name="oneHour">1 uri</string>
     <string name="online">Trenutno na spletu</string>
@@ -432,6 +436,7 @@
     <string name="send_to_forbidden">Ni ustreznih dovoljenj za objavljanje vsebine v ta klepet</string>
     <string name="send_to_three_dots">Pošlji …</string>
     <string name="send_without_notification">Pošlji brez obvestila</string>
+    <string name="set">Nastavi</string>
     <string name="set_avatar_from_camera">Nastavi sličico s kamero</string>
     <string name="set_status">Nastavi stanje</string>
     <string name="set_status_message">Nastavi sporočilo stanja</string>
@@ -461,6 +466,7 @@
     <string name="thisWeek">Ta teden</string>
     <string name="title_attachments">Priloge</string>
     <string name="today">Danes</string>
+    <string name="tomorrow">Jutri</string>
     <string name="translate">Prevodi</string>
     <string name="translation">Prevod</string>
     <string name="translation_copy_translated_text">Kopiraj prevedeno besedilo</string>

+ 8 - 0
app/src/main/res/values-sr/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Жичане слушалице са микрофоном</string>
     <string name="avatar">Аватар</string>
     <string name="away">Одсутан</string>
+    <string name="calendar">Календар</string>
     <string name="call_more_actions_dialog_headline">Напредне опције позива</string>
     <string name="call_running_since_one_hour">Позив траје један сат.</string>
     <string name="call_without_notification">Позив без обавештења</string>
@@ -19,6 +20,7 @@
     <string name="close">Затвори</string>
     <string name="continuous_voice_message_recording">Закључајте снимање да би се гласовна порука непрестано снимала.</string>
     <string name="conversations">Разговори</string>
+    <string name="custom">Прилагођено</string>
     <string name="danger_zone">Зона опасности</string>
     <string name="delete_avatar">Обриши аватар</string>
     <string name="dnd">Не узнемиравај</string>
@@ -35,6 +37,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4 сата</string>
     <string name="invisible">Невидљива</string>
+    <string name="later_today">Касније данас</string>
     <string name="load_more_results">Учитај још резултата</string>
     <string name="lock_symbol">Симбол катанца</string>
     <string name="lower_hand">Спуштена рука</string>
@@ -264,6 +267,7 @@
     <string name="nc_push_disabled">Брза обавештења су искључена</string>
     <string name="nc_push_to_talk">Притисни за разговор</string>
     <string name="nc_push_to_talk_desc">Са онемогућеним микрофоном, кликните &amp; држите да користите притисак за разговор</string>
+    <string name="nc_remind">Подсети ме касније</string>
     <string name="nc_remote_audio_off">Удаљени аудио је искључен</string>
     <string name="nc_remove_circle_and_members">Уклони круг и чланове</string>
     <string name="nc_remove_from_favorites">Уклони из омиљених</string>
@@ -403,6 +407,7 @@
     <string name="nc_wrong_link">Веза разговора није исправна</string>
     <string name="nc_wrong_password">Погрешна лозинка</string>
     <string name="nc_yes">Да</string>
+    <string name="next_week">Наредне недеље</string>
     <string name="no_phone_book_integration_due_to_permissions">Нема интеграције броја телефона јер недостају дозволе</string>
     <string name="oneHour">1 сат</string>
     <string name="online">На мрежи</string>
@@ -456,6 +461,7 @@
     <string name="send_to_forbidden">Није вам дозвољено да делите садржај у овај чет</string>
     <string name="send_to_three_dots">Пошаљи у ...</string>
     <string name="send_without_notification">Пошаљи без обавештења</string>
+    <string name="set">Постави</string>
     <string name="set_avatar_from_camera">Постави аватар са камере</string>
     <string name="set_status">Постави статус</string>
     <string name="set_status_message">Постави статусну поруку</string>
@@ -484,8 +490,10 @@
     <string name="thirtyMinutes">30 минута</string>
     <string name="thisWeek">Ове недеље</string>
     <string name="this_is_a_test_message">Ово је тест порука</string>
+    <string name="this_weekend">Овог викенда</string>
     <string name="title_attachments">Прилози</string>
     <string name="today">Данас</string>
+    <string name="tomorrow">Сутра</string>
     <string name="translate">Превођење</string>
     <string name="translation">Превод</string>
     <string name="translation_copy_translated_text">Копирај преведени текст</string>

+ 8 - 0
app/src/main/res/values-sv/strings.xml

@@ -8,11 +8,13 @@
     <string name="audio_output_wired_headset">Sladdansluten hörlur</string>
     <string name="avatar">Avatar</string>
     <string name="away">Iväg</string>
+    <string name="calendar">Kalender</string>
     <string name="choose_avatar_from_cloud">Välj avatar från moln</string>
     <string name="clear_status_message">Rensa statusmeddelande</string>
     <string name="clear_status_message_after">Rensa statusmeddelande efter</string>
     <string name="close">Stäng</string>
     <string name="conversations">Konversationer</string>
+    <string name="custom">Anpassad</string>
     <string name="delete_avatar">Ta bort avatar</string>
     <string name="dnd">Stör ej</string>
     <string name="dontClear">Rensa inte</string>
@@ -27,6 +29,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4 timmar</string>
     <string name="invisible">Osynlig</string>
+    <string name="later_today">Senare idag</string>
     <string name="load_more_results">Visa fler resultat</string>
     <string name="lock_symbol">Låssymbol</string>
     <string name="menu_item_sort_by_date_newest_first">Nyast först</string>
@@ -177,6 +180,7 @@
     <string name="nc_push_disabled">Push-aviseringar inaktiverade</string>
     <string name="nc_push_to_talk">Push-to-talk</string>
     <string name="nc_push_to_talk_desc">Med mikrofon inaktiverad klickar du på &amp;vänta för att använda Push-to-talk</string>
+    <string name="nc_remind">Påminn mig senare</string>
     <string name="nc_remove_from_favorites">Ta bort från favoriter</string>
     <string name="nc_remove_participant">Ta bort deltagare</string>
     <string name="nc_rename">Byt namn på konversation</string>
@@ -281,6 +285,7 @@
     <string name="nc_wrong_link">Konversationslänk är inte giltig</string>
     <string name="nc_wrong_password">Fel lösenord</string>
     <string name="nc_yes">Ja</string>
+    <string name="next_week">Nästa vecka</string>
     <string name="oneHour">1 timme</string>
     <string name="online">Online</string>
     <string name="online_status">Online-status</string>
@@ -303,6 +308,7 @@
     <string name="scope_toggle_description">Ändra hemlighetsnivå för %1$s</string>
     <string name="secondsAgo">sekunder sedan</string>
     <string name="selected_list_item">Vald</string>
+    <string name="set">Sätt</string>
     <string name="set_status">Sätt status</string>
     <string name="set_status_message">Sätt statusmeddelande</string>
     <string name="share">Dela</string>
@@ -319,8 +325,10 @@
     <string name="take_photo_toggle_torch">Starta lampa</string>
     <string name="thirtyMinutes">30 minuter</string>
     <string name="thisWeek">Denna vecka</string>
+    <string name="this_weekend">Denna helgen</string>
     <string name="title_attachments">Bilagor</string>
     <string name="today">Idag</string>
+    <string name="tomorrow">I morgon</string>
     <string name="translate">Översätt</string>
     <string name="translation_detect_language">Upptäck språk</string>
     <string name="translation_device_settings">Enhetsinställningar</string>

+ 8 - 0
app/src/main/res/values-tr/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Kablolu kulaklık</string>
     <string name="avatar">Avatar</string>
     <string name="away">Uzakta</string>
+    <string name="calendar">Takvim</string>
     <string name="call_more_actions_dialog_headline">Gelişmiş çağrı seçenekleri</string>
     <string name="call_running_since_one_hour">Çağrı bir saattir sürüyor.</string>
     <string name="call_without_notification">Bildirim olmadan çağrı</string>
@@ -19,6 +20,7 @@
     <string name="close">Kapat</string>
     <string name="continuous_voice_message_recording">Sesli iletinin sürekli olarak kaydedilmesi için kaydı kilitleyin</string>
     <string name="conversations">Görüşmeler</string>
+    <string name="custom">Özel</string>
     <string name="danger_zone">Tehlikeli bölge</string>
     <string name="delete_avatar">Avatarı sil</string>
     <string name="dnd">Rahatsız etmeyin</string>
@@ -35,6 +37,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4 saat</string>
     <string name="invisible">Görünmez</string>
+    <string name="later_today">Bugün daha sonra</string>
     <string name="load_more_results">Diğer sonuçları yükle</string>
     <string name="lock_symbol">Kilit simgesi</string>
     <string name="lower_hand">Eli indir</string>
@@ -264,6 +267,7 @@
     <string name="nc_push_disabled">Anında bildirimler devre dışı</string>
     <string name="nc_push_to_talk">Bas-konuş</string>
     <string name="nc_push_to_talk_desc">Mikrofon devre dışı iken, Bas-konuş üzerine tıklayıp basılı tutun</string>
+    <string name="nc_remind">Sonra hatırlat</string>
     <string name="nc_remote_audio_off">Uzak ses kapalı</string>
     <string name="nc_remove_circle_and_members">Çevreyi ve üyelerini sil</string>
     <string name="nc_remove_from_favorites">Sık kullanılanlardan kaldır</string>
@@ -403,6 +407,7 @@
     <string name="nc_wrong_link">Görüşme bağlantısı geçersiz</string>
     <string name="nc_wrong_password">Parola yanlış</string>
     <string name="nc_yes">Evet</string>
+    <string name="next_week">Sonraki hafta</string>
     <string name="no_phone_book_integration_due_to_permissions">İzinler eksik olduğundan telefon numarası bütünleştirmesi yok</string>
     <string name="oneHour">1 saat</string>
     <string name="online">Çevrim içi</string>
@@ -456,6 +461,7 @@
     <string name="send_to_forbidden">Bu sohbette içerik paylaşma izniniz yok</string>
     <string name="send_to_three_dots">Şuraya gönder …</string>
     <string name="send_without_notification">Bildirim olmadan gönder</string>
+    <string name="set">Ayarla</string>
     <string name="set_avatar_from_camera">Avatarı kamerayla ayarla</string>
     <string name="set_status">Durumu ayarla</string>
     <string name="set_status_message">Durum iletisini ayarla</string>
@@ -484,8 +490,10 @@
     <string name="thirtyMinutes">30 dakika</string>
     <string name="thisWeek">Bu hafta</string>
     <string name="this_is_a_test_message">Bu bir deneme iletisidir</string>
+    <string name="this_weekend">Bu hafta sonu</string>
     <string name="title_attachments">Ek dosyalar</string>
     <string name="today">Bugün</string>
+    <string name="tomorrow">Yarın</string>
     <string name="translate">Çevir</string>
     <string name="translation">Çeviri</string>
     <string name="translation_copy_translated_text">Çevrilmiş metni kopyala</string>

+ 6 - 0
app/src/main/res/values-uk/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">Дротова гарнітура</string>
     <string name="avatar">Світлина</string>
     <string name="away">Немає поряд</string>
+    <string name="calendar">Календар</string>
     <string name="call_more_actions_dialog_headline">Розширені опції дзвінка</string>
     <string name="call_without_notification">Дзвінок без сповіщення</string>
     <string name="camera_permission_granted">Дозвіл на використання камери надано. Будь ласка, виберіть камеру ще раз.</string>
@@ -17,6 +18,7 @@
     <string name="clear_status_message_after">Очистити повідомлення про стан після</string>
     <string name="close">Закрити</string>
     <string name="conversations">Розмови</string>
+    <string name="custom">Власне</string>
     <string name="delete_avatar">Вилучити світлину</string>
     <string name="dnd">Не турбувати</string>
     <string name="dontClear">Не очищати</string>
@@ -244,6 +246,7 @@
     <string name="nc_push_disabled">Push сповіщення вимкнено</string>
     <string name="nc_push_to_talk">Тисни-та-кажи</string>
     <string name="nc_push_to_talk_desc">Натисніть і утримуйте &amp; для використання PTT при вимкненому мікрофоні</string>
+    <string name="nc_remind">Нагадати пізніше</string>
     <string name="nc_remote_audio_off">Віддалене аудіо відключено</string>
     <string name="nc_remove_circle_and_members">Вилучити кола та учасників</string>
     <string name="nc_remove_from_favorites">Вилучено з улюбленого</string>
@@ -376,6 +379,7 @@
     <string name="nc_wrong_link">Посилання на бесіду більше не дійсне</string>
     <string name="nc_wrong_password">Неправильний пароль</string>
     <string name="nc_yes">Так</string>
+    <string name="next_week">Наступний тиждень</string>
     <string name="no_phone_book_integration_due_to_permissions">Відсутні дозволи на інтеграцію номера телефону</string>
     <string name="oneHour">1 година</string>
     <string name="online">Онлайн</string>
@@ -415,6 +419,7 @@
     <string name="scope_published_title">Опубліковано</string>
     <string name="secondsAgo">секунд тому</string>
     <string name="selected_list_item">Selected</string>
+    <string name="set">Встановити</string>
     <string name="set_status">Встановити статус</string>
     <string name="set_status_message">Встановити повідомлення про стан</string>
     <string name="share">Спільний доступ</string>
@@ -431,6 +436,7 @@
     <string name="thisWeek">Цього тижня</string>
     <string name="title_attachments">Вкладення</string>
     <string name="today">Сьогодні</string>
+    <string name="tomorrow">Завтра</string>
     <string name="translate">Перекласти</string>
     <string name="translation_detect_language">Визначити мову</string>
     <string name="translation_device_settings">Налаштування пристрою</string>

+ 5 - 0
app/src/main/res/values-vi/strings.xml

@@ -5,11 +5,13 @@
     <string name="audio_output_phone">Điện thoại</string>
     <string name="avatar">Hình đại diện</string>
     <string name="away">Tạm vắng</string>
+    <string name="calendar">Lịch</string>
     <string name="choose_avatar_from_cloud">Chọn hình đại diện từ đám mây</string>
     <string name="clear_status_message">Xoá thông báo trạng thái</string>
     <string name="clear_status_message_after">Xoá thông báo trạng thái sau</string>
     <string name="close">Đóng</string>
     <string name="conversations">Đàm thoại</string>
+    <string name="custom">Tùy chỉnh</string>
     <string name="delete_avatar">Xóa hình đại diện</string>
     <string name="dnd">Đừng làm phiền</string>
     <string name="dontClear">Không xoá</string>
@@ -214,6 +216,7 @@
     <string name="nc_wrong_link">Liên kết đàm thoại này không có thực</string>
     <string name="nc_wrong_password">Sai mật khẩu</string>
     <string name="nc_yes">Có</string>
+    <string name="next_week">Tuần sau</string>
     <string name="oneHour">1 tiếng</string>
     <string name="online">Trực tuyến</string>
     <string name="online_status">Trạng thái trực tuyến</string>
@@ -234,6 +237,7 @@
     <string name="scroll_to_bottom">Cuộn xuống dưới cùng</string>
     <string name="secondsAgo">vài giây trước</string>
     <string name="selected_list_item">Selected</string>
+    <string name="set">Đặt</string>
     <string name="set_status">Đặt trạng thái</string>
     <string name="set_status_message">Đặt thông báo trạng thái</string>
     <string name="share">Chia sẻ</string>
@@ -252,6 +256,7 @@
     <string name="thisWeek">Tuần này</string>
     <string name="title_attachments">Đính kèm</string>
     <string name="today">Hôm nay</string>
+    <string name="tomorrow">Ngày mai</string>
     <string name="translate">Dịch</string>
     <string name="translation_device_settings">Cài đặt thiết bị</string>
     <string name="translation_error_message">Không thể phát hiện ngôn ngữ</string>

+ 6 - 0
app/src/main/res/values-zh-rCN/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">有线耳机</string>
     <string name="avatar">头像</string>
     <string name="away">离开</string>
+    <string name="calendar">日历</string>
     <string name="call_more_actions_dialog_headline">高级呼叫选项</string>
     <string name="call_without_notification">无通知呼叫</string>
     <string name="camera_permission_granted">摄像头访问已授权。请重新选择摄像头。</string>
@@ -17,6 +18,7 @@
     <string name="clear_status_message_after">过多长时间清除状态消息</string>
     <string name="close">关闭</string>
     <string name="conversations">对话</string>
+    <string name="custom">自定义</string>
     <string name="danger_zone">危险区域</string>
     <string name="delete_avatar">删除头像</string>
     <string name="dnd">不要打扰</string>
@@ -255,6 +257,7 @@
     <string name="nc_push_disabled">通知推送已禁用</string>
     <string name="nc_push_to_talk">按键讲话</string>
     <string name="nc_push_to_talk_desc">禁用麦克风的情况下,点击&amp;并按住使用“按键讲话”功能</string>
+    <string name="nc_remind">以后提醒我 </string>
     <string name="nc_remote_audio_off">远程音频关闭</string>
     <string name="nc_remove_circle_and_members">删除圈子和成员</string>
     <string name="nc_remove_from_favorites">取消收藏</string>
@@ -394,6 +397,7 @@
     <string name="nc_wrong_link">对话链接无效</string>
     <string name="nc_wrong_password">错误的密码</string>
     <string name="nc_yes">是的</string>
+    <string name="next_week">下周</string>
     <string name="no_phone_book_integration_due_to_permissions">由于缺少权限,没有电话集成 </string>
     <string name="oneHour">1小时</string>
     <string name="online">在线</string>
@@ -447,6 +451,7 @@
     <string name="send_to_forbidden">你不能在此聊天中分享内容</string>
     <string name="send_to_three_dots">发送到 …</string>
     <string name="send_without_notification">发送而不通知</string>
+    <string name="set">设置</string>
     <string name="set_avatar_from_camera">从摄像头设置头像</string>
     <string name="set_status">设定状态</string>
     <string name="set_status_message">设置状态消息</string>
@@ -477,6 +482,7 @@
     <string name="this_is_a_test_message">这是一个测试消息</string>
     <string name="title_attachments">附件</string>
     <string name="today">今天</string>
+    <string name="tomorrow">明天</string>
     <string name="translate">翻译</string>
     <string name="translation">翻译</string>
     <string name="translation_copy_translated_text">复制已翻译的文字</string>

+ 8 - 0
app/src/main/res/values-zh-rHK/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">有線耳機</string>
     <string name="avatar">虛擬化身大頭照</string>
     <string name="away">不在</string>
+    <string name="calendar">日曆</string>
     <string name="call_more_actions_dialog_headline">進階通話選項</string>
     <string name="call_running_since_one_hour">請注意,通話已經持續一個小時了。</string>
     <string name="call_without_notification">通話而不通知</string>
@@ -19,6 +20,7 @@
     <string name="close">關閉</string>
     <string name="continuous_voice_message_recording">鎖定錄音以連續錄製語音訊息</string>
     <string name="conversations">對話</string>
+    <string name="custom">自訂</string>
     <string name="danger_zone">危險地帶</string>
     <string name="delete_avatar">刪除虛擬化身大頭照</string>
     <string name="dnd">請勿打擾</string>
@@ -35,6 +37,7 @@
     <string name="filename_progress">%1$s(%2$d)</string>
     <string name="fourHours">4 小時</string>
     <string name="invisible">隱藏</string>
+    <string name="later_today">今日稍後</string>
     <string name="load_more_results">正在載入更多結果</string>
     <string name="lock_symbol">鎖符號</string>
     <string name="lower_hand">放下手</string>
@@ -264,6 +267,7 @@
     <string name="nc_push_disabled">取消推送通知</string>
     <string name="nc_push_to_talk">一鍵通</string>
     <string name="nc_push_to_talk_desc">在停用米高風的情況下,單擊並按住即可使用一鍵通</string>
+    <string name="nc_remind">稍後提醒我</string>
     <string name="nc_remote_audio_off">遠端語音關閉</string>
     <string name="nc_remove_circle_and_members">移除社交圈子及組員</string>
     <string name="nc_remove_from_favorites">取消我的最愛</string>
@@ -403,6 +407,7 @@
     <string name="nc_wrong_link">對話連結無效</string>
     <string name="nc_wrong_password">密碼錯誤</string>
     <string name="nc_yes">是</string>
+    <string name="next_week">下星期</string>
     <string name="no_phone_book_integration_due_to_permissions">由於缺少權限而無法集成電話號碼</string>
     <string name="oneHour">1 小時</string>
     <string name="online">在線</string>
@@ -456,6 +461,7 @@
     <string name="send_to_forbidden">您不能在此聊天中分享內容</string>
     <string name="send_to_three_dots">傳送到 …</string>
     <string name="send_without_notification">傳送而不通知</string>
+    <string name="set">設置</string>
     <string name="set_avatar_from_camera">從相機設置虛擬化身大頭照</string>
     <string name="set_status">設定狀態</string>
     <string name="set_status_message">設定狀態訊息</string>
@@ -484,8 +490,10 @@
     <string name="thirtyMinutes">30 分鐘</string>
     <string name="thisWeek">本星期</string>
     <string name="this_is_a_test_message">此乃測試訊息</string>
+    <string name="this_weekend">本週末</string>
     <string name="title_attachments">附件</string>
     <string name="today">今日</string>
+    <string name="tomorrow">明日</string>
     <string name="translate">翻譯</string>
     <string name="translation">翻譯</string>
     <string name="translation_copy_translated_text">複製已翻譯的文字</string>

+ 8 - 0
app/src/main/res/values-zh-rTW/strings.xml

@@ -9,6 +9,7 @@
     <string name="audio_output_wired_headset">有線式頭戴耳機</string>
     <string name="avatar">頭像</string>
     <string name="away">外出</string>
+    <string name="calendar">日曆</string>
     <string name="call_more_actions_dialog_headline">進階通話選項</string>
     <string name="call_running_since_one_hour">通話已經持續一個小時了。</string>
     <string name="call_without_notification">通話而不通知</string>
@@ -19,6 +20,7 @@
     <string name="close">關閉</string>
     <string name="continuous_voice_message_recording">鎖定錄音以連續錄製語音訊息</string>
     <string name="conversations">對話</string>
+    <string name="custom">自訂</string>
     <string name="danger_zone">危險地帶</string>
     <string name="delete_avatar">刪除頭像</string>
     <string name="dnd">請勿打擾</string>
@@ -35,6 +37,7 @@
     <string name="filename_progress">%1$s (%2$d)</string>
     <string name="fourHours">4小時</string>
     <string name="invisible">隱藏</string>
+    <string name="later_today">今天稍後</string>
     <string name="load_more_results">載入更多結果</string>
     <string name="lock_symbol">上鎖符號</string>
     <string name="lower_hand">放手</string>
@@ -264,6 +267,7 @@
     <string name="nc_push_disabled">取消推送通知</string>
     <string name="nc_push_to_talk">按住以說話</string>
     <string name="nc_push_to_talk_desc">在停用麥克風的情況下,點擊並按住即可使用按住以說話</string>
+    <string name="nc_remind">稍後提醒我</string>
     <string name="nc_remote_audio_off">遠端音訊關閉</string>
     <string name="nc_remove_circle_and_members">移除小圈圈與成員</string>
     <string name="nc_remove_from_favorites">取消我的最愛</string>
@@ -403,6 +407,7 @@
     <string name="nc_wrong_link">對話連結無效</string>
     <string name="nc_wrong_password">密碼錯誤</string>
     <string name="nc_yes">是</string>
+    <string name="next_week">下週</string>
     <string name="no_phone_book_integration_due_to_permissions">因為缺少權限而無法整合電話號碼</string>
     <string name="oneHour">1小時</string>
     <string name="online">線上</string>
@@ -456,6 +461,7 @@
     <string name="send_to_forbidden">您不被允許在此聊天中分享內容</string>
     <string name="send_to_three_dots">傳送至……</string>
     <string name="send_without_notification">傳送而不通知</string>
+    <string name="set">設定</string>
     <string name="set_avatar_from_camera">從相機設定大頭照</string>
     <string name="set_status">設定狀態</string>
     <string name="set_status_message">設定狀態訊息</string>
@@ -484,8 +490,10 @@
     <string name="thirtyMinutes">30分鐘</string>
     <string name="thisWeek">這個禮拜</string>
     <string name="this_is_a_test_message">這是測試訊息</string>
+    <string name="this_weekend">本週末</string>
     <string name="title_attachments">附件</string>
     <string name="today">今天</string>
+    <string name="tomorrow">明天</string>
     <string name="translate">翻譯</string>
     <string name="translation">翻譯</string>
     <string name="translation_copy_translated_text">複製已翻譯的文字</string>

+ 9 - 0
app/src/main/res/values/strings.xml

@@ -376,6 +376,7 @@ How to translate with transifex:
     <string name="nc_add_attachment">Add attachment</string>
     <string name="emoji_category_recent">Recent</string>
     <string name="emoji_backspace">Backspace</string>
+    <string name="see_similar_system_messages">See %1$s similar messages</string>
 
     <!-- Conversation info guest access -->
     <string name="nc_guest_access">Guest access</string>
@@ -697,5 +698,13 @@ How to translate with transifex:
     <string name="nc_settings_socks_value" translatable="false">1080</string>
     <string name="this_is_a_test_message">This is a test message</string>
     <string name="continuous_voice_message_recording">Lock recording for continuously recording of the voice message</string>
+    <string name="nc_remind">Remind me later</string>
+    <string name="next_week">Next week</string>
+    <string name="this_weekend">This weekend</string>
+    <string name="tomorrow">Tomorrow</string>
+    <string name="later_today">Later today</string>
+    <string name="custom">Custom</string>
+    <string name="set">Set</string>
+    <string name="calendar">Calendar</string>
 
 </resources>