diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 882595827..c489ce3fc 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -495,14 +495,20 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc // interacted with old UI which had cached the old value) // // By using an equality check on the interaction we avoid this odd behaviour - guard let index = viewItems.firstIndex(where: { $0.interaction == viewItem.interaction }), + guard + let index = viewItems.firstIndex(where: { $0.interaction == viewItem.interaction }), let cell = messagesTableView.cellForRow(at: IndexPath(row: index, section: 0)) as? VisibleMessageCell, - let snapshot = cell.bubbleView.snapshotView(afterScreenUpdates: false), contextMenuWindow == nil, - !ContextMenuVC.actions(for: viewItem, delegate: self).isEmpty else { return } + let snapshot = cell.bubbleView.snapshotView(afterScreenUpdates: false), + contextMenuWindow == nil, + !ContextMenuVC.actions(for: viewItem, delegate: self).isEmpty, + let keyWindow: UIWindow = UIApplication.shared.keyWindow + else { + return + } // Show the context menu if applicable UIImpactFeedbackGenerator(style: .heavy).impactOccurred() - let frame = cell.convert(cell.bubbleView.frame, to: UIApplication.shared.keyWindow!) + let frame = cell.convert(cell.bubbleView.frame, to: keyWindow) let window = ContextMenuWindow() let contextMenuVC = ContextMenuVC(snapshot: snapshot, viewItem: viewItem, frame: frame, delegate: self) { [weak self] in window.isHidden = true diff --git a/Session/Utilities/MockDataGenerator.swift b/Session/Utilities/MockDataGenerator.swift index dc5e2fcab..3c7fe65f1 100644 --- a/Session/Utilities/MockDataGenerator.swift +++ b/Session/Utilities/MockDataGenerator.swift @@ -66,15 +66,23 @@ enum MockDataGenerator { } } + // MARK: - Generation + + static var printProgress: Bool = false + static var hasStartedGenerationThisRun: Bool = false + static func generateMockData() { // Don't re-generate the mock data if it already exists var existingMockDataThread: TSContactThread? - + Storage.read { transaction in existingMockDataThread = TSContactThread.getWithContactSessionID("MockDatabaseThread", transaction: transaction) } - guard existingMockDataThread == nil else { return } + guard !hasStartedGenerationThisRun && existingMockDataThread == nil else { + hasStartedGenerationThisRun = true + return + } /// The mock data generation is quite slow, there are 3 parts which take a decent amount of time (deleting the account afterwards will also take a long time): /// Generating the threads & content - ~3s per 100 @@ -83,33 +91,48 @@ enum MockDataGenerator { let dmThreadCount: Int = 100 let closedGroupThreadCount: Int = 0 let openGroupThreadCount: Int = 0 - let maxMessagesPerThread: Int = 50 + let messageRangePerThread: [ClosedRange] = [(0...50)] let dmRandomSeed: Int = 1111 let cgRandomSeed: Int = 2222 let ogRandomSeed: Int = 3333 + let openGroupBaseUrl: String = "https://chat.lokinet.dev" + let logProgress: (String, String) -> () = { title, event in + guard printProgress else { return } + + print("[MockDataGenerator] (\(Date().timeIntervalSince1970)) \(title) - \(event)") + } + + hasStartedGenerationThisRun = true // FIXME: Make sure this data doesn't go off device somehow? Storage.shared.write { anyTransaction in - guard let transaction: YapDatabaseReadWriteTransaction = anyTransaction as? YapDatabaseReadWriteTransaction else { return } + guard let transaction: YapDatabaseReadWriteTransaction = anyTransaction as? YapDatabaseReadWriteTransaction else { + return + } // First create the thread used to indicate that the mock data has been generated + logProgress("", "Start") _ = TSContactThread.getOrCreateThread(withContactSessionID: "MockDatabaseThread", transaction: transaction) // Multiple spaces to make it look more like words let stringContent: [String] = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 ".map { String($0) } + let wordContent: [String] = ["alias", "consequatur", "aut", "perferendis", "sit", "voluptatem", "accusantium", "doloremque", "aperiam", "eaque", "ipsa", "quae", "ab", "illo", "inventore", "veritatis", "et", "quasi", "architecto", "beatae", "vitae", "dicta", "sunt", "explicabo", "aspernatur", "aut", "odit", "aut", "fugit", "sed", "quia", "consequuntur", "magni", "dolores", "eos", "qui", "ratione", "voluptatem", "sequi", "nesciunt", "neque", "dolorem", "ipsum", "quia", "dolor", "sit", "amet", "consectetur", "adipisci", "velit", "sed", "quia", "non", "numquam", "eius", "modi", "tempora", "incidunt", "ut", "labore", "et", "dolore", "magnam", "aliquam", "quaerat", "voluptatem", "ut", "enim", "ad", "minima", "veniam", "quis", "nostrum", "exercitationem", "ullam", "corporis", "nemo", "enim", "ipsam", "voluptatem", "quia", "voluptas", "sit", "suscipit", "laboriosam", "nisi", "ut", "aliquid", "ex", "ea", "commodi", "consequatur", "quis", "autem", "vel", "eum", "iure", "reprehenderit", "qui", "in", "ea", "voluptate", "velit", "esse", "quam", "nihil", "molestiae", "et", "iusto", "odio", "dignissimos", "ducimus", "qui", "blanditiis", "praesentium", "laudantium", "totam", "rem", "voluptatum", "deleniti", "atque", "corrupti", "quos", "dolores", "et", "quas", "molestias", "excepturi", "sint", "occaecati", "cupiditate", "non", "provident", "sed", "ut", "perspiciatis", "unde", "omnis", "iste", "natus", "error", "similique", "sunt", "in", "culpa", "qui", "officia", "deserunt", "mollitia", "animi", "id", "est", "laborum", "et", "dolorum", "fuga", "et", "harum", "quidem", "rerum", "facilis", "est", "et", "expedita", "distinctio", "nam", "libero", "tempore", "cum", "soluta", "nobis", "est", "eligendi", "optio", "cumque", "nihil", "impedit", "quo", "porro", "quisquam", "est", "qui", "minus", "id", "quod", "maxime", "placeat", "facere", "possimus", "omnis", "voluptas", "assumenda", "est", "omnis", "dolor", "repellendus", "temporibus", "autem", "quibusdam", "et", "aut", "consequatur", "vel", "illum", "qui", "dolorem", "eum", "fugiat", "quo", "voluptas", "nulla", "pariatur", "at", "vero", "eos", "et", "accusamus", "officiis", "debitis", "aut", "rerum", "necessitatibus", "saepe", "eveniet", "ut", "et", "voluptates", "repudiandae", "sint", "et", "molestiae", "non", "recusandae", "itaque", "earum", "rerum", "hic", "tenetur", "a", "sapiente", "delectus", "ut", "aut", "reiciendis", "voluptatibus", "maiores", "doloribus", "asperiores", "repellat"] let timestampNow: TimeInterval = Date().timeIntervalSince1970 let userSessionId: String = getUserHexEncodedPublicKey() // MARK: - -- DM Thread var dmThreadRandomGenerator: ARC4RandomNumberGenerator = ARC4RandomNumberGenerator(seed: dmRandomSeed) + logProgress("DM Threads", "Start Generating \(dmThreadCount) threads") (0.. [Promise] { var promises: [Promise] = [] - let servers = Set(Storage.shared.getAllV2OpenGroups().values.map { $0.server }) + let servers = Set(Storage.shared.getAllOpenGroups().values.map { $0.server }) servers.forEach { server in - let poller = OpenGroupPollerV2(for: server) + let poller = OpenGroupAPI.Poller(for: server) let promise = poller.poll().timeout(seconds: 20, timeoutError: NotificationServiceError.timeout) promises.append(promise) }