Merge pull request #1245 from nextcloud/feature/noid/allow-to-add-emails-as-participant

✉️ &  Allow to add emails and circles as particpants
This commit is contained in:
Andy Scherzinger 2021-05-14 17:41:49 +02:00 committed by GitHub
commit 94416b3ad0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 220 additions and 85 deletions

View file

@ -259,7 +259,7 @@ class MainActivity : BaseActivity(), ActionBarProvider {
val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token)
val retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom(
apiVersion, currentUser.baseUrl, roomType,
userId, null
null, userId, null
)
ncApi.createRoom(
credentials,

View file

@ -151,7 +151,10 @@ public class UserItem extends AbstractFlexibleItem<UserItem.UserItemViewHolder>
holder.contactDisplayName.setText(NextcloudTalkApplication.Companion.getSharedApplication().getString(R.string.nc_guest));
}
if (participant.getActorType() == Participant.ActorType.GROUPS || "groups".equals(participant.getSource())) {
if (participant.getActorType() == Participant.ActorType.GROUPS ||
"groups".equals(participant.getSource()) ||
participant.getActorType() == Participant.ActorType.CIRCLES ||
"circles".equals(participant.getSource())) {
holder.simpleDraweeView.setImageResource(R.drawable.ic_circular_group);
} else if (participant.getActorType() == Participant.ActorType.EMAILS) {
holder.simpleDraweeView.setImageResource(R.drawable.ic_circular_mail);

View file

@ -1625,6 +1625,7 @@ class ChatController(args: Bundle) :
apiVersion,
conversationUser?.baseUrl,
"1",
null,
message?.user?.id?.substring(6),
null
)
@ -1818,8 +1819,12 @@ class ChatController(args: Bundle) :
}
val retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom(
apiVersion, conversationUser?.baseUrl, "1",
userMentionClickEvent.userId, null
apiVersion,
conversationUser?.baseUrl,
"1",
null,
userMentionClickEvent.userId,
null
)
ncApi?.createRoom(

View file

@ -75,6 +75,7 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.parceler.Parcels;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -129,7 +130,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
@BindView(R.id.loading_content)
LinearLayout loadingContent;
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
@ -191,6 +191,8 @@ public class ContactsController extends BaseController implements SearchView.OnQ
private Set<String> selectedUserIds;
private Set<String> selectedGroupIds;
private Set<String> selectedCircleIds;
private Set<String> selectedEmails;
private List<String> existingParticipants;
private boolean isAddingParticipantsView;
private String conversationToken;
@ -217,8 +219,10 @@ public class ContactsController extends BaseController implements SearchView.OnQ
}
}
selectedGroupIds = new HashSet<>();
selectedUserIds = new HashSet<>();
selectedGroupIds = new HashSet<>();
selectedEmails = new HashSet<>();
selectedCircleIds = new HashSet<>();
}
@Override
@ -279,13 +283,18 @@ public class ContactsController extends BaseController implements SearchView.OnQ
private void selectionDone() {
if (!isAddingParticipantsView) {
if (!isPublicCall && (selectedGroupIds.size() + selectedUserIds.size() == 1)) {
if (!isPublicCall && (selectedCircleIds.size() + selectedGroupIds.size() + selectedUserIds.size() == 1)) {
String userId;
String sourceType = null;
String roomType = "1";
if (selectedGroupIds.size() == 1) {
roomType = "2";
userId = selectedGroupIds.iterator().next();
} else if (selectedCircleIds.size() == 1) {
roomType = "2";
sourceType = "circles";
userId = selectedCircleIds.iterator().next();
} else {
userId = selectedUserIds.iterator().next();
}
@ -294,6 +303,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
RetrofitBucket retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom(apiVersion,
currentUser.getBaseUrl(),
roomType,
sourceType,
userId,
null);
ncApi.createRoom(credentials,
@ -368,23 +378,31 @@ public class ContactsController extends BaseController implements SearchView.OnQ
ArrayList<String> userIdsArray = new ArrayList<>(selectedUserIds);
ArrayList<String> groupIdsArray = new ArrayList<>(selectedGroupIds);
ArrayList<String> emailsArray = new ArrayList<>(selectedEmails);
ArrayList<String> circleIdsArray = new ArrayList<>(selectedCircleIds);
bundle.putParcelable(BundleKeys.INSTANCE.getKEY_CONVERSATION_TYPE(), Parcels.wrap(roomType));
bundle.putStringArrayList(BundleKeys.INSTANCE.getKEY_INVITED_PARTICIPANTS(), userIdsArray);
bundle.putStringArrayList(BundleKeys.INSTANCE.getKEY_INVITED_GROUP(), groupIdsArray);
bundle.putStringArrayList(BundleKeys.INSTANCE.getKEY_INVITED_EMAIL(), emailsArray);
bundle.putStringArrayList(BundleKeys.INSTANCE.getKEY_INVITED_CIRCLE(), circleIdsArray);
bundle.putInt(BundleKeys.INSTANCE.getKEY_OPERATION_CODE(), 11);
prepareAndShowBottomSheetWithBundle(bundle, true);
}
} else {
String[] userIdsArray = selectedUserIds.toArray(new String[selectedUserIds.size()]);
String[] groupIdsArray = selectedGroupIds.toArray(new String[selectedGroupIds.size()]);
String[] emailsArray = selectedEmails.toArray(new String[selectedEmails.size()]);
String[] circleIdsArray = selectedCircleIds.toArray(new String[selectedCircleIds.size()]);
Data.Builder data = new Data.Builder();
data.putLong(BundleKeys.INSTANCE.getKEY_INTERNAL_USER_ID(), currentUser.getId());
data.putString(BundleKeys.INSTANCE.getKEY_TOKEN(), conversationToken);
data.putStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_USERS(), userIdsArray);
data.putStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_GROUPS(), groupIdsArray);
data.putStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_EMAILS(), emailsArray);
data.putStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_CIRCLES(), circleIdsArray);
OneTimeWorkRequest addParticipantsToConversationWorker =
new OneTimeWorkRequest.Builder(AddParticipantsToConversation.class).setInputData(data.build()).build();
@ -467,15 +485,26 @@ public class ContactsController extends BaseController implements SearchView.OnQ
modifiedQueryMap.put("itemId", conversationToken);
}
List<String> shareTypesList = null;
List<String> shareTypesList;
shareTypesList = new ArrayList<>();
// users
shareTypesList.add("0");
shareTypesList = new ArrayList<>();
// users
shareTypesList.add("0");
if (!isAddingParticipantsView) {
// groups
shareTypesList.add("1");
} else if (currentUser.hasSpreedFeatureCapability("invite-groups-and-mails")) {
// groups
shareTypesList.add("1");
// emails
shareTypesList.add("4");
}
if (currentUser.hasSpreedFeatureCapability("circles-support")) {
// circles
shareTypesList.add("7");
}
modifiedQueryMap.put("shareTypes[]", shareTypesList);
modifiedQueryMap.put("shareTypes[]", shareTypesList);
ncApi.getContactsWithSearchParam(
credentials,
@ -498,43 +527,49 @@ public class ContactsController extends BaseController implements SearchView.OnQ
EnumActorTypeConverter actorTypeConverter = new EnumActorTypeConverter();
try {
AutocompleteOverall autocompleteOverall = LoganSquare.parse(responseBody.string(), AutocompleteOverall.class);
autocompleteUsersHashSet.addAll(autocompleteOverall.getOcs().getData());
AutocompleteOverall autocompleteOverall = LoganSquare.parse(
responseBody.string(),
AutocompleteOverall.class);
autocompleteUsersHashSet.addAll(autocompleteOverall.getOcs().getData());
for (AutocompleteUser autocompleteUser : autocompleteUsersHashSet) {
if (!autocompleteUser.getId().equals(currentUser.getUserId()) && !existingParticipants.contains(autocompleteUser.getId())) {
participant = new Participant();
participant.setActorId(autocompleteUser.getId());
participant.setActorType(actorTypeConverter.getFromString(autocompleteUser.getSource()));
participant.setDisplayName(autocompleteUser.getLabel());
participant.setSource(autocompleteUser.getSource());
for (AutocompleteUser autocompleteUser : autocompleteUsersHashSet) {
if (!autocompleteUser.getId().equals(currentUser.getUserId())
&& !existingParticipants.contains(autocompleteUser.getId())) {
participant = new Participant();
participant.setActorId(autocompleteUser.getId());
participant.setActorType(actorTypeConverter.getFromString(autocompleteUser.getSource()));
participant.setDisplayName(autocompleteUser.getLabel());
participant.setSource(autocompleteUser.getSource());
String headerTitle;
if (participant.getActorType() != Participant.ActorType.GROUPS) {
headerTitle = participant.getDisplayName().substring(0, 1).toUpperCase();
} else {
headerTitle = getResources().getString(R.string.nc_groups);
}
GenericTextHeaderItem genericTextHeaderItem;
if (!userHeaderItems.containsKey(headerTitle)) {
genericTextHeaderItem = new GenericTextHeaderItem(headerTitle);
userHeaderItems.put(headerTitle, genericTextHeaderItem);
}
UserItem newContactItem = new UserItem(participant, currentUser,
userHeaderItems.get(headerTitle));
if (!contactItems.contains(newContactItem)) {
newUserItemList.add(newContactItem);
}
String headerTitle;
if (participant.getActorType() == Participant.ActorType.GROUPS) {
headerTitle = getResources().getString(R.string.nc_groups);
} else if (participant.getActorType() == Participant.ActorType.CIRCLES) {
headerTitle = getResources().getString(R.string.nc_circles);
} else {
headerTitle = participant.getDisplayName().substring(0, 1).toUpperCase();
}
GenericTextHeaderItem genericTextHeaderItem;
if (!userHeaderItems.containsKey(headerTitle)) {
genericTextHeaderItem = new GenericTextHeaderItem(headerTitle);
userHeaderItems.put(headerTitle, genericTextHeaderItem);
}
UserItem newContactItem = new UserItem(
participant,
currentUser,
userHeaderItems.get(headerTitle)
);
if (!contactItems.contains(newContactItem)) {
newUserItemList.add(newContactItem);
}
}
}
} catch (Exception exception) {
Log.e(TAG, "Parsing response body failed while getting contacts");
} catch (IOException ioe) {
Log.e(TAG, "Parsing response body failed while getting contacts", ioe);
}
userHeaderItems = new HashMap<>();
@ -544,7 +579,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
String firstName;
String secondName;
if (o1 instanceof UserItem) {
firstName = ((UserItem) o1).getModel().getDisplayName();
} else {
@ -558,13 +592,35 @@ public class ContactsController extends BaseController implements SearchView.OnQ
}
if (o1 instanceof UserItem && o2 instanceof UserItem) {
if ("groups".equals(((UserItem) o1).getModel().getSource()) && "groups".equals(((UserItem) o2).getModel().getSource())) {
String firstSource = ((UserItem) o1).getModel().getSource();
String secondSource = ((UserItem) o2).getModel().getSource();
if (firstSource.equals(secondSource)) {
return firstName.compareToIgnoreCase(secondName);
} else if ("groups".equals(((UserItem) o1).getModel().getSource())) {
}
// First users
if ("users".equals(firstSource)) {
return -1;
} else if ("groups".equals(((UserItem) o2).getModel().getSource())) {
} else if ("users".equals(secondSource)) {
return 1;
}
// Then groups
if ("groups".equals(firstSource)) {
return -1;
} else if ("groups".equals(secondSource)) {
return 1;
}
// Then circles
if ("circles".equals(firstSource)) {
return -1;
} else if ("circles".equals(secondSource)) {
return 1;
}
// Otherwise fall back to name sorting
return firstName.compareToIgnoreCase(secondName);
}
return firstName.compareToIgnoreCase(secondName);
@ -574,7 +630,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
String firstName;
String secondName;
if (o1 instanceof UserItem) {
firstName = ((UserItem) o1).getModel().getDisplayName();
} else {
@ -600,7 +655,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
return firstName.compareToIgnoreCase(secondName);
});
if (newUserItemList.size() > 0) {
adapter.updateDataSet(newUserItemList);
} else {
@ -611,7 +665,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
swipeRefreshLayout.setRefreshing(false);
}
}
}
@Override
@ -620,7 +673,6 @@ public class ContactsController extends BaseController implements SearchView.OnQ
swipeRefreshLayout.setRefreshing(false);
}
dispose(contactsQueryDisposable);
}
@Override
@ -747,7 +799,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
private void checkAndHandleDoneMenuItem() {
if (adapter != null && doneMenuItem != null) {
if ((selectedGroupIds.size() + selectedUserIds.size() > 0) || isPublicCall) {
if ((selectedCircleIds.size() + selectedEmails.size() + selectedGroupIds.size() + selectedUserIds.size() > 0) || isPublicCall) {
doneMenuItem.setVisible(true);
} else {
doneMenuItem.setVisible(false);
@ -759,10 +811,12 @@ public class ContactsController extends BaseController implements SearchView.OnQ
@Override
protected String getTitle() {
if (!isNewConversationView && !isAddingParticipantsView) {
return getResources().getString(R.string.nc_app_name);
if (isAddingParticipantsView) {
return getResources().getString(R.string.nc_add_participants);
} else if (isNewConversationView) {
return getResources().getString(R.string.nc_select_participants);
} else {
return getResources().getString(R.string.nc_select_contacts);
return getResources().getString(R.string.nc_app_name);
}
}
@ -848,6 +902,7 @@ public class ContactsController extends BaseController implements SearchView.OnQ
RetrofitBucket retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom(apiVersion,
currentUser.getBaseUrl(),
roomType,
null,
userItem.getModel().getActorId(),
null);
@ -899,6 +954,18 @@ public class ContactsController extends BaseController implements SearchView.OnQ
} else {
selectedGroupIds.remove(participant.getActorId());
}
} else if ("emails".equals(participant.getSource())) {
if (participant.isSelected()) {
selectedEmails.add(participant.getActorId());
} else {
selectedEmails.remove(participant.getActorId());
}
} else if ("circles".equals(participant.getSource())) {
if (participant.isSelected()) {
selectedCircleIds.add(participant.getActorId());
} else {
selectedCircleIds.remove(participant.getActorId());
}
} else {
if (participant.isSelected()) {
selectedUserIds.add(participant.getActorId());

View file

@ -403,10 +403,10 @@ public class OperationsMenuController extends BaseController {
if (conversationType.equals(Conversation.ConversationType.ROOM_PUBLIC_CALL)) {
retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom(apiVersion, currentUser.getBaseUrl(),
"3", invite, conversationName);
"3", null, invite, conversationName);
} else {
retrofitBucket = ApiUtils.getRetrofitBucketForCreateRoom(apiVersion, currentUser.getBaseUrl(),
"2", invite, conversationName);
"2", null, invite, conversationName);
}
ncApi.createRoom(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
@ -582,10 +582,13 @@ public class OperationsMenuController extends BaseController {
if ((localInvitedGroups.size() > 0 && currentUser.hasSpreedFeatureCapability("invite-groups-and-mails"))) {
for (int i = 0; i < localInvitedGroups.size(); i++) {
final String groupId = localInvitedGroups.get(i);
retrofitBucket = ApiUtils.getRetrofitBucketForAddGroupParticipant(apiVersion,
currentUser.getBaseUrl(),
conversation.getToken(),
groupId);
retrofitBucket = ApiUtils.getRetrofitBucketForAddParticipantWithSource(
apiVersion,
currentUser.getBaseUrl(),
conversation.getToken(),
"groups",
groupId
);
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())

View file

@ -64,6 +64,8 @@ public class AddParticipantsToConversation extends Worker {
Data data = getInputData();
String[] selectedUserIds = data.getStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_USERS());
String[] selectedGroupIds = data.getStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_GROUPS());
String[] selectedCircleIds = data.getStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_CIRCLES());
String[] selectedEmails = data.getStringArray(BundleKeys.INSTANCE.getKEY_SELECTED_EMAILS());
UserEntity user = userUtils.getUserWithInternalId(data.getLong(BundleKeys.INSTANCE.getKEY_INTERNAL_USER_ID(), -1));
int apiVersion = ApiUtils.getConversationApiVersion(user, new int[] {ApiUtils.APIv4, 1});
@ -72,23 +74,64 @@ public class AddParticipantsToConversation extends Worker {
String credentials = ApiUtils.getCredentials(user.getUsername(), user.getToken());
RetrofitBucket retrofitBucket;
for (String userId : selectedUserIds) {
retrofitBucket = ApiUtils.getRetrofitBucketForAddParticipant(apiVersion, user.getBaseUrl(),
conversationToken,
userId);
if (selectedUserIds != null) {
for (String userId : selectedUserIds) {
retrofitBucket = ApiUtils.getRetrofitBucketForAddParticipant(apiVersion, user.getBaseUrl(),
conversationToken,
userId);
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())
.blockingSubscribe();
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())
.blockingSubscribe();
}
}
for (String groupId : selectedGroupIds) {
retrofitBucket = ApiUtils.getRetrofitBucketForAddGroupParticipant(apiVersion, user.getBaseUrl(), conversationToken,
groupId);
if (selectedGroupIds != null) {
for (String groupId : selectedGroupIds) {
retrofitBucket = ApiUtils.getRetrofitBucketForAddParticipantWithSource(
apiVersion,
user.getBaseUrl(),
conversationToken,
"groups",
groupId
);
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())
.blockingSubscribe();
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())
.blockingSubscribe();
}
}
if (selectedCircleIds != null) {
for (String circleId : selectedCircleIds) {
retrofitBucket = ApiUtils.getRetrofitBucketForAddParticipantWithSource(
apiVersion,
user.getBaseUrl(),
conversationToken,
"circles",
circleId
);
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())
.blockingSubscribe();
}
}
if (selectedEmails != null) {
for (String email : selectedEmails) {
retrofitBucket = ApiUtils.getRetrofitBucketForAddParticipantWithSource(
apiVersion,
user.getBaseUrl(),
conversationToken,
"emails",
email
);
ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
.subscribeOn(Schedulers.io())
.blockingSubscribe();
}
}
eventBus.post(new EventStatus(user.getId(), EventStatus.EventType.PARTICIPANTS_UPDATE, true));

View file

@ -24,6 +24,7 @@ package com.nextcloud.talk.models.json.converters
import com.bluelinelabs.logansquare.typeconverters.StringBasedTypeConverter
import com.nextcloud.talk.models.json.participants.Participant
import com.nextcloud.talk.models.json.participants.Participant.ActorType.CIRCLES
import com.nextcloud.talk.models.json.participants.Participant.ActorType.DUMMY
import com.nextcloud.talk.models.json.participants.Participant.ActorType.EMAILS
import com.nextcloud.talk.models.json.participants.Participant.ActorType.GROUPS
@ -37,6 +38,7 @@ class EnumActorTypeConverter : StringBasedTypeConverter<Participant.ActorType>()
"groups" -> GROUPS
"guests" -> GUESTS
"users" -> USERS
"circles" -> CIRCLES
else -> DUMMY
}
}
@ -52,6 +54,7 @@ class EnumActorTypeConverter : StringBasedTypeConverter<Participant.ActorType>()
GROUPS -> "groups"
GUESTS -> "guests"
USERS -> "users"
CIRCLES -> "circles"
else -> ""
}
}

View file

@ -326,6 +326,7 @@ public class Participant {
GROUPS,
GUESTS,
USERS,
CIRCLES,
}
public enum ParticipantType {

View file

@ -255,6 +255,7 @@ public class ApiUtils {
}
public static RetrofitBucket getRetrofitBucketForCreateRoom(int version, String baseUrl, String roomType,
@Nullable String source,
@Nullable String invite,
@Nullable String conversationName) {
RetrofitBucket retrofitBucket = new RetrofitBucket();
@ -265,6 +266,9 @@ public class ApiUtils {
if (invite != null) {
queryMap.put("invite", invite);
}
if (source != null) {
queryMap.put("source", source);
}
if (conversationName != null) {
queryMap.put("roomName", conversationName);
@ -289,15 +293,15 @@ public class ApiUtils {
}
public static RetrofitBucket getRetrofitBucketForAddGroupParticipant(int version, String baseUrl, String token, String group) {
RetrofitBucket retrofitBucket = getRetrofitBucketForAddParticipant(version, baseUrl, token, group);
retrofitBucket.getQueryMap().put("source", "groups");
return retrofitBucket;
}
public static RetrofitBucket getRetrofitBucketForAddMailParticipant(int version, String baseUrl, String token, String mail) {
RetrofitBucket retrofitBucket = getRetrofitBucketForAddParticipant(version, baseUrl, token, mail);
retrofitBucket.getQueryMap().put("source", "emails");
public static RetrofitBucket getRetrofitBucketForAddParticipantWithSource(
int version,
String baseUrl,
String token,
String source,
String id
) {
RetrofitBucket retrofitBucket = getRetrofitBucketForAddParticipant(version, baseUrl, token, id);
retrofitBucket.getQueryMap().put("source", source);
return retrofitBucket;
}

View file

@ -23,6 +23,8 @@ package com.nextcloud.talk.utils.bundle
object BundleKeys {
val KEY_SELECTED_USERS = "KEY_SELECTED_USERS"
val KEY_SELECTED_GROUPS = "KEY_SELECTED_GROUPS"
val KEY_SELECTED_CIRCLES = "KEY_SELECTED_CIRCLES"
val KEY_SELECTED_EMAILS = "KEY_SELECTED_EMAILS"
val KEY_USERNAME = "KEY_USERNAME"
val KEY_TOKEN = "KEY_TOKEN"
val KEY_BASE_URL = "KEY_BASE_URL"
@ -48,7 +50,9 @@ object BundleKeys {
val KEY_INTERNAL_USER_ID = "KEY_INTERNAL_USER_ID"
val KEY_CONVERSATION_TYPE = "KEY_CONVERSATION_TYPE"
val KEY_INVITED_PARTICIPANTS = "KEY_INVITED_PARTICIPANTS"
val KEY_INVITED_CIRCLE = "KEY_INVITED_CIRCLE"
val KEY_INVITED_GROUP = "KEY_INVITED_GROUP"
val KEY_INVITED_EMAIL = "KEY_INVITED_EMAIL"
val KEY_CONVERSATION_NAME = "KEY_CONVERSATION_NAME"
val KEY_CALL_VOICE_ONLY = "KEY_CALL_VOICE_ONLY"
val KEY_ACTIVE_CONVERSATION = "KEY_ACTIVE_CONVERSATION"

View file

@ -190,7 +190,8 @@
<string name="nc_remove_from_favorites">Remove from favorites</string>
<!-- Contacts -->
<string name="nc_select_contacts">Select contacts</string>
<string name="nc_select_participants">Select participants</string>
<string name="nc_add_participants">Add participants</string>
<string name="nc_contacts_done">Done</string>
<!-- Permissions -->
@ -312,6 +313,7 @@
<string name="nc_email">Email</string>
<string name="nc_group">Group</string>
<string name="nc_groups">Groups</string>
<string name="nc_circles">Circles</string>
<string name="nc_participants">Participants</string>
<string name="nc_participants_add">Add participants</string>