Fix screen lock handling

This commit is contained in:
Niels Andriesse 2021-05-06 10:36:58 +10:00
parent 86af5f1d99
commit 1a11476b85
19 changed files with 157 additions and 100 deletions

View File

@ -166,6 +166,7 @@
B8041AA725C90927003C2166 /* TypingIndicatorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8041AA625C90927003C2166 /* TypingIndicatorCell.swift */; }; B8041AA725C90927003C2166 /* TypingIndicatorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8041AA625C90927003C2166 /* TypingIndicatorCell.swift */; };
B80A579F23DFF1F300876683 /* NewClosedGroupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80A579E23DFF1F300876683 /* NewClosedGroupVC.swift */; }; B80A579F23DFF1F300876683 /* NewClosedGroupVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80A579E23DFF1F300876683 /* NewClosedGroupVC.swift */; };
B817AD9A26436593009DF825 /* SimplifiedConversationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B817AD9926436593009DF825 /* SimplifiedConversationCell.swift */; }; B817AD9A26436593009DF825 /* SimplifiedConversationCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B817AD9926436593009DF825 /* SimplifiedConversationCell.swift */; };
B817AD9C26436F73009DF825 /* ThreadPickerVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = B817AD9B26436F73009DF825 /* ThreadPickerVC.swift */; };
B81D25C426157F40004D1FE1 /* storage-seed-3.crt in Resources */ = {isa = PBXBuildFile; fileRef = B81D25B926157F20004D1FE1 /* storage-seed-3.crt */; }; B81D25C426157F40004D1FE1 /* storage-seed-3.crt in Resources */ = {isa = PBXBuildFile; fileRef = B81D25B926157F20004D1FE1 /* storage-seed-3.crt */; };
B81D25C526157F40004D1FE1 /* storage-seed-1.crt in Resources */ = {isa = PBXBuildFile; fileRef = B81D25B726157F20004D1FE1 /* storage-seed-1.crt */; }; B81D25C526157F40004D1FE1 /* storage-seed-1.crt in Resources */ = {isa = PBXBuildFile; fileRef = B81D25B726157F20004D1FE1 /* storage-seed-1.crt */; };
B81D25C626157F40004D1FE1 /* public-loki-foundation.crt in Resources */ = {isa = PBXBuildFile; fileRef = B81D25B826157F20004D1FE1 /* public-loki-foundation.crt */; }; B81D25C626157F40004D1FE1 /* public-loki-foundation.crt in Resources */ = {isa = PBXBuildFile; fileRef = B81D25B826157F20004D1FE1 /* public-loki-foundation.crt */; };
@ -1159,6 +1160,7 @@
B8041AA625C90927003C2166 /* TypingIndicatorCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypingIndicatorCell.swift; sourceTree = "<group>"; }; B8041AA625C90927003C2166 /* TypingIndicatorCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypingIndicatorCell.swift; sourceTree = "<group>"; };
B80A579E23DFF1F300876683 /* NewClosedGroupVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewClosedGroupVC.swift; sourceTree = "<group>"; }; B80A579E23DFF1F300876683 /* NewClosedGroupVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewClosedGroupVC.swift; sourceTree = "<group>"; };
B817AD9926436593009DF825 /* SimplifiedConversationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplifiedConversationCell.swift; sourceTree = "<group>"; }; B817AD9926436593009DF825 /* SimplifiedConversationCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimplifiedConversationCell.swift; sourceTree = "<group>"; };
B817AD9B26436F73009DF825 /* ThreadPickerVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThreadPickerVC.swift; sourceTree = "<group>"; };
B81D25B726157F20004D1FE1 /* storage-seed-1.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "storage-seed-1.crt"; sourceTree = "<group>"; }; B81D25B726157F20004D1FE1 /* storage-seed-1.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "storage-seed-1.crt"; sourceTree = "<group>"; };
B81D25B826157F20004D1FE1 /* public-loki-foundation.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "public-loki-foundation.crt"; sourceTree = "<group>"; }; B81D25B826157F20004D1FE1 /* public-loki-foundation.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "public-loki-foundation.crt"; sourceTree = "<group>"; };
B81D25B926157F20004D1FE1 /* storage-seed-3.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "storage-seed-3.crt"; sourceTree = "<group>"; }; B81D25B926157F20004D1FE1 /* storage-seed-3.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "storage-seed-3.crt"; sourceTree = "<group>"; };
@ -1992,6 +1994,7 @@
34480B341FD0929200BC14EF /* ShareAppExtensionContext.h */, 34480B341FD0929200BC14EF /* ShareAppExtensionContext.h */,
34480B351FD0929200BC14EF /* ShareAppExtensionContext.m */, 34480B351FD0929200BC14EF /* ShareAppExtensionContext.m */,
C3ADC66026426688005F1414 /* ShareVC.swift */, C3ADC66026426688005F1414 /* ShareVC.swift */,
B817AD9B26436F73009DF825 /* ThreadPickerVC.swift */,
B817AD9926436593009DF825 /* SimplifiedConversationCell.swift */, B817AD9926436593009DF825 /* SimplifiedConversationCell.swift */,
); );
path = SessionShareExtension; path = SessionShareExtension;
@ -4425,6 +4428,7 @@
C3ADC66126426688005F1414 /* ShareVC.swift in Sources */, C3ADC66126426688005F1414 /* ShareVC.swift in Sources */,
34641E1F2088DA6D00E2EDE5 /* SAEScreenLockViewController.m in Sources */, 34641E1F2088DA6D00E2EDE5 /* SAEScreenLockViewController.m in Sources */,
3461284B1FD0B94000532771 /* SAELoadViewController.swift in Sources */, 3461284B1FD0B94000532771 /* SAELoadViewController.swift in Sources */,
B817AD9C26436F73009DF825 /* ThreadPickerVC.swift in Sources */,
347850571FD86544007B8332 /* SAEFailedViewController.swift in Sources */, 347850571FD86544007B8332 /* SAEFailedViewController.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;

View File

@ -489,3 +489,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "QR-Code scannen"; "vc_qr_code_view_scan_qr_code_tab_title" = "QR-Code scannen";
"vc_qr_code_view_scan_qr_code_explanation" = "Scannen Sie den QR-Code einer Person, um ein Gespräch mit ihr zu beginnen."; "vc_qr_code_view_scan_qr_code_explanation" = "Scannen Sie den QR-Code einer Person, um ein Gespräch mit ihr zu beginnen.";
"vc_view_my_qr_code_explanation" = "Das ist Ihr QR-Code. Andere Benutzer können ihn scannen, um eine Session mit Ihnen zu starten."; "vc_view_my_qr_code_explanation" = "Das ist Ihr QR-Code. Andere Benutzer können ihn scannen, um eine Session mit Ihnen zu starten.";
"vc_share_title" = "Share to Session";

View File

@ -520,3 +520,4 @@
"modal_link_previews_title" = "Enable Link Previews?"; "modal_link_previews_title" = "Enable Link Previews?";
"modal_link_previews_explanation" = "Enabling link previews will show previews for URLs you send and receive. This can be useful, but Session will need to contact linked websites to generate previews. You can always disable link previews in Session's settings."; "modal_link_previews_explanation" = "Enabling link previews will show previews for URLs you send and receive. This can be useful, but Session will need to contact linked websites to generate previews. You can always disable link previews in Session's settings.";
"modal_link_previews_button_title" = "Enable"; "modal_link_previews_button_title" = "Enable";
"vc_share_title" = "Share to Session";

View File

@ -489,3 +489,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "Escanear código QR"; "vc_qr_code_view_scan_qr_code_tab_title" = "Escanear código QR";
"vc_qr_code_view_scan_qr_code_explanation" = "Escanea el código QR de una persona para comenzar una conversación con ella"; "vc_qr_code_view_scan_qr_code_explanation" = "Escanea el código QR de una persona para comenzar una conversación con ella";
"vc_view_my_qr_code_explanation" = "Este es tu código QR. Otros usuarios pueden escanearlo para empezar una Session contigo."; "vc_view_my_qr_code_explanation" = "Este es tu código QR. Otros usuarios pueden escanearlo para empezar una Session contigo.";
"vc_share_title" = "Share to Session";

View File

@ -489,3 +489,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "اسکن کد QR"; "vc_qr_code_view_scan_qr_code_tab_title" = "اسکن کد QR";
"vc_qr_code_view_scan_qr_code_explanation" = "برای شروع مکالمه با دیگران، کد QR شخصی را اسکن کنید"; "vc_qr_code_view_scan_qr_code_explanation" = "برای شروع مکالمه با دیگران، کد QR شخصی را اسکن کنید";
"vc_view_my_qr_code_explanation" = "این کد QR شماست. سایر کاربران می‌توانند برای شروع Session با شما آن را اسکن کنند."; "vc_view_my_qr_code_explanation" = "این کد QR شماست. سایر کاربران می‌توانند برای شروع Session با شما آن را اسکن کنند.";
"vc_share_title" = "Share to Session";

View File

@ -489,3 +489,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "Scanner le code QR"; "vc_qr_code_view_scan_qr_code_tab_title" = "Scanner le code QR";
"vc_qr_code_view_scan_qr_code_explanation" = "Scannez le code QR d'un autre utilisateur pour démarrer une session"; "vc_qr_code_view_scan_qr_code_explanation" = "Scannez le code QR d'un autre utilisateur pour démarrer une session";
"vc_view_my_qr_code_explanation" = "Ceci est votre code QR. Les autres utilisateurs peuvent le scanner pour démarrer une session avec vous."; "vc_view_my_qr_code_explanation" = "Ceci est votre code QR. Les autres utilisateurs peuvent le scanner pour démarrer une session avec vous.";
"vc_share_title" = "Share to Session";

View File

@ -490,3 +490,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "Pindai kode QR"; "vc_qr_code_view_scan_qr_code_tab_title" = "Pindai kode QR";
"vc_qr_code_view_scan_qr_code_explanation" = "Pindai kode QR pengguna lain untuk memulai percakapan"; "vc_qr_code_view_scan_qr_code_explanation" = "Pindai kode QR pengguna lain untuk memulai percakapan";
"vc_view_my_qr_code_explanation" = "Ini adalah kode QR anda. Pengguna lain bisa memindainya untuk memulai percakapan dengan anda"; "vc_view_my_qr_code_explanation" = "Ini adalah kode QR anda. Pengguna lain bisa memindainya untuk memulai percakapan dengan anda";
"vc_share_title" = "Share to Session";

View File

@ -489,3 +489,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "Scansiona il codice QR"; "vc_qr_code_view_scan_qr_code_tab_title" = "Scansiona il codice QR";
"vc_qr_code_view_scan_qr_code_explanation" = "Scansiona il codice QR di un utente per iniziare una conversazione con questa persona"; "vc_qr_code_view_scan_qr_code_explanation" = "Scansiona il codice QR di un utente per iniziare una conversazione con questa persona";
"vc_view_my_qr_code_explanation" = "Questo è il tuo codice QR. Altri utenti possono scansionarlo per iniziare una sessione con te."; "vc_view_my_qr_code_explanation" = "Questo è il tuo codice QR. Altri utenti possono scansionarlo per iniziare una sessione con te.";
"vc_share_title" = "Share to Session";

View File

@ -490,3 +490,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "QR コードをスキャンする"; "vc_qr_code_view_scan_qr_code_tab_title" = "QR コードをスキャンする";
"vc_qr_code_view_scan_qr_code_explanation" = "誰かの QR コードをスキャンして、会話を始めましょう"; "vc_qr_code_view_scan_qr_code_explanation" = "誰かの QR コードをスキャンして、会話を始めましょう";
"vc_view_my_qr_code_explanation" = "これはあなたの QR コードです。他のユーザーはそれをスキャンして、あなたとの Session を開始できます。"; "vc_view_my_qr_code_explanation" = "これはあなたの QR コードです。他のユーザーはそれをスキャンして、あなたとの Session を開始できます。";
"vc_share_title" = "Share to Session";

View File

@ -489,3 +489,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "Skanowania QR code"; "vc_qr_code_view_scan_qr_code_tab_title" = "Skanowania QR code";
"vc_qr_code_view_scan_qr_code_explanation" = "Zeskanuj czyjś kod QR, aby rozpocząć z nim rozmowę"; "vc_qr_code_view_scan_qr_code_explanation" = "Zeskanuj czyjś kod QR, aby rozpocząć z nim rozmowę";
"vc_view_my_qr_code_explanation" = "To jest twój kod QR. Inni użytkownicy mogą go zeskanować, aby rozpocząć z tobą sesję."; "vc_view_my_qr_code_explanation" = "To jest twój kod QR. Inni użytkownicy mogą go zeskanować, aby rozpocząć z tobą sesję.";
"vc_share_title" = "Share to Session";

View File

@ -489,3 +489,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "Escanear código QR"; "vc_qr_code_view_scan_qr_code_tab_title" = "Escanear código QR";
"vc_qr_code_view_scan_qr_code_explanation" = "Escaneie o código QR de alguém para iniciar uma conversa com essa pessoa"; "vc_qr_code_view_scan_qr_code_explanation" = "Escaneie o código QR de alguém para iniciar uma conversa com essa pessoa";
"vc_view_my_qr_code_explanation" = "Este é o seu código QR. Outros usuários podem escaneá-lo para iniciar uma sessão com você."; "vc_view_my_qr_code_explanation" = "Este é o seu código QR. Outros usuários podem escaneá-lo para iniciar uma sessão com você.";
"vc_share_title" = "Share to Session";

View File

@ -520,3 +520,4 @@
"modal_link_previews_title" = "Включить предварительный просмотр ссылок?"; "modal_link_previews_title" = "Включить предварительный просмотр ссылок?";
"modal_link_previews_explanation" = "Включение предпросмотра ссылок покажет превью для отправляемых и получаемых ссылок. Это может быть полезно, но Session нужно будет соединиться с сайтами, связанными с ссылками, чтобы сгенерировать предпросмотр. Вы всегда можете отключить предпросмотр ссылок в настройках Session."; "modal_link_previews_explanation" = "Включение предпросмотра ссылок покажет превью для отправляемых и получаемых ссылок. Это может быть полезно, но Session нужно будет соединиться с сайтами, связанными с ссылками, чтобы сгенерировать предпросмотр. Вы всегда можете отключить предпросмотр ссылок в настройках Session.";
"modal_link_previews_button_title" = "Включить"; "modal_link_previews_button_title" = "Включить";
"vc_share_title" = "Share to Session";

View File

@ -520,3 +520,4 @@
"modal_link_previews_title" = "Povoliť náhľad odkazov?"; "modal_link_previews_title" = "Povoliť náhľad odkazov?";
"modal_link_previews_explanation" = "Enabling link previews will show previews for URLs you send and receive. This can be useful, but Session will need to contact linked websites to generate previews. You can always disable link previews in Session's settings."; "modal_link_previews_explanation" = "Enabling link previews will show previews for URLs you send and receive. This can be useful, but Session will need to contact linked websites to generate previews. You can always disable link previews in Session's settings.";
"modal_link_previews_button_title" = "Povoliť"; "modal_link_previews_button_title" = "Povoliť";
"vc_share_title" = "Share to Session";

View File

@ -496,3 +496,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "Quét mã QR"; "vc_qr_code_view_scan_qr_code_tab_title" = "Quét mã QR";
"vc_qr_code_view_scan_qr_code_explanation" = "Quét mã QR của ai đó để bắt đầu trò chuyện với họ"; "vc_qr_code_view_scan_qr_code_explanation" = "Quét mã QR của ai đó để bắt đầu trò chuyện với họ";
"vc_view_my_qr_code_explanation" = "Đây là mã QR của bạn. Những người dùng khác có thể quét mã này và bắt đầu session với bạn."; "vc_view_my_qr_code_explanation" = "Đây là mã QR của bạn. Những người dùng khác có thể quét mã này và bắt đầu session với bạn.";
"vc_share_title" = "Share to Session";

View File

@ -489,3 +489,4 @@
"vc_qr_code_view_scan_qr_code_tab_title" = "扫描二维码"; "vc_qr_code_view_scan_qr_code_tab_title" = "扫描二维码";
"vc_qr_code_view_scan_qr_code_explanation" = "扫描对方的二维码以发起对话"; "vc_qr_code_view_scan_qr_code_explanation" = "扫描对方的二维码以发起对话";
"vc_view_my_qr_code_explanation" = "这是您的二维码。其他用户可以对其进行扫描以发起与您的对话。"; "vc_view_my_qr_code_explanation" = "这是您的二维码。其他用户可以对其进行扫描以发起与您的对话。";
"vc_share_title" = "Share to Session";

View File

@ -31,9 +31,6 @@
<constraint firstItem="Hvu-b1-e3Q" firstAttribute="centerX" secondItem="wbc-yd-nQP" secondAttribute="centerX" id="Vsx-JI-9HN"/> <constraint firstItem="Hvu-b1-e3Q" firstAttribute="centerX" secondItem="wbc-yd-nQP" secondAttribute="centerX" id="Vsx-JI-9HN"/>
</constraints> </constraints>
</view> </view>
<connections>
<outlet property="logoImageView" destination="Hvu-b1-e3Q" id="DfV-Fy-b7M"/>
</connections>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="CEy-Cv-SGf" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="CEy-Cv-SGf" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>

View File

@ -61,7 +61,7 @@ NS_ASSUME_NONNULL_BEGIN
// Title // Title
UILabel *titleLabel = [UILabel new]; UILabel *titleLabel = [UILabel new];
titleLabel.text = NSLocalizedString(@"Share to Session", @""); titleLabel.text = NSLocalizedString(@"vc_share_title", @"");
titleLabel.textColor = LKColors.text; titleLabel.textColor = LKColors.text;
titleLabel.font = [UIFont boldSystemFontOfSize:LKValues.veryLargeFontSize]; titleLabel.font = [UIFont boldSystemFontOfSize:LKValues.veryLargeFontSize];
self.navigationItem.titleView = titleLabel; self.navigationItem.titleView = titleLabel;

View File

@ -1,29 +1,7 @@
import SessionUIKit import SessionUIKit
final class ShareVC : UIViewController, UITableViewDataSource, AppModeManagerDelegate { final class ShareVC : UINavigationController, ShareViewDelegate, AppModeManagerDelegate {
@IBOutlet private var logoImageView: UIImageView!
private var areVersionMigrationsComplete = false private var areVersionMigrationsComplete = false
private var threads: YapDatabaseViewMappings!
private var threadViewModelCache: [String:ThreadViewModel] = [:] // Thread ID to ThreadViewModel
private var threadCount: UInt {
threads.numberOfItems(inGroup: TSInboxGroup)
}
private lazy var dbConnection: YapDatabaseConnection = {
let result = OWSPrimaryStorage.shared().newDatabaseConnection()
result.objectCacheLimit = 500
return result
}()
private lazy var tableView: UITableView = {
let result = UITableView()
result.backgroundColor = .clear
result.separatorStyle = .none
result.register(SimplifiedConversationCell.self, forCellReuseIdentifier: SimplifiedConversationCell.reuseIdentifier)
result.showsVerticalScrollIndicator = false
return result
}()
// MARK: Lifecycle // MARK: Lifecycle
override func loadView() { override func loadView() {
@ -136,7 +114,7 @@ final class ShareVC : UIViewController, UITableViewDataSource, AppModeManagerDel
AppVersion.sharedInstance().saeLaunchDidComplete() AppVersion.sharedInstance().saeLaunchDidComplete()
setUpViewHierarchy() showLockScreenOrMainContent()
// We don't need to use OWSMessageReceiver in the SAE. // We don't need to use OWSMessageReceiver in the SAE.
// We don't need to use OWSBatchMessageProcessor in the SAE. // We don't need to use OWSBatchMessageProcessor in the SAE.
@ -149,38 +127,14 @@ final class ShareVC : UIViewController, UITableViewDataSource, AppModeManagerDel
OWSReadReceiptManager.shared().prepareCachedValues() OWSReadReceiptManager.shared().prepareCachedValues()
} }
private func setUpViewHierarchy() { override func viewDidLoad() {
// Gradient super.viewDidLoad()
view.backgroundColor = .clear AppReadiness.runNowOrWhenAppDidBecomeReady { [weak self] in
let gradient = Gradients.defaultBackground AssertIsOnMainThread()
view.setGradient(gradient) guard let strongSelf = self else { return }
// Threads strongSelf.showLockScreenOrMainContent()
dbConnection.beginLongLivedReadTransaction() // Freeze the connection for use on the main thread (this gives us a stable data source that doesn't change until we tell it to)
threads = YapDatabaseViewMappings(groups: [ TSInboxGroup ], view: TSThreadDatabaseViewExtensionName) // The extension should be registered at this point
threads.setIsReversed(true, forGroup: TSInboxGroup)
dbConnection.read { transaction in
self.threads.update(with: transaction) // Perform the initial update
} }
// Logo
logoImageView.alpha = 0
// Fake nav bar
let fakeNavBar = UIView()
fakeNavBar.set(.height, to: 64)
view.addSubview(fakeNavBar)
fakeNavBar.pin([ UIView.HorizontalEdge.left, UIView.VerticalEdge.top, UIView.HorizontalEdge.right ], to: view)
let titleLabel = UILabel()
titleLabel.text = NSLocalizedString("share", comment: "")
titleLabel.font = .boldSystemFont(ofSize: Values.veryLargeFontSize)
fakeNavBar.addSubview(titleLabel)
titleLabel.center(in: fakeNavBar)
// Table view
tableView.dataSource = self
view.addSubview(tableView)
tableView.pin(.top, to: .bottom, of: fakeNavBar)
tableView.pin([ UIView.HorizontalEdge.left, UIView.HorizontalEdge.right, UIView.VerticalEdge.bottom ], to: view)
// Reload
reload()
} }
@objc @objc
@ -220,49 +174,38 @@ final class ShareVC : UIViewController, UITableViewDataSource, AppModeManagerDel
return // Not applicable to share extensions return // Not applicable to share extensions
} }
// MARK: Table View Data Source
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Int(threadCount)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: SimplifiedConversationCell.reuseIdentifier) as! SimplifiedConversationCell
cell.threadViewModel = threadViewModel(at: indexPath.row)
return cell
}
// MARK: Updating // MARK: Updating
private func reload() { private func showLockScreenOrMainContent() {
AssertIsOnMainThread() if OWSScreenLock.shared.isScreenLockEnabled() {
dbConnection.beginLongLivedReadTransaction() // Jump to the latest commit showLockScreen()
dbConnection.read { transaction in
self.threads.update(with: transaction)
}
threadViewModelCache.removeAll()
tableView.reloadData()
}
// MARK: Convenience
private func thread(at index: Int) -> TSThread? {
var thread: TSThread? = nil
dbConnection.read { transaction in
let ext = transaction.ext(TSThreadDatabaseViewExtensionName) as! YapDatabaseViewTransaction
thread = ext.object(atRow: UInt(index), inSection: 0, with: self.threads) as! TSThread?
}
return thread
}
private func threadViewModel(at index: Int) -> ThreadViewModel? {
guard let thread = thread(at: index) else { return nil }
if let cachedThreadViewModel = threadViewModelCache[thread.uniqueId!] {
return cachedThreadViewModel
} else { } else {
var threadViewModel: ThreadViewModel? = nil showMainContent()
dbConnection.read { transaction in
threadViewModel = ThreadViewModel(thread: thread, transaction: transaction)
}
threadViewModelCache[thread.uniqueId!] = threadViewModel
return threadViewModel
} }
} }
private func showLockScreen() {
let screenLockVC = SAEScreenLockViewController(shareViewDelegate: self)
setViewControllers([ screenLockVC ], animated: false)
}
private func showMainContent() {
let threadPickerVC = ThreadPickerVC()
setViewControllers([ threadPickerVC ], animated: false)
}
func shareViewWasUnlocked() {
showMainContent()
}
func shareViewWasCompleted() {
print("completed")
}
func shareViewWasCancelled() {
print("canceled")
}
func shareViewFailed(error: Error) {
print("failed")
}
} }

View File

@ -0,0 +1,99 @@
import SessionUIKit
final class ThreadPickerVC : UIViewController, UITableViewDataSource {
private var threads: YapDatabaseViewMappings!
private var threadViewModelCache: [String:ThreadViewModel] = [:] // Thread ID to ThreadViewModel
private var threadCount: UInt {
threads.numberOfItems(inGroup: TSInboxGroup)
}
private lazy var dbConnection: YapDatabaseConnection = {
let result = OWSPrimaryStorage.shared().newDatabaseConnection()
result.objectCacheLimit = 500
return result
}()
private lazy var tableView: UITableView = {
let result = UITableView()
result.backgroundColor = .clear
result.separatorStyle = .none
result.register(SimplifiedConversationCell.self, forCellReuseIdentifier: SimplifiedConversationCell.reuseIdentifier)
result.showsVerticalScrollIndicator = false
return result
}()
// MARK: Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
// Gradient
view.backgroundColor = .clear
let gradient = Gradients.defaultBackground
view.setGradient(gradient)
// Threads
dbConnection.beginLongLivedReadTransaction() // Freeze the connection for use on the main thread (this gives us a stable data source that doesn't change until we tell it to)
threads = YapDatabaseViewMappings(groups: [ TSInboxGroup ], view: TSThreadDatabaseViewExtensionName) // The extension should be registered at this point
threads.setIsReversed(true, forGroup: TSInboxGroup)
dbConnection.read { transaction in
self.threads.update(with: transaction) // Perform the initial update
}
// Title
let titleLabel = UILabel()
titleLabel.text = NSLocalizedString("vc_share_title", comment: "")
titleLabel.textColor = Colors.text
titleLabel.font = .boldSystemFont(ofSize: Values.veryLargeFontSize)
navigationItem.titleView = titleLabel
// Table view
tableView.dataSource = self
view.addSubview(tableView)
tableView.pin(to: view)
// Reload
reload()
}
// MARK: Table View Data Source
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Int(threadCount)
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: SimplifiedConversationCell.reuseIdentifier) as! SimplifiedConversationCell
cell.threadViewModel = threadViewModel(at: indexPath.row)
return cell
}
// MARK: Updating
private func reload() {
AssertIsOnMainThread()
dbConnection.beginLongLivedReadTransaction() // Jump to the latest commit
dbConnection.read { transaction in
self.threads.update(with: transaction)
}
threadViewModelCache.removeAll()
tableView.reloadData()
}
// MARK: Convenience
private func thread(at index: Int) -> TSThread? {
var thread: TSThread? = nil
dbConnection.read { transaction in
let ext = transaction.ext(TSThreadDatabaseViewExtensionName) as! YapDatabaseViewTransaction
thread = ext.object(atRow: UInt(index), inSection: 0, with: self.threads) as! TSThread?
}
return thread
}
private func threadViewModel(at index: Int) -> ThreadViewModel? {
guard let thread = thread(at: index) else { return nil }
if let cachedThreadViewModel = threadViewModelCache[thread.uniqueId!] {
return cachedThreadViewModel
} else {
var threadViewModel: ThreadViewModel? = nil
dbConnection.read { transaction in
threadViewModel = ThreadViewModel(thread: thread, transaction: transaction)
}
threadViewModelCache[thread.uniqueId!] = threadViewModel
return threadViewModel
}
}
}