mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-01-17 11:28:06 +00:00
Allow to edit subject of group chat room
This commit is contained in:
parent
a27cf28544
commit
cf41bef449
10 changed files with 298 additions and 48 deletions
|
|
@ -35,9 +35,11 @@ import org.linphone.R
|
|||
import org.linphone.core.tools.Log
|
||||
import org.linphone.databinding.ChatInfoFragmentBinding
|
||||
import org.linphone.databinding.ChatParticipantAdminPopupMenuBinding
|
||||
import org.linphone.ui.main.chat.model.ConversationEditSubjectDialogModel
|
||||
import org.linphone.ui.main.chat.model.ParticipantModel
|
||||
import org.linphone.ui.main.chat.viewmodel.ConversationInfoViewModel
|
||||
import org.linphone.ui.main.fragment.GenericFragment
|
||||
import org.linphone.utils.DialogUtils
|
||||
|
||||
@UiThread
|
||||
class ConversationInfoFragment : GenericFragment() {
|
||||
|
|
@ -138,6 +140,36 @@ class ConversationInfoFragment : GenericFragment() {
|
|||
val action = ConversationInfoFragmentDirections.actionConversationInfoFragmentToAddParticipantsFragment()
|
||||
findNavController().navigate(action)
|
||||
}
|
||||
|
||||
binding.setEditSubjectClickListener {
|
||||
val currentSubject = viewModel.subject.value.orEmpty()
|
||||
val model = ConversationEditSubjectDialogModel(currentSubject)
|
||||
|
||||
val dialog = DialogUtils.getEditConversationSubjectDialog(
|
||||
requireContext(),
|
||||
model
|
||||
)
|
||||
|
||||
model.dismissEvent.observe(viewLifecycleOwner) {
|
||||
it.consume {
|
||||
Log.i("$TAG Conversation subject edit cancelled")
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
model.confirmEvent.observe(viewLifecycleOwner) {
|
||||
it.consume { newSubject ->
|
||||
Log.i(
|
||||
"$TAG Conversation subject edit confirmed, new subject is [$newSubject] (old was [$currentSubject])"
|
||||
)
|
||||
viewModel.updateSubject(newSubject)
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
Log.i("$TAG Showing dialog to edit conversation subject")
|
||||
dialog.show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun showParticipantAdminPopupMenu(view: View, participantModel: ParticipantModel) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2010-2023 Belledonne Communications SARL.
|
||||
*
|
||||
* This file is part of linphone-android
|
||||
* (see https://www.linphone.org).
|
||||
*
|
||||
* 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 org.linphone.ui.main.chat.model
|
||||
|
||||
import androidx.annotation.UiThread
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import org.linphone.utils.Event
|
||||
|
||||
class ConversationEditSubjectDialogModel @UiThread constructor(initialSubject: String) {
|
||||
val subject = MutableLiveData<String>()
|
||||
|
||||
val dismissEvent = MutableLiveData<Event<Boolean>>()
|
||||
|
||||
val confirmEvent = MutableLiveData<Event<String>>()
|
||||
|
||||
init {
|
||||
subject.value = initialSubject
|
||||
}
|
||||
|
||||
@UiThread
|
||||
fun dismiss() {
|
||||
dismissEvent.value = Event(true)
|
||||
}
|
||||
|
||||
@UiThread
|
||||
fun confirm() {
|
||||
confirmEvent.value = Event(subject.value.orEmpty())
|
||||
}
|
||||
}
|
||||
|
|
@ -288,6 +288,16 @@ class ConversationInfoViewModel @UiThread constructor() : ViewModel() {
|
|||
}
|
||||
}
|
||||
|
||||
@UiThread
|
||||
fun updateSubject(newSubject: String) {
|
||||
coreContext.postOnCoreThread {
|
||||
if (::chatRoom.isInitialized) {
|
||||
Log.i("$TAG Updating chat room subject to [$newSubject]")
|
||||
chatRoom.subject = newSubject
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
private fun configureChatRoom() {
|
||||
isMuted.postValue(chatRoom.muted)
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ import org.linphone.databinding.DialogConfirmZrtpSasBinding
|
|||
import org.linphone.databinding.DialogContactConfirmTrustCallBinding
|
||||
import org.linphone.databinding.DialogContactTrustProcessBinding
|
||||
import org.linphone.databinding.DialogDeleteContactBinding
|
||||
import org.linphone.databinding.DialogEditGroupConversationSubjectBinding
|
||||
import org.linphone.databinding.DialogManageAccountInternationalPrefixHelpBinding
|
||||
import org.linphone.databinding.DialogPickNumberOrAddressBinding
|
||||
import org.linphone.databinding.DialogRemoveAccountBinding
|
||||
|
|
@ -48,6 +49,7 @@ import org.linphone.databinding.DialogUpdateAvailableBinding
|
|||
import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel
|
||||
import org.linphone.ui.assistant.model.ConfirmPhoneNumberDialogModel
|
||||
import org.linphone.ui.call.model.ZrtpSasConfirmationDialogModel
|
||||
import org.linphone.ui.main.chat.model.ConversationEditSubjectDialogModel
|
||||
import org.linphone.ui.main.contacts.model.NumberOrAddressPickerDialogModel
|
||||
import org.linphone.ui.main.contacts.model.TrustCallDialogModel
|
||||
import org.linphone.ui.main.history.model.ConfirmationDialogModel
|
||||
|
|
@ -265,6 +267,22 @@ class DialogUtils {
|
|||
return getDialog(context, binding)
|
||||
}
|
||||
|
||||
@UiThread
|
||||
fun getEditConversationSubjectDialog(
|
||||
context: Context,
|
||||
viewModel: ConversationEditSubjectDialogModel
|
||||
): Dialog {
|
||||
val binding: DialogEditGroupConversationSubjectBinding = DataBindingUtil.inflate(
|
||||
LayoutInflater.from(context),
|
||||
R.layout.dialog_edit_group_conversation_subject,
|
||||
null,
|
||||
false
|
||||
)
|
||||
binding.viewModel = viewModel
|
||||
|
||||
return getDialog(context, binding)
|
||||
}
|
||||
|
||||
@UiThread
|
||||
fun getUpdateAvailableDialog(
|
||||
context: Context,
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
android:visibility="@{!model.isFromGroup ? View.GONE: model.isGroupedWithPreviousOne ? View.INVISIBLE : View.VISIBLE}"
|
||||
coilBubbleAvatar="@{model.avatarModel}"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
app:layout_constraintTop_toBottomOf="@id/name" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/presence_badge"
|
||||
|
|
@ -51,6 +51,20 @@
|
|||
app:layout_constraintEnd_toEndOf="@id/avatar"
|
||||
app:layout_constraintBottom_toBottomOf="@id/avatar"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/default_text_style_300"
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="12sp"
|
||||
android:text="@{model.avatarModel.name, default=`John Doe`}"
|
||||
android:textColor="@color/gray_main2_700"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:visibility="@{!model.isFromGroup ? View.GONE: model.isGroupedWithPreviousOne ? View.GONE : View.VISIBLE}"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="@id/background" />
|
||||
|
||||
<androidx.constraintlayout.widget.Barrier
|
||||
android:id="@+id/background_end_barrier"
|
||||
android:layout_width="wrap_content"
|
||||
|
|
@ -67,7 +81,7 @@
|
|||
android:src="@{model.isGroupedWithPreviousOne ? @drawable/shape_chat_bubble_incoming_full : @drawable/shape_chat_bubble_incoming_first, default=@drawable/shape_chat_bubble_incoming_first}"
|
||||
app:layout_constraintStart_toEndOf="@id/avatar"
|
||||
app:layout_constraintEnd_toEndOf="@id/background_end_barrier"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/avatar"
|
||||
app:layout_constraintBottom_toBottomOf="@id/date_time"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
|
|
@ -85,7 +99,7 @@
|
|||
android:gravity="center_vertical|start"
|
||||
app:layout_constrainedWidth="true"
|
||||
app:layout_constraintHorizontal_bias="0"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/avatar"
|
||||
app:layout_constraintStart_toEndOf="@id/avatar"
|
||||
app:layout_constraintEnd_toEndOf="parent"/>
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,9 @@
|
|||
<variable
|
||||
name="backClickListener"
|
||||
type="View.OnClickListener" />
|
||||
<variable
|
||||
name="editSubjectClickListener"
|
||||
type="View.OnClickListener" />
|
||||
<variable
|
||||
name="scheduleMeetingClickListener"
|
||||
type="View.OnClickListener" />
|
||||
|
|
@ -95,6 +98,7 @@
|
|||
|
||||
<ImageView
|
||||
android:id="@+id/edit_subject"
|
||||
android:onClick="@{editSubjectClickListener}"
|
||||
android:layout_width="@dimen/icon_size"
|
||||
android:layout_height="@dimen/icon_size"
|
||||
android:layout_marginStart="8dp"
|
||||
|
|
|
|||
|
|
@ -25,13 +25,67 @@
|
|||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/shape_round_popup_menu_background">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/default_text_style"
|
||||
android:id="@+id/set_admin"
|
||||
android:onClick="@{setAdminClickListener}"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:paddingStart="20dp"
|
||||
android:visibility="@{isParticipantAdmin ? View.GONE : View.VISIBLE}"
|
||||
android:text="@string/conversation_info_admin_menu_set_participant_admin"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/gray_main2_500"
|
||||
android:drawableStart="@drawable/user_circle"
|
||||
android:drawablePadding="5dp"
|
||||
app:drawableTint="@color/gray_main2_700"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/unset_admin"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/default_text_style"
|
||||
android:id="@+id/unset_admin"
|
||||
android:onClick="@{unsetAdminClickListener}"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:paddingStart="20dp"
|
||||
android:visibility="@{isParticipantAdmin ? View.VISIBLE : View.GONE, default=gone}"
|
||||
android:text="@string/conversation_info_admin_menu_unset_participant_admin"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/gray_main2_500"
|
||||
android:drawableStart="@drawable/user_circle"
|
||||
android:drawablePadding="5dp"
|
||||
app:drawableTint="@color/gray_main2_700"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/set_admin"
|
||||
app:layout_constraintBottom_toTopOf="@id/separator"/>
|
||||
|
||||
<View
|
||||
android:id="@+id/separator"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginStart="20dp"
|
||||
android:layout_marginEnd="20dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:background="@color/gray_main2_400"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/unset_admin"
|
||||
app:layout_constraintBottom_toTopOf="@id/remove_participant" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/default_text_style"
|
||||
android:id="@+id/remove_participant"
|
||||
android:onClick="@{removeParticipantClickListener}"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:paddingStart="20dp"
|
||||
android:text="@string/conversation_info_admin_menu_remove_participant"
|
||||
|
|
@ -41,49 +95,7 @@
|
|||
android:drawablePadding="5dp"
|
||||
app:drawableTint="@color/red_danger_500"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintBottom_toTopOf="@id/set_admin"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/default_text_style"
|
||||
android:id="@+id/set_admin"
|
||||
android:onClick="@{setAdminClickListener}"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:paddingStart="20dp"
|
||||
android:visibility="@{isParticipantAdmin ? View.GONE : View.VISIBLE}"
|
||||
android:text="@string/conversation_info_admin_menu_set_participant_admin"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/gray_main2_500"
|
||||
android:drawableStart="@drawable/trash_simple"
|
||||
android:drawablePadding="5dp"
|
||||
app:drawableTint="@color/gray_main2_700"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/remove_participant"
|
||||
app:layout_constraintBottom_toTopOf="@id/unset_admin"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/default_text_style"
|
||||
android:id="@+id/unset_admin"
|
||||
android:onClick="@{unsetAdminClickListener}"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginBottom="20dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:paddingStart="20dp"
|
||||
android:visibility="@{isParticipantAdmin ? View.VISIBLE : View.GONE, default=gone}"
|
||||
android:text="@string/conversation_info_admin_menu_unset_participant_admin"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/gray_main2_500"
|
||||
android:drawableStart="@drawable/trash_simple"
|
||||
android:drawablePadding="5dp"
|
||||
app:drawableTint="@color/gray_main2_700"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/set_admin"
|
||||
app:layout_constraintTop_toBottomOf="@id/separator"
|
||||
app:layout_constraintBottom_toBottomOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,112 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<data>
|
||||
<import type="android.view.View" />
|
||||
<import type="android.graphics.Typeface" />
|
||||
<variable
|
||||
name="viewModel"
|
||||
type="org.linphone.ui.main.chat.model.ConversationEditSubjectDialogModel" />
|
||||
</data>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:onClick="@{() -> viewModel.dismiss()}"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/dialog_background"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:src="@drawable/shape_dialog_background"
|
||||
app:layout_constraintWidth_max="@dimen/dialog_max_width"
|
||||
app:layout_constraintBottom_toBottomOf="@id/anchor"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/title" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
style="@style/section_header_style"
|
||||
android:id="@+id/title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="15dp"
|
||||
android:paddingTop="@dimen/dialog_top_bottom_margin"
|
||||
android:text="@string/dialog_group_conversation_edit_subject"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
app:layout_constraintBottom_toTopOf="@id/subject"
|
||||
app:layout_constraintStart_toStartOf="@id/dialog_background"
|
||||
app:layout_constraintEnd_toEndOf="@id/dialog_background"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatEditText
|
||||
style="@style/default_text_style"
|
||||
android:id="@+id/subject"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:paddingStart="20dp"
|
||||
android:paddingEnd="20dp"
|
||||
android:text="@={viewModel.subject, default=`Lorem Ipsum`}"
|
||||
android:textSize="14sp"
|
||||
android:textColor="@color/gray_main2_600"
|
||||
android:maxLines="1"
|
||||
android:background="@drawable/edit_text_background"
|
||||
android:inputType="text|textCapSentences"
|
||||
app:layout_constraintHorizontal_bias="0"
|
||||
app:layout_constraintWidth_max="@dimen/text_input_max_width"
|
||||
app:layout_constraintBottom_toTopOf="@id/cancel"
|
||||
app:layout_constraintStart_toStartOf="@id/dialog_background"
|
||||
app:layout_constraintEnd_toEndOf="@id/dialog_background"
|
||||
app:layout_constraintTop_toBottomOf="@id/title"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:onClick="@{() -> viewModel.dismiss()}"
|
||||
style="@style/secondary_button_label_style"
|
||||
android:id="@+id/cancel"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="32dp"
|
||||
android:layout_marginStart="15dp"
|
||||
android:layout_marginEnd="15dp"
|
||||
android:text="@string/dialog_cancel"
|
||||
app:layout_constraintStart_toStartOf="@id/dialog_background"
|
||||
app:layout_constraintEnd_toEndOf="@id/dialog_background"
|
||||
app:layout_constraintTop_toBottomOf="@id/subject"
|
||||
app:layout_constraintBottom_toTopOf="@id/confirm"/>
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:onClick="@{() -> viewModel.confirm()}"
|
||||
style="@style/primary_button_label_style"
|
||||
android:id="@+id/confirm"
|
||||
android:enabled="@{viewModel.subject.length() > 0}"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginStart="15dp"
|
||||
android:layout_marginEnd="15dp"
|
||||
android:text="@string/dialog_group_conversation_edit_subject_confirm_button"
|
||||
app:layout_constraintStart_toStartOf="@id/dialog_background"
|
||||
app:layout_constraintEnd_toEndOf="@id/dialog_background"
|
||||
app:layout_constraintTop_toBottomOf="@id/cancel"
|
||||
app:layout_constraintBottom_toTopOf="@id/anchor"/>
|
||||
|
||||
<View
|
||||
android:id="@+id/anchor"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/dialog_top_bottom_margin"
|
||||
app:layout_constraintTop_toBottomOf="@id/confirm"
|
||||
app:layout_constraintStart_toStartOf="@id/dialog_background"
|
||||
app:layout_constraintEnd_toEndOf="@id/dialog_background"
|
||||
app:layout_constraintBottom_toBottomOf="parent"/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</layout>
|
||||
|
|
@ -116,7 +116,7 @@
|
|||
android:textColor="@color/gray_main2_600"
|
||||
android:maxLines="1"
|
||||
android:background="@drawable/edit_text_background"
|
||||
android:inputType="text|textCapWords"
|
||||
android:inputType="text|textCapSentences"
|
||||
app:layout_constraintWidth_max="@dimen/text_input_max_width"
|
||||
app:layout_constraintTop_toBottomOf="@id/group_name_title"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
|
|
|
|||
|
|
@ -112,6 +112,8 @@
|
|||
<string name="dialog_update_available_message">A new version %s is available. Do you want to update?</string>
|
||||
<string name="dialog_account_international_prefix_help_title">Why do we need it?</string>
|
||||
<string name="dialog_account_international_prefix_help_message">Blah blah blah</string>
|
||||
<string name="dialog_group_conversation_edit_subject">Edit conversation subject</string>
|
||||
<string name="dialog_group_conversation_edit_subject_confirm_button">Confirm</string>
|
||||
|
||||
<string name="toast_assistant_qr_code_invalid">Invalid QR code!</string>
|
||||
<string name="toast_sip_address_copied_to_clipboard">SIP address copied into clipboard</string>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue