浏览代码

add 'last seen' line to contact profile (#1402)

bjoern 3 年之前
父节点
当前提交
0ce652fdbe

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

@@ -1249,6 +1249,10 @@ public class DcContact {
         return swiftString
     }
 
+    public var lastSeen: Int64 {
+        return Int64(dc_contact_get_last_seen(contactPointer))
+    }
+
     public var status: String {
         guard let cString = dc_contact_get_status(contactPointer) else { return "" }
         let swiftString = String(cString: cString)

+ 13 - 4
DcCore/DcCore/Helper/DateUtils.swift

@@ -32,16 +32,24 @@ public class DateUtils {
 
     public static func getExtendedRelativeTimeSpanString(timeStamp: Double) -> String {
         let seconds = getRelativeTimeInSeconds(timeStamp: timeStamp)
-        let date = Date(timeIntervalSince1970: timeStamp)
-        let formatter = getLocalDateFormatter()
-        let is24h = is24hDefault()
 
         if seconds < DtU.minute {
             return String.localized("now")
         } else if seconds < DtU.hour {
             let mins = seconds / DtU.minute
             return String.localized(stringID: "n_minutes", count: Int(mins))
-        } else if seconds < DtU.day {
+        } else {
+            return getExtendedAbsTimeSpanString(timeStamp: timeStamp)
+        }
+    }
+
+    public static func getExtendedAbsTimeSpanString(timeStamp: Double) -> String {
+        let seconds = getRelativeTimeInSeconds(timeStamp: timeStamp)
+        let date = Date(timeIntervalSince1970: timeStamp)
+        let formatter = getLocalDateFormatter()
+        let is24h = is24hDefault()
+
+        if seconds < DtU.day {
             formatter.dateFormat = is24h ?  "HH:mm" : "hh:mm a"
             return formatter.string(from: date)
         } else if seconds < 6 * DtU.day {
@@ -56,6 +64,7 @@ public class DateUtils {
         }
     }
 
+
     public static func getBriefRelativeTimeSpanString(timeStamp: Double) -> String {
         let seconds = getRelativeTimeInSeconds(timeStamp: timeStamp)
         let date = Date(timeIntervalSince1970: timeStamp)

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

@@ -244,6 +244,10 @@ class ContactDetailViewController: UITableViewController {
         return viewModel.titleFor(section: section)
     }
 
+    override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
+        return viewModel.footerFor(section: section)
+    }
+
     // MARK: - observers
     private func setupObservers() {
         let nc = NotificationCenter.default

+ 18 - 1
deltachat-ios/ViewModel/ContactDetailViewModel.swift

@@ -39,6 +39,7 @@ class ContactDetailViewModel {
     let chatId: Int
     var isSavedMessages: Bool
     var isDeviceTalk: Bool
+    var lastSeen: Int64
     private var sharedChats: DcChatlist
     private var sections: [ProfileSections] = []
     private var chatActions: [ChatAction] = []
@@ -59,8 +60,9 @@ class ContactDetailViewModel {
 
         sections.append(.chatOptions)
 
+        let dcContact = context.getContact(id: contactId)
+        self.lastSeen = dcContact.lastSeen
         if !self.isSavedMessages {
-            let dcContact = context.getContact(id: contactId)
             if !dcContact.status.isEmpty {
                 sections.append(.statusArea)
             }
@@ -187,6 +189,21 @@ class ContactDetailViewModel {
         }
     }
 
+    func footerFor(section: Int) -> String? {
+        switch sections[section] {
+        case .chatOptions:
+            if lastSeen == 0 {
+                return String.localized("last_seen_unknown")
+            } else {
+                return String.localizedStringWithFormat(String.localized("last_seen_at"), DateUtils.getExtendedAbsTimeSpanString(timeStamp: Double(lastSeen)))
+            }
+
+        case .statusArea: return nil
+        case .sharedChats: return nil
+        case .chatActions: return nil
+        }
+    }
+
     // returns true if chat is archived after action
     func toggleArchiveChat() -> Bool {
         if chatId == 0 {