Swiftgram/TelegramUI/TelegramRootController.swift
Ilya Laktyushin 394b204f29 Cleanup
2018-11-23 23:00:27 +04:00

146 lines
6.0 KiB
Swift

import Foundation
import Display
import Postbox
import TelegramCore
import SwiftSignalKit
public final class TelegramRootController: NavigationController {
private let account: Account
public var rootTabController: TabBarController?
public var contactsController: ContactsController?
public var callListController: CallListController?
public var chatListController: ChatListController?
public var accountSettingsController: ViewController?
private var permissionsDisposable: Disposable?
private var presentationDataDisposable: Disposable?
private var presentationData: PresentationData
public init(account: Account) {
self.account = account
self.presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 }
super.init(mode: .automaticMasterDetail, theme: NavigationControllerTheme(presentationTheme: self.presentationData.theme))
//self.permissionsDisposable =
self.presentationDataDisposable = (account.telegramApplicationContext.presentationData
|> deliverOnMainQueue).start(next: { [weak self] presentationData in
if let strongSelf = self {
let previousTheme = strongSelf.presentationData.theme
strongSelf.presentationData = presentationData
if previousTheme !== presentationData.theme {
strongSelf.rootTabController?.updateTheme(navigationBarPresentationData: NavigationBarPresentationData(presentationData: presentationData), theme: TabBarControllerTheme(rootControllerTheme: presentationData.theme))
strongSelf.rootTabController?.statusBar.statusBarStyle = presentationData.theme.rootController.statusBar.style.style
}
}
})
}
required public init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
deinit {
self.permissionsDisposable?.dispose()
self.presentationDataDisposable?.dispose()
}
public func addRootControllers(showCallsTab: Bool) {
let tabBarController = TabBarController(navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData), theme: TabBarControllerTheme(rootControllerTheme: self.presentationData.theme))
let chatListController = ChatListController(account: self.account, groupId: nil, controlsHistoryPreload: true)
let callListController = CallListController(account: self.account, mode: .tab)
var controllers: [ViewController] = []
let contactsController = ContactsController(account: self.account)
controllers.append(contactsController)
if showCallsTab {
controllers.append(callListController)
}
controllers.append(chatListController)
let accountSettingsController = settingsController(account: self.account, accountManager: self.account.telegramApplicationContext.accountManager)
controllers.append(accountSettingsController)
tabBarController.setControllers(controllers, selectedIndex: controllers.count - 2)
self.contactsController = contactsController
self.callListController = callListController
self.chatListController = chatListController
self.accountSettingsController = accountSettingsController
self.rootTabController = tabBarController
self.pushViewController(tabBarController, animated: false)
}
public func updateRootControllers(showCallsTab: Bool) {
guard let rootTabController = self.rootTabController else {
return
}
var controllers: [ViewController] = []
controllers.append(self.contactsController!)
if showCallsTab {
controllers.append(self.callListController!)
}
controllers.append(self.chatListController!)
controllers.append(self.accountSettingsController!)
rootTabController.setControllers(controllers, selectedIndex: nil)
}
public func openChatsSearch() {
guard let rootTabController = self.rootTabController else {
return
}
self.popToRoot(animated: false)
if let index = rootTabController.controllers.index(where: { $0 is ChatListController}) {
rootTabController.selectedIndex = index
}
self.chatListController?.activateSearch()
}
public func openRootCompose() {
self.chatListController?.composePressed()
}
public func openRootCamera() {
guard let controller = self.viewControllers.last as? ViewController else {
return
}
presentedLegacyShortcutCamera(account: self.account, saveCapturedMedia: false, saveEditedPhotos: false, mediaGrouping: true, parentController: controller)
}
public func requestPermissions() {
guard let parentController = self.viewControllers.last as? ViewController else {
return
}
let account = self.account
let _ = (DeviceAccess.authorizationStatus(account: account, subject: .notifications)
|> take(1)
|> deliverOnMainQueue).start(next: { status in
if status != .allowed {
let controller = PermissionController(account: self.account)
controller.updateData(subject: .notifications, currentStatus: status, allow: {
switch status {
case .notDetermined:
account.telegramApplicationContext.applicationBindings.registerForNotifications()
case .denied:
account.telegramApplicationContext.applicationBindings.openSettings()
default:
break
}
})
parentController.present(controller, in: .window(.root))
}
})
}
}