浏览代码

add status-cell to contact-profile

B. Petersen 4 年之前
父节点
当前提交
45f909d232

+ 7 - 0
DcCore/DcCore/DC/Wrapper.swift

@@ -1154,6 +1154,13 @@ public class DcContact {
         return swiftString
     }
 
+    public var status: String {
+        guard let cString = dc_contact_get_status(contactPointer) else { return "" }
+        let swiftString = String(cString: cString)
+        dc_str_unref(cString)
+        return swiftString
+    }
+
     public var isVerified: Bool {
         return dc_contact_is_verified(contactPointer) > 0
     }

+ 11 - 0
deltachat-ios/Controller/ContactDetailViewController.swift

@@ -88,6 +88,12 @@ class ContactDetailViewController: UITableViewController {
         return cell
     }()
 
+    private lazy var statusCell: MultilineTextFieldCell = {
+        let cell = MultilineTextFieldCell(description: "",
+                                          multilineText: "",
+                                          placeholder: "")
+        return cell
+    }()
 
     init(dcContext: DcContext, contactId: Int) {
         self.viewModel = ContactDetailViewModel(dcContext: dcContext, contactId: contactId)
@@ -162,6 +168,8 @@ class ContactDetailViewController: UITableViewController {
             case .startChat:
                 return startChatCell
             }
+        case .statusArea:
+            return statusCell
         case .chatActions:
             switch viewModel.chatActionFor(row: row) {
             case .archiveChat:
@@ -188,6 +196,8 @@ class ContactDetailViewController: UITableViewController {
         switch type {
         case .chatOptions:
             handleChatOption(for: indexPath.row)
+        case .statusArea:
+            break
         case .chatActions:
             handleChatAction(for: indexPath.row)
         case .sharedChats:
@@ -238,6 +248,7 @@ class ContactDetailViewController: UITableViewController {
         ephemeralMessagesCell.detailTextLabel?.text = String.localized(viewModel.chatIsEphemeral ? "on" : "off")
         galleryCell.detailTextLabel?.text = String.numberOrNone(viewModel.galleryItemMessageIds.count)
         documentsCell.detailTextLabel?.text = String.numberOrNone(viewModel.documentItemMessageIds.count)
+        statusCell.setText(text: viewModel.contact.status)
     }
 
     // MARK: - actions

+ 14 - 3
deltachat-ios/ViewModel/ContactDetailViewModel.swift

@@ -7,6 +7,7 @@ class ContactDetailViewModel {
 
     enum ProfileSections {
         case chatOptions
+        case statusArea
         case sharedChats
         case chatActions
     }
@@ -28,6 +29,7 @@ class ContactDetailViewModel {
 
     var contactId: Int
 
+    // TODO: check if that is too inefficient (each bit read from contact, results in a database-query)
     var contact: DcContact {
         return DcContact(id: contactId)
     }
@@ -54,6 +56,12 @@ class ContactDetailViewModel {
         self.sharedChats = context.getChatlist(flags: 0, queryString: nil, queryId: contactId)
 
         sections.append(.chatOptions)
+
+        let dcContact = DcContact(id: contactId)
+        if !dcContact.status.isEmpty {
+            sections.append(.statusArea)
+        }
+
         if sharedChats.length > 0 && !isSavedMessages && !isDeviceTalk {
             sections.append(.sharedChats)
         }
@@ -132,6 +140,7 @@ class ContactDetailViewModel {
     func numberOfRowsInSection(_ section: Int) -> Int {
         switch sections[section] {
         case .chatOptions: return chatOptions.count
+        case .statusArea: return 1
         case .sharedChats: return sharedChats.length
         case .chatActions: return chatActions.count
         }
@@ -152,10 +161,12 @@ class ContactDetailViewModel {
     }
 
     func titleFor(section: Int) -> String? {
-        if sections[section] == .sharedChats {
-            return String.localized("profile_shared_chats")
+        switch sections[section] {
+        case .chatOptions: return nil
+        case .statusArea: return String.localized("pref_default_status_label")
+        case .sharedChats: return String.localized("profile_shared_chats")
+        case .chatActions: return nil
         }
-        return nil
     }
 
     // returns true if chat is archived after action