Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6.4.0b2 #1075

Merged
merged 76 commits into from
Jun 9, 2024
Merged

6.4.0b2 #1075

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
f1276d0
Update privacy settings submenu label
tmolitor-stud-tu May 2, 2024
e36f478
--- 901 ---
tmolitor-stud-tu May 3, 2024
20838b1
Make sure our localization update runs on a clean checkout
tmolitor-stud-tu May 3, 2024
9a66934
Better handling of objc block typedefs in swift
tmolitor-stud-tu May 4, 2024
4456b84
Implement MUC destroy
tmolitor-stud-tu May 2, 2024
ccb9bc9
Simplify addUIHandler() callbacks
tmolitor-stud-tu May 4, 2024
4dadece
Fix members list to also invite new members to muc
tmolitor-stud-tu May 4, 2024
e16f3e3
Allow multiline group subjects when editing
tmolitor-stud-tu May 4, 2024
64c3a5b
Rework whole muc edit ui to be more modern
tmolitor-stud-tu May 4, 2024
ced8624
Fix stanzaid handling for muc reflections, fixes message retraction
tmolitor-stud-tu May 4, 2024
4e2f710
Only update stanzaid on jid equality
tmolitor-stud-tu May 4, 2024
3b76746
Throw exception if sqlite bind and arg count don't match
tmolitor-stud-tu May 4, 2024
bb70394
Let ObservableKVOWrapper return description of wrapped object
tmolitor-stud-tu May 4, 2024
f7ae858
Make ObservableKVOWrapper conform to Identifiable
tmolitor-stud-tu May 4, 2024
70fa596
Rework whole group members list ui
tmolitor-stud-tu May 4, 2024
e2b48ed
Fix contact picker and completely rework it
tmolitor-stud-tu May 4, 2024
8124c69
Slight overhaul of create group menu
tmolitor-stud-tu May 4, 2024
73c1022
Clean up swiftui implementations
tmolitor-stud-tu May 5, 2024
162bf6f
Fix mds bug when receiving while not in catchup
tmolitor-stud-tu May 7, 2024
2b9e0f7
Improve WebRTC handling and add macOS CallKit experiment
tmolitor-stud-tu Apr 30, 2024
ae4764f
Activate DNSSEC validation for all HTTP requests and TCP connections
tmolitor-stud-tu May 7, 2024
c2c0279
Don't loop on repeated pubsub precondition fails
tmolitor-stud-tu May 10, 2024
c640946
Don't advertise support for urn:xmpp:idle:1 if deactivated by user
tmolitor-stud-tu May 10, 2024
5417ea2
Change advertised caps hash for privacy setting changes
tmolitor-stud-tu May 10, 2024
f515e71
Allo comparison of ObservableKVOWrapper with object of wrapped type
tmolitor-stud-tu May 10, 2024
7808d69
Make MLContact instances true singletons
tmolitor-stud-tu May 10, 2024
a37e0bd
Fix crash in contact details
tmolitor-stud-tu May 10, 2024
5f20a13
Improve appearance of LoadingOverlay
tmolitor-stud-tu May 10, 2024
c3313b2
Make group members editor fully dynamic and handle all errors
tmolitor-stud-tu May 10, 2024
21ed2f0
Implement channel management
tmolitor-stud-tu May 10, 2024
75e1502
Dynamically handle affiliation and role changes in contact details
tmolitor-stud-tu May 10, 2024
5d17bde
Fix group avatar image picker on macos
tmolitor-stud-tu May 10, 2024
32217fb
Make channel members list dynamic, too
tmolitor-stud-tu May 19, 2024
e06c327
Make sure to update muc contact on delete/remove/ban etc.
tmolitor-stud-tu May 19, 2024
27e7e16
Improve group/channel admin mode even further
tmolitor-stud-tu May 10, 2024
2d229b8
Bring back upload hud when sharing through sharesheet
tmolitor-stud-tu May 19, 2024
212dcbc
Fix all types of scrolling (initial, scroll down, keyboard open etc.)
tmolitor-stud-tu May 20, 2024
cc052b5
Set thread name in getExtraRunloopWithIdentifier, too
tmolitor-stud-tu May 20, 2024
fe2d28d
Fix scrolling for catalyst, too
tmolitor-stud-tu May 20, 2024
7ecf7a5
Make DNSSEC validation configurable (default: off)
tmolitor-stud-tu May 20, 2024
7991a3d
Fix swiftui warning in privacy settings
tmolitor-stud-tu May 20, 2024
acece90
Rework scroll to bottom again
tmolitor-stud-tu May 20, 2024
0b3847b
Prepare SRV resolver for DNSSEC (but commented out)
tmolitor-stud-tu May 20, 2024
51af80d
Only send outgoing displayed markers if request by contact (XEP-0333)
tmolitor-stud-tu May 20, 2024
d4c2116
Fix unread badge that got broken by MLContact singleton implementation
tmolitor-stud-tu May 20, 2024
089794d
Rework settings to have more natural categories
tmolitor-stud-tu May 21, 2024
caecd69
Clean up some older code
tmolitor-stud-tu May 21, 2024
f3b1e60
Make sure privacy settings get displayed after first login/register
tmolitor-stud-tu May 21, 2024
1bb2e0c
Fix some very rare race conditions on incoming calls
tmolitor-stud-tu May 21, 2024
c0b2f55
Add new addTopRight view modifier to add a top-right overlay
tmolitor-stud-tu May 24, 2024
5d01419
Update muc contact details to allow removal of avatars
tmolitor-stud-tu May 24, 2024
376c207
Bump version to 6.4.0
tmolitor-stud-tu May 24, 2024
48f386f
--- 905 ---
tmolitor-stud-tu May 25, 2024
958fd65
Harmonize navigation bar translatability
tmolitor-stud-tu May 25, 2024
751043f
docs: update Homebrew beta install instructions
krehel May 26, 2024
f11b426
Update doap file
tmolitor-stud-tu May 26, 2024
d670bcb
Use "device" instead of "phone" in general settings explanation string
tmolitor-stud-tu May 26, 2024
dc51c3a
Show "old app" notifications for every incoming push for alpha builds
tmolitor-stud-tu May 26, 2024
d882964
Add es-AR and copy over es-419
tmolitor-stud-tu Jun 5, 2024
8b355eb
Try to get rid of parse queue freeze glitch
tmolitor-stud-tu Jun 5, 2024
6bdc840
Make muc invites call ui error handlers, too
tmolitor-stud-tu Jun 5, 2024
c747372
Make string translatable in OmemoKeys
tmolitor-stud-tu Jun 5, 2024
642fc08
Introduce promises and simplify muc ui handler using promises
tmolitor-stud-tu Jun 5, 2024
d1806cc
Don't show new deviceid alers on first login, see #1071
tmolitor-stud-tu Jun 6, 2024
ea43a73
Don't show "unknown error" omemo errors on alpha
tmolitor-stud-tu Jun 6, 2024
f605172
Implement inline safari versus default browser app setting
tmolitor-stud-tu Jun 6, 2024
7060468
Improve display of general settings
tmolitor-stud-tu Jun 6, 2024
3f2a03d
Add FrameUp lib written by Ryan Lintott
tmolitor-stud-tu Jun 9, 2024
56e3f5d
Fix display and accessibility of group members
tmolitor-stud-tu Jun 9, 2024
21cda8b
Add bigger margin around loading overlay bubble to look better
tmolitor-stud-tu Jun 9, 2024
f194673
Oder muc members list by online status and affiliation
tmolitor-stud-tu Jun 9, 2024
25484e5
Make all accessibility labels translatable
tmolitor-stud-tu Jun 9, 2024
caed641
Make RichAlert smart scrollable, thanks Ryan Lintott
tmolitor-stud-tu Jun 9, 2024
81cb333
Merge branch 'beta' into 6.4.0b2
tmolitor-stud-tu Jun 9, 2024
406d067
Remove leftover code
tmolitor-stud-tu Jun 9, 2024
23be752
Fix broken merge-conflict fix
tmolitor-stud-tu Jun 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 10 additions & 12 deletions Monal/Classes/AddContactMenu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -145,18 +145,16 @@ struct AddContactMenu: View {
trustFingerprints(self.importScannedFingerprints ? self.scannedFingerprints : [:], for:jid, on:account)
successAlert(title: Text("Permission Requested"), message: Text("The new contact will be added to your contacts list when the person you've added has approved your request."))
} else if type == "muc" {
showLoadingOverlay(overlay, headline: NSLocalizedString("Adding Group/Channel...", comment: ""))
account.mucProcessor.addUIHandler({_data in let data = _data as! NSDictionary
let success : Bool = data["success"] as! Bool;
performMucAction(account:account, mucJid:jid, overlay:overlay, headlineView:Text("Adding Group/Channel..."), descriptionView:Text("")) {
account.joinMuc(jid)
}.done { _ in
self.newContact = MLContact.createContact(fromJid: jid, andAccountNo: account.accountNo)
successAlert(title: Text("Success!"), message: Text("Successfully joined group/channel \(jid)!"))
}.catch { error in
errorAlert(title: Text("Error entering group/channel!"), message: Text("\(String(describing:error))"))
}.finally {
hideLoadingOverlay(overlay)
if success {
self.newContact = MLContact.createContact(fromJid: jid, andAccountNo: account.accountNo)
successAlert(title: Text("Success!"), message: Text(String.localizedStringWithFormat("Successfully joined group/channel %@!", jid)))
} else {
errorAlert(title: Text("Error entering group/channel!"), message: Text(data["errorMessage"] as! String))
}
}, forMuc: jid)
account.joinMuc(jid)
}
} else {
hideLoadingOverlay(overlay)
errorAlert(title: Text("Error"), message: Text(errorMsg ?? "Undefined error"))
Expand Down Expand Up @@ -287,7 +285,7 @@ struct AddContactMenu: View {
}
}
.addLoadingOverlay(overlay)
.navigationBarTitle("Add Contact or Channel", displayMode: .inline)
.navigationBarTitle(Text("Add Contact or Channel"), displayMode: .inline)
.navigationViewStyle(.stack)
.toolbar(content: {
ToolbarItemGroup(placement: .navigationBarTrailing) {
Expand Down
4 changes: 2 additions & 2 deletions Monal/Classes/BackgroundSettings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ struct BackgroundSettings: View {
Image(systemName: "xmark.circle.fill")
.resizable()
.frame(width: 32.0, height: 32.0)
.accessibilityLabel("Remove Background Image")
.accessibilityLabel(Text("Remove Background Image"))
.applyClosure { view in
if #available(iOS 15, *) {
view
Expand All @@ -89,7 +89,7 @@ struct BackgroundSettings: View {
.frame(maxWidth: .infinity, alignment: .center)
}
}
.accessibilityLabel("Change Background Image")
.accessibilityLabel(Text("Change Background Image"))
.sheet(isPresented:$showingImagePicker) {
ImagePicker(image:$inputImage)
}
Expand Down
11 changes: 7 additions & 4 deletions Monal/Classes/ChannelMemberList.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,27 @@ struct ChannelMemberList: View {
participants[nick] = memberInfo["affiliation"] as? String ?? "none"
}
}
participants.sort {
(mucAffiliationToInt($0.value), $0.key) < (mucAffiliationToInt($1.value), $1.key)
}
}


var body: some View {
List {
Section(header: Text("\(self.channel.contactDisplayName as String) (affiliation: \(mucAffiliationToString(ownAffiliation)))")) {
ForEach(participants.sorted(by: <), id: \.self.key) { participant in
ForEach(participants.keys, id: \.self) { participant_key in
ZStack(alignment: .topLeading) {
HStack(alignment: .center) {
Text(participant.key)
Text(participant_key)
Spacer()
Text(mucAffiliationToString(participant.value))
Text(mucAffiliationToString(participants[participant_key]))
}
}
}
}
}
.navigationBarTitle(NSLocalizedString("Channel Participants", comment: ""), displayMode: .inline)
.navigationBarTitle(Text("Channel Participants"), displayMode: .inline)
.onAppear {
updateParticipantList()
}
Expand Down
63 changes: 26 additions & 37 deletions Monal/Classes/ContactDetails.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,6 @@ struct ContactDetails: View {
success = true // < dismiss entire view on close
}

private func performAction(_ title: Text, action: @escaping ()->Void) {
self.account.mucProcessor.addUIHandler({_data in let data = _data as! NSDictionary
DispatchQueue.main.async {
hideLoadingOverlay(self.overlay)
let success : Bool = data["success"] as! Bool;
if !success {
errorAlert(title: title, message: Text(data["errorMessage"] as? String ?? "Unknown error!"))
}
}
}, forMuc:self.contact.contactJid)
action()
}

private func showImagePicker() {
#if targetEnvironment(macCatalyst)
let picker = DocumentPickerViewController(
Expand Down Expand Up @@ -105,7 +92,7 @@ struct ContactDetails: View {
.applyClosure {view in
if contact.isGroup {
if ownAffiliation == "owner" {
view.accessibilityLabel((contact.mucType == "group") ? "Change Group Avatar" : "Change Channel Avatar")
view.accessibilityLabel((contact.mucType == "group") ? Text("Change Group Avatar") : Text("Change Channel Avatar"))
.onTapGesture {
showImagePicker()
}
Expand All @@ -117,7 +104,7 @@ struct ContactDetails: View {
Image(systemName: "xmark.circle.fill")
.resizable()
.frame(width: 24.0, height: 24.0)
.accessibilityLabel((contact.mucType == "group") ? "Remove Group Avatar" : "Remove Channel Avatar")
.accessibilityLabel((contact.mucType == "group") ? Text("Remove Group Avatar") : Text("Remove Channel Avatar"))
.applyClosure { view in
if #available(iOS 15, *) {
view
Expand All @@ -137,7 +124,7 @@ struct ContactDetails: View {
Image(systemName: "pencil.circle.fill")
.resizable()
.frame(width: 24.0, height: 24.0)
.accessibilityLabel((contact.mucType == "group") ? "Change Group Avatar" : "Change Channel Avatar")
.accessibilityLabel((contact.mucType == "group") ? Text("Change Group Avatar") : Text("Change Channel Avatar"))
// .applyClosure { view in
// if #available(iOS 15, *) {
// view
Expand All @@ -153,10 +140,10 @@ struct ContactDetails: View {
}
}
} else {
view.accessibilityLabel((contact.mucType == "group") ? "Group Avatar" : "Channel Avatar")
view.accessibilityLabel((contact.mucType == "group") ? Text("Group Avatar") : Text("Channel Avatar"))
}
} else {
view.accessibilityLabel("Avatar")
view.accessibilityLabel(Text("Avatar"))
}
}
.frame(width: 150, height: 150, alignment: .center)
Expand All @@ -173,9 +160,11 @@ struct ContactDetails: View {
.destructive(
Text("Yes"),
action: {
showLoadingOverlay(overlay, headline: NSLocalizedString("Removing avatar...", comment: ""))
performAction(Text("Error removing avatar!")) {
performMucAction(account:account, mucJid:contact.contactJid, overlay:overlay, headlineView:Text("Removing avatar..."), descriptionView:Text("")) {
self.account.mucProcessor.publishAvatar(nil, forMuc: contact.contactJid)
}.catch { error in
errorAlert(title: Text("Error removing avatar!"), message: Text("\(String(describing:error))"))
hideLoadingOverlay(overlay)
}
}
)
Expand Down Expand Up @@ -364,13 +353,13 @@ struct ContactDetails: View {
TextField(label, text: $contact.fullNameView, onEditingChanged: {
isEditingNickname = $0
})
.accessibilityLabel(contact.obj.mucType == "group" ? "Group name" : "Channel name")
.accessibilityLabel(contact.obj.mucType == "group" ? Text("Group name") : Text("Channel name"))
.addClearButton(isEditing: isEditingNickname, text: $contact.fullNameView)
} else if !contact.isGroup && !contact.isSelfChat {
TextField(NSLocalizedString("Rename Contact", comment: "placeholder text in contact details"), text: $contact.nickNameView, onEditingChanged: {
isEditingNickname = $0
})
.accessibilityLabel("Nickname")
.accessibilityLabel(Text("Nickname"))
.addClearButton(isEditing: isEditingNickname, text: $contact.nickNameView)
}

Expand Down Expand Up @@ -557,20 +546,18 @@ struct ContactDetails: View {
.destructive(
Text("Yes"),
action: {
showLoadingOverlay(overlay, headline: contact.mucType == "group" ? NSLocalizedString("Destroying group...", comment: "") : NSLocalizedString("Destroying channel...", comment: ""))
self.account.mucProcessor.destroyRoom(contact.contactJid as String)
self.account.mucProcessor.addUIHandler({_data in let data = _data as! NSDictionary
hideLoadingOverlay(overlay)
let success : Bool = data["success"] as! Bool;
if success {
if let callback = data["callback"] {
self.successCallback = objcCast(callback) as monal_void_block_t
}
successAlert(title: Text("Success"), message: contact.mucType == "group" ? Text("Successfully destroyed group.") : Text("Successfully destroyed channel."))
} else {
errorAlert(title: Text("Error destroying group!"), message: Text(data["errorMessage"] as! String))
performMucAction(account:account, mucJid:contact.contactJid, overlay:overlay, headlineView:contact.mucType == "group" ? Text("Destroying group...") : Text("Destroying channel..."), descriptionView:Text("")) {
self.account.mucProcessor.destroyRoom(contact.contactJid as String)
}.done { callback in
if let callback = callback {
self.successCallback = callback
}
}, forMuc:contact.contactJid)
successAlert(title: Text("Success"), message: contact.mucType == "group" ? Text("Successfully destroyed group.") : Text("Successfully destroyed channel."))
}.catch { error in
errorAlert(title: Text("Error destroying group!"), message: Text("\(String(describing:error))"))
}.finally {
hideLoadingOverlay(overlay)
}
}
)
]
Expand Down Expand Up @@ -658,9 +645,11 @@ struct ContactDetails: View {
}))
}
.onChange(of:inputImage) { _ in
showLoadingOverlay(overlay, headline: NSLocalizedString("Uploading avatar...", comment: ""))
performAction(Text("Error changing avatar!")) {
performMucAction(account:account, mucJid:contact.contactJid, overlay:overlay, headlineView:Text("Uploading avatar..."), descriptionView:Text("")) {
self.account.mucProcessor.publishAvatar(inputImage, forMuc: contact.contactJid)
}.catch { error in
errorAlert(title: Text("Error changing avatar!"), message: Text("\(String(describing:error))"))
hideLoadingOverlay(overlay)
}
}
.onChange(of:contact.avatar as UIImage) { _ in
Expand Down
19 changes: 16 additions & 3 deletions Monal/Classes/ContactEntry.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,23 @@
// Copyright © 2023 monal-im.org. All rights reserved.
//

struct ContactEntry: View {
struct ContactEntry<AdditionalContent: View>: View {
let contact: ObservableKVOWrapper<MLContact>
let selfnotesPrefix: Bool
@ViewBuilder let additionalContent: () -> AdditionalContent

init(contact:ObservableKVOWrapper<MLContact>, selfnotesPrefix: Bool = true) {
init(contact:ObservableKVOWrapper<MLContact>, selfnotesPrefix: Bool = true) where AdditionalContent == EmptyView {
self.init(contact:contact, selfnotesPrefix:selfnotesPrefix, additionalContent:{ EmptyView() })
}

init(contact:ObservableKVOWrapper<MLContact>, @ViewBuilder additionalContent: @escaping () -> AdditionalContent) {
self.init(contact:contact, selfnotesPrefix:true, additionalContent:additionalContent)
}

init(contact:ObservableKVOWrapper<MLContact>, selfnotesPrefix: Bool, @ViewBuilder additionalContent: @escaping () -> AdditionalContent) {
self.contact = contact
self.selfnotesPrefix = selfnotesPrefix
self.additionalContent = additionalContent
}

var body:some View {
Expand All @@ -27,7 +37,10 @@ struct ContactEntry: View {
} else {
Text(contact.contactDisplayNameWithoutSelfnotesPrefix as String)
}
Text(contact.contactJid as String).font(.footnote).opacity(0.6)
additionalContent()
Text(contact.contactJid as String)
.foregroundColor(Color(UIColor.secondaryLabel))
.font(.footnote)
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion Monal/Classes/ContactPicker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ struct ContactPicker: View {
}
}
.listStyle(.inset)
.navigationBarTitle(NSLocalizedString("Contact Selection", comment: ""), displayMode: .inline)
.navigationBarTitle(Text("Contact Selection"), displayMode: .inline)
.onDisappear {
returnedContacts.removeAll()
for contact in selectedContacts {
Expand Down
2 changes: 1 addition & 1 deletion Monal/Classes/ContactRequestsMenu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ struct ContactRequestsMenu: View {
}
}
}
.navigationBarTitle("Contact Requests", displayMode: .inline)
.navigationBarTitle(Text("Contact Requests"), displayMode: .inline)
.navigationViewStyle(.stack)
.onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("kMonalContactRefresh")).receive(on: RunLoop.main)) { notification in
self.pendingRequests = DataLayer.sharedInstance().allContactRequests() as! [MLContact]
Expand Down
2 changes: 1 addition & 1 deletion Monal/Classes/ContactResources.swift
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ struct ContactResources: View {
}
}
}
.navigationBarTitle("Devices of \(contact.contactDisplayName as String)", displayMode: .inline)
.navigationBarTitle(Text("Devices of \(contact.contactDisplayName as String)"), displayMode: .inline)
}
}

Expand Down
2 changes: 1 addition & 1 deletion Monal/Classes/CreateGroupMenu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ struct CreateGroupMenu: View {
}))
}
.addLoadingOverlay(overlay)
.navigationBarTitle(NSLocalizedString("Create new group", comment:""), displayMode: .inline)
.navigationBarTitle(Text("Create new group"), displayMode: .inline)
.navigationViewStyle(.stack)
}
}
Expand Down
4 changes: 2 additions & 2 deletions Monal/Classes/DataLayer.m
Original file line number Diff line number Diff line change
Expand Up @@ -1024,8 +1024,8 @@ -(NSDictionary* _Nullable) getParticipantForNick:(NSString*) nick inRoom:(NSStri
return [self.db idReadTransaction:^{
NSMutableArray<NSDictionary<NSString*, id>*>* toReturn = [[NSMutableArray<NSDictionary<NSString*, id>*> alloc] init];

[toReturn addObjectsFromArray:[self.db executeReader:@"SELECT *, 1 as 'online' FROM muc_participants WHERE account_id=? AND room=?;" andArguments:@[accountNo, room]]];
[toReturn addObjectsFromArray:[self.db executeReader:@"SELECT *, 0 as 'online' FROM muc_members WHERE account_id=? AND room=? AND NOT EXISTS(SELECT * FROM muc_participants WHERE muc_members.account_id=muc_participants.account_id AND muc_members.room=muc_participants.room AND muc_members.member_jid=muc_participants.participant_jid);" andArguments:@[accountNo, room]]];
[toReturn addObjectsFromArray:[self.db executeReader:@"SELECT *, 1 as 'online' FROM muc_participants WHERE account_id=? AND room=? ORDER BY affiliation, room_nick;" andArguments:@[accountNo, room]]];
[toReturn addObjectsFromArray:[self.db executeReader:@"SELECT *, 0 as 'online' FROM muc_members WHERE account_id=? AND room=? AND NOT EXISTS(SELECT * FROM muc_participants WHERE muc_members.account_id=muc_participants.account_id AND muc_members.room=muc_participants.room AND muc_members.member_jid=muc_participants.participant_jid) ORDER BY affiliation;" andArguments:@[accountNo, room]]];

return toReturn;
}];
Expand Down
Loading