Sfoglia il codice sorgente

Merge pull request #893 from deltachat/streamline_add_group_members

Streamline add group members
bjoern 5 anni fa
parent
commit
5adeb3bfe5

+ 4 - 8
deltachat-ios.xcodeproj/project.pbxproj

@@ -176,8 +176,7 @@
 		AEC67A1C241CE9E4007DDBE1 /* AppStateRestorer.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC67A1B241CE9E4007DDBE1 /* AppStateRestorer.swift */; };
 		AEC67A1E241FCFE0007DDBE1 /* ChatListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEC67A1D241FCFE0007DDBE1 /* ChatListViewModel.swift */; };
 		AECEF03E244F2D55006C90DA /* QrPageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AECEF03D244F2D55006C90DA /* QrPageController.swift */; };
-		AED423D3249F578B00B6B2BB /* NewGroupAddMembersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED423D2249F578B00B6B2BB /* NewGroupAddMembersViewController.swift */; };
-		AED423D5249F57C100B6B2BB /* AddGroupMembersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED423D4249F57C100B6B2BB /* AddGroupMembersViewController.swift */; };
+		AED423D3249F578B00B6B2BB /* AddGroupMembersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED423D2249F578B00B6B2BB /* AddGroupMembersViewController.swift */; };
 		AED423D7249F580700B6B2BB /* BlockedContactsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED423D6249F580700B6B2BB /* BlockedContactsViewController.swift */; };
 		AED62BCE247687E6009E220D /* LocationStreamingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = AED62BCD247687E6009E220D /* LocationStreamingIndicator.swift */; };
 		AEE56D762253431E007DC082 /* AccountSetupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE56D752253431E007DC082 /* AccountSetupController.swift */; };
@@ -470,8 +469,7 @@
 		AEC67A1B241CE9E4007DDBE1 /* AppStateRestorer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStateRestorer.swift; sourceTree = "<group>"; };
 		AEC67A1D241FCFE0007DDBE1 /* ChatListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatListViewModel.swift; sourceTree = "<group>"; };
 		AECEF03D244F2D55006C90DA /* QrPageController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QrPageController.swift; sourceTree = "<group>"; };
-		AED423D2249F578B00B6B2BB /* NewGroupAddMembersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewGroupAddMembersViewController.swift; sourceTree = "<group>"; };
-		AED423D4249F57C100B6B2BB /* AddGroupMembersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddGroupMembersViewController.swift; sourceTree = "<group>"; };
+		AED423D2249F578B00B6B2BB /* AddGroupMembersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddGroupMembersViewController.swift; sourceTree = "<group>"; };
 		AED423D6249F580700B6B2BB /* BlockedContactsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockedContactsViewController.swift; sourceTree = "<group>"; };
 		AED62BCD247687E6009E220D /* LocationStreamingIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationStreamingIndicator.swift; sourceTree = "<group>"; };
 		AEE56D752253431E007DC082 /* AccountSetupController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountSetupController.swift; sourceTree = "<group>"; tabWidth = 4; };
@@ -944,8 +942,7 @@
 				AE76E5ED242BF2EA003CF461 /* WelcomeViewController.swift */,
 				AE8F503424753DFE007FEE0B /* GalleryViewController.swift */,
 				30734325249A280B00BF9AD1 /* MediaQualityController.swift */,
-				AED423D2249F578B00B6B2BB /* NewGroupAddMembersViewController.swift */,
-				AED423D4249F57C100B6B2BB /* AddGroupMembersViewController.swift */,
+				AED423D2249F578B00B6B2BB /* AddGroupMembersViewController.swift */,
 				AED423D6249F580700B6B2BB /* BlockedContactsViewController.swift */,
 				AE39D322249CFC1A007346A1 /* DocumentGalleryController.swift */,
 			);
@@ -1406,7 +1403,6 @@
 				AE39D323249CFC1A007346A1 /* DocumentGalleryController.swift in Sources */,
 				305961FD2346125100C80F33 /* TypingBubble.swift in Sources */,
 				305961D72346125100C80F33 /* MessageKit+Availability.swift in Sources */,
-				AED423D5249F57C100B6B2BB /* AddGroupMembersViewController.swift in Sources */,
 				AE8DD451249D1DFB009A4BC1 /* FileTableViewCell.swift in Sources */,
 				3040F45E234DFBC000FA34D5 /* Audio.swift in Sources */,
 				305961FE2346125100C80F33 /* InsetLabel.swift in Sources */,
@@ -1524,7 +1520,7 @@
 				305961FC2346125100C80F33 /* MessageContainerView.swift in Sources */,
 				305961D42346125100C80F33 /* MessagesViewController.swift in Sources */,
 				785BE16821E247F1003BE98C /* MessageInfoViewController.swift in Sources */,
-				AED423D3249F578B00B6B2BB /* NewGroupAddMembersViewController.swift in Sources */,
+				AED423D3249F578B00B6B2BB /* AddGroupMembersViewController.swift in Sources */,
 				AE851AC5227C755A00ED86F0 /* Protocols.swift in Sources */,
 				AE728F15229D5C390047565B /* PhotoPickerAlertAction.swift in Sources */,
 				305961F42346125100C80F33 /* TextMessageCell.swift in Sources */,

+ 88 - 62
deltachat-ios/Controller/AddGroupMembersViewController.swift

@@ -2,17 +2,44 @@ import UIKit
 import DcCore
 
 class AddGroupMembersViewController: GroupMembersViewController {
-    private var chatId: Int?
-    private let sectionNewContact = 0
-    private let sectionMemberList = 1
+    var onMembersSelected: ((Set<Int>) -> Void)?
+    lazy var isVerifiedGroup: Bool = false
+
+    lazy var isNewGroup: Bool = {
+        return chat == nil
+    }()
+
+    private lazy var sections: [AddGroupMemberSections] = {
+        if isVerifiedGroup {
+            return [.memberList]
+        } else {
+            return [.newContact, .memberList]
+        }
+    }()
+
+    enum AddGroupMemberSections {
+        case newContact
+        case memberList
+    }
 
     private var contactAddedObserver: NSObjectProtocol?
 
-    private lazy var cancelButton: UIBarButtonItem = {
-        let button = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonPressed))
-        return button
+    private lazy var chatMemberIds: [Int] = {
+        if let chat = chat {
+            return chat.contactIds
+        }
+        return []
+    }()
+
+    private lazy var chat: DcChat? = {
+        if let chatId = self.chatId {
+            return dcContext.getChat(chatId: chatId)
+        }
+        return nil
     }()
 
+    private var chatId: Int?
+
     private lazy var newContactCell: ActionCell = {
         let cell = ActionCell()
         cell.actionColor = SystemColor.blue.uiColor
@@ -21,29 +48,31 @@ class AddGroupMembersViewController: GroupMembersViewController {
         return cell
     }()
 
-    private lazy var doneButton: UIBarButtonItem = {
-        let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonPressed))
+    private lazy var cancelButton: UIBarButtonItem = {
+        let button = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonPressed))
         return button
     }()
 
-    private lazy var chat: DcChat? = {
-        if let chatId = chatId {
-            return dcContext.getChat(chatId: chatId)
-        }
-        return nil
+    lazy var doneButton: UIBarButtonItem = {
+        let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonPressed))
+        return button
     }()
 
-    private lazy var chatMemberIds: [Int] = {
-        if let chat = chat {
-            return chat.contactIds
-        }
-        return []
-    }()
+    //add members of new group, no chat object yet
+    init(preselected: Set<Int>, isVerified: Bool) {
+        super.init()
+        isVerifiedGroup = isVerified
+        numberOfSections = sections.count
+        selectedContactIds = preselected
+    }
 
+    //add members of existing group
     init(chatId: Int) {
-        super.init()
         self.chatId = chatId
-        numberOfSections = 2
+        super.init()
+        isVerifiedGroup = chat?.isVerified ?? false
+        numberOfSections = sections.count
+        selectedContactIds = Set(dcContext.getChat(chatId: chatId).contactIds)
     }
 
     required init?(coder _: NSCoder) {
@@ -53,12 +82,11 @@ class AddGroupMembersViewController: GroupMembersViewController {
     // MARK: - lifecycle
     override func viewDidLoad() {
         super.viewDidLoad()
-
-        super.navigationItem.leftBarButtonItem = cancelButton
-        super.navigationItem.rightBarButtonItem = doneButton
         title = String.localized("group_add_members")
-        super.contactIds = loadMemberCandidates()
-        // Do any additional setup after loading the view.
+        navigationItem.rightBarButtonItem = doneButton
+        navigationItem.leftBarButtonItem = cancelButton
+        contactIds = loadMemberCandidates()
+
         let nc = NotificationCenter.default
         contactAddedObserver = nc.addObserver(
             forName: dcNotificationContactChanged,
@@ -82,6 +110,10 @@ class AddGroupMembersViewController: GroupMembersViewController {
         }
     }
 
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+    }
+
     override func viewWillDisappear(_: Bool) {
         if !isMovingFromParent {
             // a subview was added to the navigation stack, no action needed
@@ -94,70 +126,64 @@ class AddGroupMembersViewController: GroupMembersViewController {
         }
     }
 
+    @objc func cancelButtonPressed() {
+        navigationController?.popViewController(animated: true)
+    }
+
+    @objc func doneButtonPressed() {
+        if let onMembersSelected = onMembersSelected {
+            if isNewGroup {
+                selectedContactIds.insert(Int(DC_CONTACT_ID_SELF))
+            }
+            onMembersSelected(selectedContactIds)
+        }
+        navigationController?.popViewController(animated: true)
+    }
+
     override func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int {
-        switch section {
-        case sectionNewContact:
+        let sectionType = sections[section]
+        switch sectionType {
+        case .newContact:
             return 1
-        case sectionMemberList:
+        case .memberList:
             return numberOfRowsForContactList
-        default:
-            return 0
         }
     }
 
     override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
-        return indexPath.section == sectionMemberList ? ContactCell.cellHeight : UITableView.automaticDimension
+        let sectionType = sections[indexPath.section]
+        return sectionType == .memberList ? ContactCell.cellHeight : UITableView.automaticDimension
     }
 
     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
-        switch indexPath.section {
-        case sectionNewContact:
+        let sectionType = sections[indexPath.section]
+        switch sectionType {
+        case .newContact:
             return newContactCell
-        case sectionMemberList:
+        case .memberList:
             return updateContactCell(for: indexPath)
-        default:
-            return UITableViewCell(style: .default, reuseIdentifier: nil)
         }
     }
 
     override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
-        switch indexPath.section {
-        case sectionNewContact:
+        let sectionType = sections[indexPath.section]
+        switch sectionType {
+        case .newContact:
             tableView.deselectRow(at: indexPath, animated: true)
             showNewContactController()
-        case sectionMemberList:
+        case .memberList:
             didSelectContactCell(at: indexPath)
-        default:
-            fatalError("unexpected section selected in GroupMembersViewController")
         }
     }
 
     func loadMemberCandidates() -> [Int] {
         var flags: Int32 = 0
-        if let chat = chat, chat.isVerified {
+        if isVerifiedGroup {
             flags |= DC_GCL_VERIFIED_ONLY
         }
-        var contactIds = dcContext.getContacts(flags: flags)
-        let memberSet = Set(chatMemberIds)
-        contactIds.removeAll(where: { memberSet.contains($0)})
-        return Array(contactIds)
-    }
-
-    @objc func cancelButtonPressed() {
-        navigationController?.popViewController(animated: true)
-    }
-
-    @objc func doneButtonPressed() {
-        guard let chatId = chatId else {
-            return
-        }
-        for contactId in selectedContactIds {
-           _ = dcContext.addContactToChat(chatId: chatId, contactId: contactId)
-        }
-        navigationController?.popViewController(animated: true)
+        return dcContext.getContacts(flags: flags)
     }
 
-    // MARK: - coordinator
     private func showNewContactController() {
         let newContactController = NewContactController(dcContext: dcContext)
         newContactController.openChatOnSave = false

+ 12 - 0
deltachat-ios/Controller/GroupChatDetailViewController.swift

@@ -271,6 +271,18 @@ class GroupChatDetailViewController: UIViewController {
 
     private func showAddGroupMember(chatId: Int) {
         let groupMemberViewController = AddGroupMembersViewController(chatId: chatId)
+        groupMemberViewController.onMembersSelected = { [weak self] (memberIds: Set<Int>) -> Void in
+            guard let self = self else { return }
+            let chat = self.dcContext.getChat(chatId: chatId)
+            var chatMembersToRemove = chat.contactIds
+            chatMembersToRemove.removeAll(where: { memberIds.contains($0)})
+            for contactId in chatMembersToRemove {
+                _ = self.dcContext.removeContactFromChat(chatId: chatId, contactId: contactId)
+            }
+            for contactId in memberIds {
+                _ = self.dcContext.addContactToChat(chatId: chatId, contactId: contactId)
+            }
+        }
         navigationController?.pushViewController(groupMemberViewController, animated: true)
     }
 

+ 0 - 56
deltachat-ios/Controller/NewGroupAddMembersViewController.swift

@@ -1,56 +0,0 @@
-import UIKit
-import DcCore
-
-class NewGroupAddMembersViewController: GroupMembersViewController {
-    var onMembersSelected: ((Set<Int>) -> Void)?
-    let isVerifiedGroup: Bool
-
-    private lazy var cancelButton: UIBarButtonItem = {
-        let button = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonPressed))
-        return button
-    }()
-
-   lazy var doneButton: UIBarButtonItem = {
-       let button = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonPressed))
-       return button
-   }()
-
-    init(preselected: Set<Int>, isVerified: Bool) {
-        isVerifiedGroup = isVerified
-        super.init()
-        selectedContactIds = preselected
-    }
-
-    required init?(coder _: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
-    }
-
-    // MARK - lifecycle
-    override func viewDidLoad() {
-        super.viewDidLoad()
-        title = String.localized("group_add_members")
-        navigationItem.rightBarButtonItem = doneButton
-        navigationItem.leftBarButtonItem = cancelButton
-        contactIds = isVerifiedGroup ?
-            dcContext.getContacts(flags: DC_GCL_VERIFIED_ONLY) :
-            dcContext.getContacts(flags: 0)
-    }
-
-    override func viewWillAppear(_ animated: Bool) {
-        super.viewWillAppear(animated)
-    }
-
-    @objc func cancelButtonPressed() {
-        navigationController?.popViewController(animated: true)
-    }
-
-    @objc func doneButtonPressed() {
-        if let onMembersSelected = onMembersSelected {
-            selectedContactIds.insert(Int(DC_CONTACT_ID_SELF))
-            onMembersSelected(selectedContactIds)
-        } else {
-            navigationController?.popViewController(animated: true)
-        }
-    }
-
-}

+ 1 - 2
deltachat-ios/Controller/NewGroupController.swift

@@ -384,12 +384,11 @@ class NewGroupController: UITableViewController, MediaPickerDelegate {
     }
 
     private func showAddMembers(preselectedMembers: Set<Int>, isVerified: Bool) {
-        let newGroupController = NewGroupAddMembersViewController(preselected: preselectedMembers,
+        let newGroupController = AddGroupMembersViewController(preselected: preselectedMembers,
                                                                   isVerified: isVerified)
         newGroupController.onMembersSelected = { [weak self] (memberIds: Set<Int>) -> Void in
             guard let self = self else { return }
             self.updateGroupContactIdsOnListSelection(memberIds)
-            self.navigationController?.popViewController(animated: true)
         }
         navigationController?.pushViewController(newGroupController, animated: true)
     }