소스 검색

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

✉️ & ⭕ Allow to add emails and circles as particpants
Andy Scherzinger 4 년 전
부모
커밋
94416b3ad0

+ 1 - 1
app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt

@@ -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,

+ 4 - 1
app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java

@@ -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);

+ 7 - 2
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -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(

+ 119 - 52
app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java

@@ -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());
-
-                                    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);
-                                            }
-
+                                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());
+
+                                        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();
+                                        }
 
-                                            UserItem newContactItem = new UserItem(participant, currentUser,
-                                                    userHeaderItems.get(headerTitle));
+                                        GenericTextHeaderItem genericTextHeaderItem;
+                                        if (!userHeaderItems.containsKey(headerTitle)) {
+                                            genericTextHeaderItem = new GenericTextHeaderItem(headerTitle);
+                                            userHeaderItems.put(headerTitle, genericTextHeaderItem);
+                                        }
 
-                                            if (!contactItems.contains(newContactItem)) {
-                                                newUserItemList.add(newContactItem);
-                                            }
+                                        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());

+ 9 - 6
app/src/main/java/com/nextcloud/talk/controllers/bottomsheet/OperationsMenuController.java

@@ -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())

+ 57 - 14
app/src/main/java/com/nextcloud/talk/jobs/AddParticipantsToConversation.java

@@ -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);
-
-            ncApi.addParticipant(credentials, retrofitBucket.getUrl(), retrofitBucket.getQueryMap())
-                    .subscribeOn(Schedulers.io())
-                    .blockingSubscribe();
+        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();
+            }
         }
 
-        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();
+            }
+        }
+
+        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();
+            }
+        }
 
-            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));

+ 3 - 0
app/src/main/java/com/nextcloud/talk/models/json/converters/EnumActorTypeConverter.kt

@@ -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 -> ""
         }
     }

+ 1 - 0
app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java

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

+ 13 - 9
app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java

@@ -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;
     }
 

+ 4 - 0
app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt

@@ -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"

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

@@ -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>