From cdd2bafe40c7aaf30c27f6d46bba8461f6f6a323 Mon Sep 17 00:00:00 2001 From: Kylmakalle Date: Tue, 18 Feb 2025 00:45:53 +0200 Subject: [PATCH] Pro --- Swiftgram/SGDebugUI/Sources/SGDebugUI.swift | 914 +----------------- Swiftgram/SGKeychainBackupManager/BUILD | 17 + .../Sources/SGKeychainBackupManager.swift | 131 +++ Swiftgram/SGPayWall/Sources/SGPayWall.swift | 82 +- Swiftgram/SGProUI/BUILD | 41 + .../Sources/MessageFilterController.swift | 181 ++++ Swiftgram/SGProUI/Sources/SGProUI.swift | 159 +++ .../Sources/SessionBackupController.swift | 520 ++++++++++ .../SwiftgramPro.imageset/Contents.json | 13 + .../SwiftgramPro.imageset/SwiftgramPro.pdf | Bin 0 -> 82179 bytes .../Sources/SimpleSettings.swift | 10 +- .../Strings/en.lproj/SGLocalizable.strings | 71 ++ Telegram/BUILD | 5 +- .../Sources/NotificationService.swift | 57 +- .../SGDucky.alticon/SGDucky@2x.png | Bin 0 -> 10153 bytes .../SGDucky.alticon/SGDucky@3x.png | Bin 0 -> 16518 bytes .../Telegram-iOS/SGGold.alticon/SGGold@2x.png | Bin 0 -> 14070 bytes .../Telegram-iOS/SGGold.alticon/SGGold@3x.png | Bin 0 -> 28501 bytes .../Telegram-iOS/SGPro.alticon/SGPro@2x.png | Bin 0 -> 13753 bytes .../Telegram-iOS/SGPro.alticon/SGPro@3x.png | Bin 0 -> 28884 bytes .../Sources/AccountContext.swift | 4 + .../AccountUtils/Sources/AccountUtils.swift | 2 +- .../AttachmentTextInputPanelNode.swift | 8 +- .../Themes/ThemeSettingsAppIconItem.swift | 11 +- .../Themes/ThemeSettingsController.swift | 13 +- .../Sources/PresentationData.swift | 4 +- .../PresentationResourcesSettings.swift | 1 + submodules/TelegramUI/BUILD | 4 +- .../Sources/ChatMessageItemView.swift | 2 +- .../Sources/MessageInputPanelComponent.swift | 12 +- .../Sources/PeerInfoScreen.swift | 17 +- .../TelegramUI/Sources/AppDelegate.swift | 4 + .../Sources/ChatTextInputPanelNode.swift | 6 +- .../Sources/SharedAccountContext.swift | 41 + 34 files changed, 1349 insertions(+), 981 deletions(-) create mode 100644 Swiftgram/SGKeychainBackupManager/BUILD create mode 100644 Swiftgram/SGKeychainBackupManager/Sources/SGKeychainBackupManager.swift create mode 100644 Swiftgram/SGProUI/BUILD create mode 100644 Swiftgram/SGProUI/Sources/MessageFilterController.swift create mode 100644 Swiftgram/SGProUI/Sources/SGProUI.swift create mode 100644 Swiftgram/SGProUI/Sources/SessionBackupController.swift create mode 100644 Swiftgram/SGSettingsUI/Images.xcassets/SwiftgramPro.imageset/Contents.json create mode 100644 Swiftgram/SGSettingsUI/Images.xcassets/SwiftgramPro.imageset/SwiftgramPro.pdf create mode 100644 Telegram/Telegram-iOS/SGDucky.alticon/SGDucky@2x.png create mode 100644 Telegram/Telegram-iOS/SGDucky.alticon/SGDucky@3x.png create mode 100644 Telegram/Telegram-iOS/SGGold.alticon/SGGold@2x.png create mode 100644 Telegram/Telegram-iOS/SGGold.alticon/SGGold@3x.png create mode 100644 Telegram/Telegram-iOS/SGPro.alticon/SGPro@2x.png create mode 100644 Telegram/Telegram-iOS/SGPro.alticon/SGPro@3x.png diff --git a/Swiftgram/SGDebugUI/Sources/SGDebugUI.swift b/Swiftgram/SGDebugUI/Sources/SGDebugUI.swift index 33b3592212..0892d813fa 100644 --- a/Swiftgram/SGDebugUI/Sources/SGDebugUI.swift +++ b/Swiftgram/SGDebugUI/Sources/SGDebugUI.swift @@ -20,813 +20,6 @@ import OverlayStatusController #if DEBUG import FLEX #endif -import Security - - -let BACKUP_SERVICE: String = "\(Bundle.main.bundleIdentifier!).sessionsbackup" - -enum KeychainError: Error { - case duplicateEntry - case unknown(OSStatus) - case itemNotFound - case invalidItemFormat -} - -class KeychainBackupManager { - static let shared = KeychainBackupManager() - private let service = "\(Bundle.main.bundleIdentifier!).sessionsbackup" - - private init() {} - - // MARK: - Save Credentials - func saveSession(id: String, _ session: Data) throws { - // Create query dictionary - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrService as String: service, - kSecAttrAccount as String: id, - kSecValueData as String: session, - kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked - ] - - // Add to keychain - let status = SecItemAdd(query as CFDictionary, nil) - - if status == errSecDuplicateItem { - // Item already exists, update it - let updateQuery: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrService as String: service, - kSecAttrAccount as String: id - ] - - let attributesToUpdate: [String: Any] = [ - kSecValueData as String: session - ] - - let updateStatus = SecItemUpdate(updateQuery as CFDictionary, - attributesToUpdate as CFDictionary) - - if updateStatus != errSecSuccess { - throw KeychainError.unknown(updateStatus) - } - } else if status != errSecSuccess { - throw KeychainError.unknown(status) - } - } - - // MARK: - Retrieve Credentials - func retrieveSession(for id: String) throws -> Data { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrService as String: service, - kSecAttrAccount as String: id, - kSecReturnData as String: true - ] - - var result: AnyObject? - let status = SecItemCopyMatching(query as CFDictionary, &result) - - guard status == errSecSuccess, let sessionData = result as? Data else { - throw KeychainError.itemNotFound - } - - return sessionData - } - - // MARK: - Delete Credentials - func deleteSession(for id: String) throws { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrService as String: service, - kSecAttrAccount as String: id - ] - - let status = SecItemDelete(query as CFDictionary) - - if status != errSecSuccess && status != errSecItemNotFound { - throw KeychainError.unknown(status) - } - } - - // MARK: - Retrieve All Accounts - func getAllSessons() throws -> [Data] { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrService as String: service, - kSecReturnData as String: true, - kSecMatchLimit as String: kSecMatchLimitAll - ] - - var result: AnyObject? - let status = SecItemCopyMatching(query as CFDictionary, &result) - - if status == errSecItemNotFound { - return [] - } - - guard status == errSecSuccess, - let credentialsDataArray = result as? [Data] else { - throw KeychainError.unknown(status) - } - - return credentialsDataArray - } - - // MARK: - Delete All Sessions - func deleteAllSessions() throws { - let query: [String: Any] = [ - kSecClass as String: kSecClassGenericPassword, - kSecAttrService as String: service - ] - - let status = SecItemDelete(query as CFDictionary) - - // If no items were found, that's fine - just return - if status == errSecItemNotFound { - return - } - - // For any other error, throw - if status != errSecSuccess { - throw KeychainError.unknown(status) - } - } -} - -struct SessionBackup: Codable { - var name: String? = nil - var date: Date = Date() - let accountRecord: AccountRecord - - var peerIdInternal: Int64 { - var userId: Int64 = 0 - for attribute in accountRecord.attributes { - if case let .backupData(backupData) = attribute, let backupPeerID = backupData.data?.peerId { - userId = backupPeerID - break - } - } - return userId - } - - var userId: Int64 { - return PeerId(peerIdInternal).id._internalGetInt64Value() - } -} - -import SwiftUI -import SGSwiftUI -import LegacyUI -import SGStrings - - -@available(iOS 13.0, *) -struct SessionBackupRow: View { - let backup: SessionBackup - let isLoggedIn: Bool - - - private let dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateStyle = .short - formatter.timeStyle = .short - return formatter - }() - - var formattedDate: String { - if #available(iOS 15.0, *) { - return backup.date.formatted(date: .abbreviated, time: .shortened) - } else { - return dateFormatter.string(from: backup.date) - } - } - - var body: some View { - HStack { - VStack(alignment: .leading, spacing: 2) { - Text(backup.name ?? String(backup.userId)) - .font(.body) - - Text("ID: \(backup.userId)") - .font(.subheadline) - .foregroundColor(.secondary) - - Text("Last Backup: \(formattedDate)") - .font(.caption) - .foregroundColor(.secondary) - } - - Spacer() - - Text(isLoggedIn ? "Logged In" : "Logged Out") - .font(.caption) - .foregroundColor(.secondary) - .padding(.horizontal, 6) - .padding(.vertical, 2) - .background(Color.secondary.opacity(0.1)) - .cornerRadius(4) - } - .padding(.vertical, 4) - } -} - - -@available(iOS 13.0, *) -struct BorderedButtonStyle: ButtonStyle { - func makeBody(configuration: Configuration) -> some View { - configuration.label - .background( - RoundedRectangle(cornerRadius: 8) - .stroke(Color.accentColor, lineWidth: 1) - ) - .opacity(configuration.isPressed ? 0.7 : 1.0) - } -} - -@available(iOS 13.0, *) -struct SessionBackupManagerView: View { - weak var wrapperController: LegacyController? - let context: AccountContext - - @State private var sessions: [SessionBackup] = [] - @State private var loggedInPeerIDs: [Int64] = [] - @State private var loggedInAccountsDisposable: Disposable? = nil - - private func performBackup() { - let controller = OverlayStatusController(theme: context.sharedContext.currentPresentationData.with { $0 }.theme, type: .loading(cancelled: nil)) - - let signal = context.sharedContext.accountManager.accountRecords() - |> take(1) - |> deliverOnMainQueue - - let signal2 = context.sharedContext.activeAccountsWithInfo - |> take(1) - |> deliverOnMainQueue - - wrapperController?.present(controller, in: .window(.root), with: nil) - - Task { - if let result = try? await combineLatest(signal, signal2).awaitable() { - let (view, accountsWithInfo) = result - backupSessionsFromView(view, accountsWithInfo: accountsWithInfo.1) - withAnimation { - sessions = getBackedSessions() - } - controller.dismiss() - } - } - - } - - private func performRestore() { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) - - let _ = (context.sharedContext.accountManager.accountRecords() - |> take(1) - |> deliverOnMainQueue).start(next: { [weak controller] view in - - let backupSessions = getBackedSessions() - var restoredSessions: Int64 = 0 - - func importNextBackup(index: Int) { - // Check if we're done - if index >= backupSessions.count { - // All done, update UI - withAnimation { - sessions = getBackedSessions() - } - controller?.dismiss() - wrapperController?.present( - okUndoController("OK: \(restoredSessions) Sessions restored", presentationData), - in: .current - ) - return - } - - let backup = backupSessions[index] - - // Check for existing record - let existingRecord = view.records.first { record in - var userId: Int64 = 0 - for attribute in record.attributes { - if case let .backupData(backupData) = attribute { - userId = backupData.data?.peerId ?? 0 - } - } - return userId == backup.peerIdInternal - } - - if existingRecord != nil { - print("Record \(backup.userId) already exists, skipping") - importNextBackup(index: index + 1) - return - } - - var importAttributes = backup.accountRecord.attributes - importAttributes.removeAll { attribute in - if case .sortOrder = attribute { - return true - } - return false - } - - let importBackupSignal = context.sharedContext.accountManager.transaction { transaction -> Void in - let nextSortOrder = (transaction.getRecords().map({ record -> Int32 in - for attribute in record.attributes { - if case let .sortOrder(sortOrder) = attribute { - return sortOrder.order - } - } - return 0 - }).max() ?? 0) + 1 - importAttributes.append(.sortOrder(AccountSortOrderAttribute(order: nextSortOrder))) - let accountRecordId = transaction.createRecord(importAttributes) - print("Imported record \(accountRecordId) for \(backup.userId)") - restoredSessions += 1 - } - |> deliverOnMainQueue - - let _ = importBackupSignal.start(completed: { - importNextBackup(index: index + 1) - }) - } - - // Start the import chain - importNextBackup(index: 0) - }) - - wrapperController?.present(controller, in: .window(.root), with: nil) - } - - private func performDeleteAll() { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - - let controller = textAlertController(context: context, title: "Delete All Backups?", text: "All sessions will be removed from Keychain.\n\nAccounts will not be logged out from Swiftgram.", actions: [ - TextAlertAction(type: .destructiveAction, title: presentationData.strings.Common_Delete, action: { - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) - wrapperController?.present(controller, in: .window(.root), with: nil) - do { - try KeychainBackupManager.shared.deleteAllSessions() - withAnimation { - sessions = getBackedSessions() - } - controller.dismiss() - } catch let e { - print("Error deleting all sessions: \(e)") - } - }), - TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}) - ]) - - wrapperController?.present(controller, in: .window(.root), with: nil) - } - - private func performDelete(_ session: SessionBackup) { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - - let controller = textAlertController(context: context, title: "Delete 1 Backup?", text: "\(session.name ?? "\(session.userId)") session will be removed from Keychain.\n\nAccount will not be logged out from Swiftgram.", actions: [ - TextAlertAction(type: .destructiveAction, title: presentationData.strings.Common_Delete, action: { - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) - wrapperController?.present(controller, in: .window(.root), with: nil) - do { - try KeychainBackupManager.shared.deleteSession(for: "\(session.peerIdInternal)") - withAnimation { - sessions = getBackedSessions() - } - controller.dismiss() - } catch let e { - print("Error deleting session: \(e)") - } - }), - TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}) - ]) - - wrapperController?.present(controller, in: .window(.root), with: nil) - } - - - #if DEBUG - private func performRemoveSessionFromApp(session: SessionBackup) { - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - - let controller = textAlertController(context: context, title: "Remove session from App?", text: "\(session.name ?? "\(session.userId)") session will be removed from app? Account WILL BE logged out of Swiftgram.", actions: [ - TextAlertAction(type: .destructiveAction, title: presentationData.strings.Common_Delete, action: { - let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) - wrapperController?.present(controller, in: .window(.root), with: nil) - - let signal = context.sharedContext.accountManager.accountRecords() - |> take(1) - |> deliverOnMainQueue - - let _ = signal.start(next: { [weak controller] view in - - // Find record to delete - let accountRecord = view.records.first { record in - var userId: Int64 = 0 - for attribute in record.attributes { - if case let .backupData(backupData) = attribute { - userId = backupData.data?.peerId ?? 0 - } - } - return userId == session.peerIdInternal - } - - if let record = accountRecord { - let deleteSignal = context.sharedContext.accountManager.transaction { transaction -> Void in - transaction.updateRecord(record.id, { _ in return nil}) - } - |> deliverOnMainQueue - - let _ = deleteSignal.start(next: { - withAnimation { - sessions = getBackedSessions() - } - controller?.dismiss() - }) - } else { - controller?.dismiss() - } - }) - - }), - TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}) - ]) - - wrapperController?.present(controller, in: .window(.root), with: nil) - } - #endif - - - var body: some View { - List { - Section(header: Text("Actions")) { - Button(action: performBackup) { - HStack { - Image(systemName: "key.fill") - .frame(width: 30) - Text("Backup to Keychain") - Spacer() - } - } - - Button(action: performRestore) { - HStack { - Image(systemName: "arrow.2.circlepath") - .frame(width: 30) - Text("Restore from Keychain") - Spacer() - } - } - - Button(action: performDeleteAll) { - HStack { - Image(systemName: "trash") - .frame(width: 30) - Text("Delete Keychain Backup") - } - } - .foregroundColor(.red) -// Text("Removing sessions from Keychain. This will not affect logged-in accounts.") -// .font(.caption) - } - - Section(header: Text("Backups")) { - ForEach(sessions, id: \.peerIdInternal) { session in - SessionBackupRow( - backup: session, - isLoggedIn: loggedInPeerIDs.contains(session.peerIdInternal) - ) - .contextMenu { - Button(action: { - performDelete(session) - }, label: { - HStack(spacing: 4) { - Text("Delete from Backup") - Image(systemName: "trash") - } - }) - #if DEBUG - Button(action: { - performRemoveSessionFromApp(session: session) - }, label: { - - HStack(spacing: 4) { - Text("Remove from App") - Image(systemName: "trash") - } - }) - #endif - } - } -// .onDelete { indexSet in -// performDelete(indexSet) -// } - } - } - .onAppear { - withAnimation { - sessions = getBackedSessions() - } - - let accountsSignal = context.sharedContext.accountManager.accountRecords() - |> deliverOnMainQueue - - loggedInAccountsDisposable = accountsSignal.start(next: { view in - var result: [Int64] = [] - for record in view.records { - var isLoggedOut: Bool = false - var userId: Int64 = 0 - for attribute in record.attributes { - if case .loggedOut = attribute { - isLoggedOut = true - } else if case let .backupData(backupData) = attribute { - userId = backupData.data?.peerId ?? 0 - } - } - - if !isLoggedOut && userId != 0 { - result.append(userId) - } - } - - print("Will check logged in accounts") - if loggedInPeerIDs != result { - print("Updating logged in accounts", result) - loggedInPeerIDs = result - } - }) - - } - .onDisappear { - loggedInAccountsDisposable?.dispose() - } - } - -} - - -func getBackedSessions() -> [SessionBackup] { - var sessions: [SessionBackup] = [] - do { - let backupSessionsData = try KeychainBackupManager.shared.getAllSessons() - for sessionBackupData in backupSessionsData { - do { - let backup = try JSONDecoder().decode(SessionBackup.self, from: sessionBackupData) - sessions.append(backup) - } catch let e { - print("IMPORT ERROR: \(e)") - } - } - } catch let e { - print("Error getting all sessions: \(e)") - } - return sessions -} - - -func backupSessionsFromView(_ view: AccountRecordsView, accountsWithInfo: [AccountWithInfo] = []) { - var recordsToBackup: [Int64: AccountRecord] = [:] - for record in view.records { - var sortOrder: Int32 = 0 - var isLoggedOut: Bool = false - var isTestingEnvironment: Bool = false - var peerId: Int64 = 0 - for attribute in record.attributes { - if case let .sortOrder(value) = attribute { - sortOrder = value.order - } else if case .loggedOut = attribute { - isLoggedOut = true - } else if case let .environment(environment) = attribute, case .test = environment.environment { - isTestingEnvironment = true - } else if case let .backupData(backupData) = attribute { - peerId = backupData.data?.peerId ?? 0 - } - } - let _ = sortOrder - let _ = isTestingEnvironment - - if !isLoggedOut && peerId != 0 { - recordsToBackup[peerId] = record - } - } - - for (peerId, record) in recordsToBackup { - var backupName: String? = nil - if let accountWithInfo = accountsWithInfo.first(where: { $0.peer.id == PeerId(peerId) }) { - if let user = accountWithInfo.peer as? TelegramUser { - if let username = user.username { - backupName = "@\(username)" - } else { - backupName = user.nameOrPhone - } - } - } - let backup = SessionBackup(name: backupName, accountRecord: record) - do { - let data = try JSONEncoder().encode(backup) - try KeychainBackupManager.shared.saveSession(id: "\(backup.peerIdInternal)", data) - } catch let e { - print("BACKUP ERROR: \(e)") - } - } -} - - -@available(iOS 13.0, *) -public func sgSessionBackupManagerController(context: AccountContext, presentationData: PresentationData? = nil) -> ViewController { - let theme = presentationData?.theme ?? (UITraitCollection.current.userInterfaceStyle == .dark ? defaultDarkColorPresentationTheme : defaultPresentationTheme) - let strings = presentationData?.strings ?? defaultPresentationStrings - - let legacyController = LegacySwiftUIController( - presentation: .navigation, - theme: theme, - strings: strings - ) - legacyController.statusBar.statusBarStyle = theme.rootController - .statusBarStyle.style - legacyController.title = "Session Backup" //i18n("BackupManager.Title", strings.baseLanguageCode) - - let swiftUIView = SGSwiftUIView( - legacyController: legacyController, - manageSafeArea: true, - content: { - SessionBackupManagerView(wrapperController: legacyController, context: context) - } - ) - let controller = UIHostingController(rootView: swiftUIView, ignoreSafeArea: true) - legacyController.bind(controller: controller) - - return legacyController -} - - -@available(iOS 13.0, *) -struct MessageFilterKeywordInputFieldModifier: ViewModifier { - @Binding var newKeyword: String - let onAdd: () -> Void - - func body(content: Content) -> some View { - if #available(iOS 15.0, *) { - content - .submitLabel(.return) - .submitScope(false) // TODO(swiftgram): Keyboard still closing - .interactiveDismissDisabled() - .onSubmit { - onAdd() - } - } else { - content - } - } -} - - -@available(iOS 13.0, *) -struct MessageFilterKeywordInputView: View { - @Binding var newKeyword: String - let onAdd: () -> Void - - var body: some View { - HStack { - TextField("Enter keyword", text: $newKeyword) - .autocorrectionDisabled(true) - .autocapitalization(.none) - .keyboardType(.default) - .modifier(MessageFilterKeywordInputFieldModifier(newKeyword: $newKeyword, onAdd: onAdd)) - - - Button(action: onAdd) { - Image(systemName: "plus.circle.fill") - .foregroundColor(newKeyword.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? .secondary : .accentColor) - .imageScale(.large) - } - .disabled(newKeyword.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) - .buttonStyle(PlainButtonStyle()) - } - } -} - -@available(iOS 13.0, *) -struct MessageFilterView: View { - weak var wrapperController: LegacyController? - - @State private var newKeyword: String = "" - @State private var keywords: [String] { - didSet { - SGSimpleSettings.shared.messageFilterKeywords = keywords - } - } - - init(wrapperController: LegacyController?) { - self.wrapperController = wrapperController - _keywords = State(initialValue: SGSimpleSettings.shared.messageFilterKeywords) - } - - var bodyContent: some View { - List { - Section { - // Icon and title - VStack(spacing: 8) { - Image(systemName: "nosign.app.fill") - .font(.system(size: 50)) - .foregroundColor(.secondary) - - Text("Message Filter") - .font(.title) - .bold() - - Text("Remove distraction and reduce visibility of messages containing keywords below.\nKeywords are case-sensitive.") - .font(.body) - .foregroundColor(.secondary) - .multilineTextAlignment(.center) - .padding(.horizontal) - } - .frame(maxWidth: .infinity) - .padding(.vertical, 16) - .listRowInsets(EdgeInsets()) - - } - - Section { - MessageFilterKeywordInputView(newKeyword: $newKeyword, onAdd: addKeyword) - } - - Section(header: Text("Keywords")) { - ForEach(keywords.reversed(), id: \.self) { keyword in - Text(keyword) - } - .onDelete { indexSet in - let originalIndices = IndexSet( - indexSet.map { keywords.count - 1 - $0 } - ) - deleteKeywords(at: originalIndices) - } - } - } - .tgNavigationBackButton(wrapperController: wrapperController) - } - - var body: some View { - NavigationView { - if #available(iOS 14.0, *) { - bodyContent - .toolbar { - EditButton() - } - } else { - bodyContent - } - } - } - - private func addKeyword() { - let trimmedKeyword = newKeyword.trimmingCharacters(in: .whitespacesAndNewlines) - guard !trimmedKeyword.isEmpty else { return } - - let keywordExists = keywords.contains { - $0 == trimmedKeyword - } - - guard !keywordExists else { - return - } - - withAnimation { - keywords.append(trimmedKeyword) - } - newKeyword = "" - - } - - private func deleteKeywords(at offsets: IndexSet) { - withAnimation { - keywords.remove(atOffsets: offsets) - } - } -} - -@available(iOS 13.0, *) -public func sgMessageFilterController(presentationData: PresentationData? = nil) -> ViewController { - let theme = presentationData?.theme ?? (UITraitCollection.current.userInterfaceStyle == .dark ? defaultDarkColorPresentationTheme : defaultPresentationTheme) - let strings = presentationData?.strings ?? defaultPresentationStrings - - let legacyController = LegacySwiftUIController( - presentation: .navigation, - theme: theme, - strings: strings - ) - // Status bar color will break if theme changed - legacyController.statusBar.statusBarStyle = theme.rootController - .statusBarStyle.style - legacyController.displayNavigationBar = false - let swiftUIView = MessageFilterView(wrapperController: legacyController) - let controller = UIHostingController(rootView: swiftUIView, ignoreSafeArea: true) - legacyController.bind(controller: controller) - - return legacyController -} private enum SGDebugControllerSection: Int32, SGItemListSection { @@ -868,25 +61,13 @@ private func SGDebugControllerEntries(presentationData: PresentationData) -> [SG #if DEBUG entries.append(.action(id: id.count, section: .base, actionType: .flexing, text: "FLEX", kind: .generic)) entries.append(.action(id: id.count, section: .base, actionType: .fileManager, text: "FileManager", kind: .generic)) - entries.append(.disclosure(id: id.count, section: .base, link: .debugIAP, text: "Pro")) - entries.append(.action(id: id.count, section: .base, actionType: .resetIAP, text: "Reset Pro", kind: .destructive)) #endif - - if SGSimpleSettings.shared.b { - entries.append(.disclosure(id: id.count, section: .base, link: .sessionBackupManager, text: "Session Backup")) - entries.append(.disclosure(id: id.count, section: .base, link: .messageFilter, text: "Message Filter")) - if #available(iOS 13.0, *) { - entries.append(.toggle(id: id.count, section: .base, settingName: .inputToolbar, value: SGSimpleSettings.shared.inputToolbar, text: "Message Formatting Toolbar", enabled: true)) - } - } + entries.append(.action(id: id.count, section: .base, actionType: .clearRegDateCache, text: "Clear Regdate cache", kind: .generic)) entries.append(.toggle(id: id.count, section: .base, settingName: .forceImmediateShareSheet, value: SGSimpleSettings.shared.forceSystemSharing, text: "Force System Share Sheet", enabled: true)) + entries.append(.action(id: id.count, section: .base, actionType: .resetIAP, text: "Reset Pro", kind: .destructive)) - entries.append(.header(id: id.count, section: .notifications, text: "NOTIFICATIONS", badge: nil)) - entries.append(.toggle(id: id.count, section: .notifications, settingName: .legacyNotificationsFix, value: SGSimpleSettings.shared.legacyNotificationsFix, text: "[Legacy] Fix empty notifications", enabled: true)) - entries.append(.oneFromManySelector(id: id.count, section: .notifications, settingName: .pinnedMessageNotifications, text: "Pinned Messages", value: SGSimpleSettings.shared.pinnedMessageNotifications, enabled: true)) - entries.append(.oneFromManySelector(id: id.count, section: .notifications, settingName: .mentionsAndRepliesNotifications, text: "@Mentions and Replies", value: SGSimpleSettings.shared.mentionsAndRepliesNotifications, enabled: true)) - + entries.append(.toggle(id: id.count, section: .notifications, settingName: .legacyNotificationsFix, value: SGSimpleSettings.shared.legacyNotificationsFix, text: "[OLD] Fix empty notifications", enabled: true)) return entries } private func okUndoController(_ text: String, _ presentationData: PresentationData) -> UndoOverlayController { @@ -913,44 +94,11 @@ public func sgDebugController(context: AccountContext) -> ViewController { }, setOneFromManyValue: { setting in let presentationData = context.sharedContext.currentPresentationData.with { $0 } let actionSheet = ActionSheetController(presentationData: presentationData) - var items: [ActionSheetItem] = [] + let items: [ActionSheetItem] = [] +// var items: [ActionSheetItem] = [] - switch (setting) { - case .pinnedMessageNotifications: - let setAction: (String) -> Void = { value in - SGSimpleSettings.shared.pinnedMessageNotifications = value - SGSimpleSettings.shared.synchronizeShared() - simplePromise.set(true) - } - - for value in SGSimpleSettings.PinnedMessageNotificationsSettings.allCases { - items.append(ActionSheetButtonItem(title: value.rawValue, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - if SGSimpleSettings.shared.b { - setAction(value.rawValue) - } else { - setAction(SGSimpleSettings.PinnedMessageNotificationsSettings.default.rawValue) - } - })) - } - case .mentionsAndRepliesNotifications: - let setAction: (String) -> Void = { value in - SGSimpleSettings.shared.mentionsAndRepliesNotifications = value - SGSimpleSettings.shared.synchronizeShared() - simplePromise.set(true) - } - - for value in SGSimpleSettings.MentionsAndRepliesNotificationsSettings.allCases { - items.append(ActionSheetButtonItem(title: value.rawValue, color: .accent, action: { [weak actionSheet] in - actionSheet?.dismissAnimated() - if SGSimpleSettings.shared.b { - setAction(value.rawValue) - } else { - setAction(SGSimpleSettings.MentionsAndRepliesNotificationsSettings.default.rawValue) - } - })) - } - } +// switch (setting) { +// } actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in @@ -958,53 +106,7 @@ public func sgDebugController(context: AccountContext) -> ViewController { }) ])]) presentControllerImpl?(actionSheet, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) - }, openDisclosureLink: { link in - let presentationData = context.sharedContext.currentPresentationData.with { $0 } - switch (link) { - case .sessionBackupManager: - if #available(iOS 13.0, *) { - pushControllerImpl?(sgSessionBackupManagerController(context: context, presentationData: presentationData)) - } else { - presentControllerImpl?(UndoOverlayController( - presentationData: presentationData, - content: .info(title: nil, text: "Update OS to access this feature", timeout: nil, customUndoText: nil), - elevatedLayout: false, - action: { _ in return false } - ), nil) - } - case .messageFilter: - if #available(iOS 13.0, *) { - pushControllerImpl?(sgMessageFilterController(presentationData: presentationData)) - } else { - presentControllerImpl?(UndoOverlayController( - presentationData: presentationData, - content: .info(title: nil, text: "Update OS to access this feature", timeout: nil, customUndoText: nil), - elevatedLayout: false, - action: { _ in return false } - ), nil) - } - case .debugIAP: - #if DEBUG - if #available(iOS 13.0, *) { - if let sgIAPManager = context.sharedContext.SGIAP { - let statusSignal = context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.sgStatus]) - |> map { sharedData -> Int64 in - let sgStatus = sharedData.entries[ApplicationSpecificSharedDataKeys.sgStatus]?.get(SGStatus.self) ?? SGStatus.default - return sgStatus.status - } - presentControllerImpl?(sgPayWallController(statusSignal: statusSignal, replacementController: sgDebugController(context: context), presentationData: presentationData, SGIAPManager: sgIAPManager), ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) - } - } else { - presentControllerImpl?(UndoOverlayController( - presentationData: presentationData, - content: .info(title: nil, text: "Update OS to access this feature", timeout: nil, customUndoText: nil), - elevatedLayout: false, - action: { _ in return false } - ), nil) - } - - #endif - } + }, openDisclosureLink: { _ in }, action: { actionType in let presentationData = context.sharedContext.currentPresentationData.with { $0 } switch actionType { diff --git a/Swiftgram/SGKeychainBackupManager/BUILD b/Swiftgram/SGKeychainBackupManager/BUILD new file mode 100644 index 0000000000..cd1a5d1293 --- /dev/null +++ b/Swiftgram/SGKeychainBackupManager/BUILD @@ -0,0 +1,17 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "SGKeychainBackupManager", + module_name = "SGKeychainBackupManager", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + ], + visibility = [ + "//visibility:public", + ], +) \ No newline at end of file diff --git a/Swiftgram/SGKeychainBackupManager/Sources/SGKeychainBackupManager.swift b/Swiftgram/SGKeychainBackupManager/Sources/SGKeychainBackupManager.swift new file mode 100644 index 0000000000..2de2ebd5ed --- /dev/null +++ b/Swiftgram/SGKeychainBackupManager/Sources/SGKeychainBackupManager.swift @@ -0,0 +1,131 @@ +import Foundation +import Security + +public enum KeychainError: Error { + case duplicateEntry + case unknown(OSStatus) + case itemNotFound + case invalidItemFormat +} + +public class KeychainBackupManager { + public static let shared = KeychainBackupManager() + private let service = "\(Bundle.main.bundleIdentifier!).sessionsbackup" + + private init() {} + + // MARK: - Save Credentials + public func saveSession(id: String, _ session: Data) throws { + // Create query dictionary + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: id, + kSecValueData as String: session, + kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked + ] + + // Add to keychain + let status = SecItemAdd(query as CFDictionary, nil) + + if status == errSecDuplicateItem { + // Item already exists, update it + let updateQuery: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: id + ] + + let attributesToUpdate: [String: Any] = [ + kSecValueData as String: session + ] + + let updateStatus = SecItemUpdate(updateQuery as CFDictionary, + attributesToUpdate as CFDictionary) + + if updateStatus != errSecSuccess { + throw KeychainError.unknown(updateStatus) + } + } else if status != errSecSuccess { + throw KeychainError.unknown(status) + } + } + + // MARK: - Retrieve Credentials + public func retrieveSession(for id: String) throws -> Data { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: id, + kSecReturnData as String: true + ] + + var result: AnyObject? + let status = SecItemCopyMatching(query as CFDictionary, &result) + + guard status == errSecSuccess, let sessionData = result as? Data else { + throw KeychainError.itemNotFound + } + + return sessionData + } + + // MARK: - Delete Credentials + public func deleteSession(for id: String) throws { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: id + ] + + let status = SecItemDelete(query as CFDictionary) + + if status != errSecSuccess && status != errSecItemNotFound { + throw KeychainError.unknown(status) + } + } + + // MARK: - Retrieve All Accounts + public func getAllSessons() throws -> [Data] { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitAll + ] + + var result: AnyObject? + let status = SecItemCopyMatching(query as CFDictionary, &result) + + if status == errSecItemNotFound { + return [] + } + + guard status == errSecSuccess, + let credentialsDataArray = result as? [Data] else { + throw KeychainError.unknown(status) + } + + return credentialsDataArray + } + + // MARK: - Delete All Sessions + public func deleteAllSessions() throws { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service + ] + + let status = SecItemDelete(query as CFDictionary) + + // If no items were found, that's fine - just return + if status == errSecItemNotFound { + return + } + + // For any other error, throw + if status != errSecSuccess { + throw KeychainError.unknown(status) + } + } +} diff --git a/Swiftgram/SGPayWall/Sources/SGPayWall.swift b/Swiftgram/SGPayWall/Sources/SGPayWall.swift index cc53923833..2433f73081 100644 --- a/Swiftgram/SGPayWall/Sources/SGPayWall.swift +++ b/Swiftgram/SGPayWall/Sources/SGPayWall.swift @@ -13,7 +13,7 @@ import TelegramUIPreferences @available(iOS 13.0, *) -public func sgPayWallController(statusSignal: Signal, replacementController: ViewController, presentationData: PresentationData? = nil, SGIAPManager: SGIAPManager) -> ViewController { +public func sgPayWallController(statusSignal: Signal, replacementController: ViewController, presentationData: PresentationData? = nil, SGIAPManager: SGIAPManager, openUrl: @escaping (String) -> Void) -> ViewController { // let theme = presentationData?.theme ?? (UITraitCollection.current.userInterfaceStyle == .dark ? defaultDarkColorPresentationTheme : defaultPresentationTheme) let theme = defaultDarkColorPresentationTheme let strings = presentationData?.strings ?? defaultPresentationStrings @@ -30,7 +30,7 @@ public func sgPayWallController(statusSignal: Signal, replacemen let swiftUIView = SGSwiftUIView( legacyController: legacyController, content: { - SGPayWallView(wrapperController: legacyController, replacementController: replacementController, SGIAP: SGIAPManager, statusSignal: statusSignal) + SGPayWallView(wrapperController: legacyController, replacementController: replacementController, SGIAP: SGIAPManager, statusSignal: statusSignal, openUrl: openUrl) } ) let controller = UIHostingController(rootView: swiftUIView, ignoreSafeArea: true) @@ -105,6 +105,7 @@ struct SGPayWallView: View { let replacementController: ViewController let SGIAP: SGIAPManager let statusSignal: Signal + let openUrl: (String) -> Void private enum PayWallState: Equatable { case ready // ready to buy @@ -147,7 +148,7 @@ struct SGPayWallView: View { .font(.largeTitle) .fontWeight(.bold) - Text("Supercharged with Pro features".i18n(lang)) + Text("PayWall.Text".i18n(lang)) .font(.callout) .multilineTextAlignment(.center) .padding(.horizontal) @@ -156,14 +157,18 @@ struct SGPayWallView: View { // Features VStack(spacing: 8) { featuresSection + legalSection restorePurchasesButton } + // Spacer for purchase buttons Color.clear.frame(height: 50) } .padding(.vertical, 50) } + .padding(.leading, max(innerShadowWidth + 8.0, sgLeftSafeAreaInset(containerViewLayout))) + .padding(.trailing, max(innerShadowWidth + 8.0, sgRightSafeAreaInset(containerViewLayout))) // Fixed purchase button at bottom purchaseSection @@ -220,7 +225,7 @@ struct SGPayWallView: View { if let userInfo = notification.userInfo, let error = userInfo["error"] as? String, !error.isEmpty { showErrorAlert(error) } else { - showErrorAlert("Validation Error") + showErrorAlert("PayWall.ValidationError".i18n(lang)) } } } @@ -230,35 +235,33 @@ struct SGPayWallView: View { VStack(spacing: 8) { FeatureRow( icon: FeatureIcon(icon: "lock.fill", backgroundColor: .blue), - title: "Session Backup", - subtitle: "Restore sessions from encrypted local Apple Keychain backup." + title: "PayWall.SessionBackup.Title".i18n(lang), + subtitle: "PayWall.SessionBackup.Notice".i18n(lang) ) FeatureRow( icon: FeatureIcon(icon: "nosign", backgroundColor: .gray, fontWeight: .bold), - title: "Message Filter", - subtitle: "Reduce visibility of spam, promotions and annoying messages." + title: "PayWall.MessageFilter.Title".i18n(lang), + subtitle: "PayWall.MessageFilter.Notice".i18n(lang) ) FeatureRow( icon: FeatureIcon(icon: "bell.badge.slash.fill", backgroundColor: .red), - title: "Disable @mentions and replies", - subtitle: "Hide or silence non-important notifications." + title: "PayWall.Notifications.Title".i18n(lang), + subtitle: "PayWall.MessageFilter.Notice".i18n(lang) ) FeatureRow( icon: FeatureIcon(icon: "bold.underline", backgroundColor: .blue, iconSize: 16), - title: "Quick Formatting panel", - subtitle: "Save time preparing your posts with a panel right above your keyboard." + title: "PayWall.InputToolbar.Title".i18n(lang), + subtitle: "PayWall.InputToolbar.Notice".i18n(lang) ) } - .padding(.leading, max(innerShadowWidth + 8.0, sgLeftSafeAreaInset(containerViewLayout))) - .padding(.trailing, max(innerShadowWidth + 8.0, sgRightSafeAreaInset(containerViewLayout))) } private var restorePurchasesButton: some View { Button(action: handleRestorePurchases) { - Text("Restore Purchases") + Text("PayWall.RestorePurchases".i18n(lang)) .font(.footnote) .fontWeight(.semibold) .foregroundColor(Color(hex: accentColorHex)) @@ -290,6 +293,41 @@ struct SGPayWallView: View { .shadow(radius: 8, y: -4) } + private var legalSection: some View { + Group { + if #available(iOS 15.0, *) { + Text(LocalizedStringKey("PayWall.Notice.Markdown".i18n(lang, args: "PayWall.TermsURL".i18n(lang), "PayWall.PrivacyURL".i18n(lang)))) + .font(.caption) + .tint(Color(hex: accentColorHex)) + .foregroundColor(.secondary) + .environment(\.openURL, OpenURLAction { url in + openUrl(url.absoluteString) + return .handled + }) + } else { + Text("PayWall.Notice.Raw".i18n(lang)) + .font(.caption) + .foregroundColor(.secondary) + HStack(alignment: .top, spacing: 8) { + Button(action: { + openUrl("PayWall.PrivacyURL".i18n(lang)) + }) { + Text("PayWall.Privacy".i18n(lang)) + .font(.caption) + .foregroundColor(Color(hex: accentColorHex)) + } + Button(action: { + openUrl("PayWall.TermsURL".i18n(lang)) + }) { + Text("PayWall.Terms".i18n(lang)) + .font(.caption) + .foregroundColor(Color(hex: accentColorHex)) + } + } + } + } + } + private var closeButtonView: some View { Button(action: { wrapperController?.dismiss(animated: true) @@ -306,22 +344,22 @@ struct SGPayWallView: View { private var buttonTitle: String { if currentStatus > 1 { - return "Use Pro features".i18n(lang) + return "PayWall.Button.OpenPro".i18n(lang) } else { if state == .purchasing { - return "Purchasing...".i18n(lang) + return "PayWall.Button.Purchasing".i18n(lang) } else if state == .restoring { - return "Restoring Purchases...".i18n(lang) + return "PayWall.Button.Restoring".i18n(lang) } else if state == .validating { - return "Validating Purchase...".i18n(lang) + return "PayWall.Button.Validating".i18n(lang) } else if let product = product { if !SGIAP.canMakePayments { - return "Payments unavailable".i18n(lang) + return "PayWall.Button.PaymentsUnavailable".i18n(lang) } else { - return "Subscribe for \(product.price) / month".i18n(lang, args: product.price) + return "PayWall.Button.Subscribe".i18n(lang, args: product.price) } } else { - return "Contacting App Store...".i18n(lang) + return "Paywall.Button.ContactingAppStore".i18n(lang) } } } diff --git a/Swiftgram/SGProUI/BUILD b/Swiftgram/SGProUI/BUILD new file mode 100644 index 0000000000..e748ea0cfe --- /dev/null +++ b/Swiftgram/SGProUI/BUILD @@ -0,0 +1,41 @@ +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + + +swift_library( + name = "SGProUI", + module_name = "SGProUI", + srcs = glob([ + "Sources/**/*.swift", + ]), + copts = [ + "-warnings-as-errors", + ], + deps = [ + "//Swiftgram/SGKeychainBackupManager:SGKeychainBackupManager", + "//Swiftgram/SGItemListUI:SGItemListUI", + "//Swiftgram/SGLogging:SGLogging", + "//Swiftgram/SGSimpleSettings:SGSimpleSettings", + "//Swiftgram/SGStrings:SGStrings", + "//Swiftgram/SGAPI:SGAPI", + "//Swiftgram/SGAPIToken:SGAPIToken", + "//Swiftgram/SGSwiftUI:SGSwiftUI", + # + "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", + "//submodules/Display:Display", + "//submodules/Postbox:Postbox", + "//submodules/TelegramCore:TelegramCore", + "//submodules/MtProtoKit:MtProtoKit", + "//submodules/TelegramPresentationData:TelegramPresentationData", + "//submodules/TelegramUIPreferences:TelegramUIPreferences", + "//submodules/ItemListUI:ItemListUI", + "//submodules/PresentationDataUtils:PresentationDataUtils", + "//submodules/OverlayStatusController:OverlayStatusController", + "//submodules/AccountContext:AccountContext", + "//submodules/AppBundle:AppBundle", + "//submodules/TelegramUI/Components/Settings/PeerNameColorScreen", + "//submodules/UndoUI:UndoUI", + ], + visibility = [ + "//visibility:public", + ], +) diff --git a/Swiftgram/SGProUI/Sources/MessageFilterController.swift b/Swiftgram/SGProUI/Sources/MessageFilterController.swift new file mode 100644 index 0000000000..eb36ac2ef5 --- /dev/null +++ b/Swiftgram/SGProUI/Sources/MessageFilterController.swift @@ -0,0 +1,181 @@ +import Foundation +import SwiftUI +import SGSwiftUI +import SGStrings +import SGSimpleSettings +import LegacyUI +import Display +import TelegramPresentationData + +@available(iOS 13.0, *) +struct MessageFilterKeywordInputFieldModifier: ViewModifier { + @Binding var newKeyword: String + let onAdd: () -> Void + + func body(content: Content) -> some View { + if #available(iOS 15.0, *) { + content + .submitLabel(.return) + .submitScope(false) // TODO(swiftgram): Keyboard still closing + .interactiveDismissDisabled() + .onSubmit { + onAdd() + } + } else { + content + } + } +} + + +@available(iOS 13.0, *) +struct MessageFilterKeywordInputView: View { + @Environment(\.lang) var lang: String + @Binding var newKeyword: String + let onAdd: () -> Void + + var body: some View { + HStack { + TextField("MessageFilter.InputPlaceholder".i18n(lang), text: $newKeyword) + .autocorrectionDisabled(true) + .autocapitalization(.none) + .keyboardType(.default) + .modifier(MessageFilterKeywordInputFieldModifier(newKeyword: $newKeyword, onAdd: onAdd)) + + + Button(action: onAdd) { + Image(systemName: "plus.circle.fill") + .foregroundColor(newKeyword.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ? .secondary : .accentColor) + .imageScale(.large) + } + .disabled(newKeyword.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty) + .buttonStyle(PlainButtonStyle()) + } + } +} + +@available(iOS 13.0, *) +struct MessageFilterView: View { + weak var wrapperController: LegacyController? + @Environment(\.lang) var lang: String + + @State private var newKeyword: String = "" + @State private var keywords: [String] { + didSet { + SGSimpleSettings.shared.messageFilterKeywords = keywords + } + } + + init(wrapperController: LegacyController?) { + self.wrapperController = wrapperController + _keywords = State(initialValue: SGSimpleSettings.shared.messageFilterKeywords) + } + + var bodyContent: some View { + List { + Section { + // Icon and title + VStack(spacing: 8) { + Image(systemName: "nosign.app.fill") + .font(.system(size: 50)) + .foregroundColor(.secondary) + + Text("MessageFilter.Title".i18n(lang)) + .font(.title) + .bold() + + Text("MessageFilter.SubTitle".i18n(lang)) + .font(.body) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + .padding(.horizontal) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 16) + .listRowInsets(EdgeInsets()) + + } + + Section { + MessageFilterKeywordInputView(newKeyword: $newKeyword, onAdd: addKeyword) + } + + Section(header: Text("MessageFilter.Keywords.Title".i18n(lang))) { + ForEach(keywords.reversed(), id: \.self) { keyword in + Text(keyword) + } + .onDelete { indexSet in + let originalIndices = IndexSet( + indexSet.map { keywords.count - 1 - $0 } + ) + deleteKeywords(at: originalIndices) + } + } + } + .tgNavigationBackButton(wrapperController: wrapperController) + } + + var body: some View { + NavigationView { + if #available(iOS 14.0, *) { + bodyContent + .toolbar { + EditButton() + } + } else { + bodyContent + } + } + } + + private func addKeyword() { + let trimmedKeyword = newKeyword.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmedKeyword.isEmpty else { return } + + let keywordExists = keywords.contains { + $0 == trimmedKeyword + } + + guard !keywordExists else { + return + } + + withAnimation { + keywords.append(trimmedKeyword) + } + newKeyword = "" + + } + + private func deleteKeywords(at offsets: IndexSet) { + withAnimation { + keywords.remove(atOffsets: offsets) + } + } +} + +@available(iOS 13.0, *) +public func sgMessageFilterController(presentationData: PresentationData? = nil) -> ViewController { + let theme = presentationData?.theme ?? (UITraitCollection.current.userInterfaceStyle == .dark ? defaultDarkColorPresentationTheme : defaultPresentationTheme) + let strings = presentationData?.strings ?? defaultPresentationStrings + + let legacyController = LegacySwiftUIController( + presentation: .navigation, + theme: theme, + strings: strings + ) + // Status bar color will break if theme changed + legacyController.statusBar.statusBarStyle = theme.rootController + .statusBarStyle.style + legacyController.displayNavigationBar = false + let swiftUIView = SGSwiftUIView( + legacyController: legacyController, + content: { + MessageFilterView(wrapperController: legacyController) + } + ) + let controller = UIHostingController(rootView: swiftUIView, ignoreSafeArea: true) + legacyController.bind(controller: controller) + + return legacyController +} diff --git a/Swiftgram/SGProUI/Sources/SGProUI.swift b/Swiftgram/SGProUI/Sources/SGProUI.swift new file mode 100644 index 0000000000..033ea3c57c --- /dev/null +++ b/Swiftgram/SGProUI/Sources/SGProUI.swift @@ -0,0 +1,159 @@ +import Foundation +import UniformTypeIdentifiers +import SGItemListUI +import UndoUI +import AccountContext +import Display +import TelegramCore +import Postbox +import ItemListUI +import SwiftSignalKit +import TelegramPresentationData +import PresentationDataUtils +import TelegramUIPreferences + +// Optional +import SGSimpleSettings +import SGLogging + + +private enum SGProControllerSection: Int32, SGItemListSection { + case base + case notifications +} + +private enum SGProDisclosureLink: String { + case sessionBackupManager + case messageFilter +} + +private enum SGProToggles: String { + case inputToolbar +} + +private enum SGProOneFromManySetting: String { + case pinnedMessageNotifications + case mentionsAndRepliesNotifications +} + +private typealias SGProControllerEntry = SGItemListUIEntry + +private func SGProControllerEntries(presentationData: PresentationData) -> [SGProControllerEntry] { + var entries: [SGProControllerEntry] = [] + let lang = presentationData.strings.baseLanguageCode + + let id = SGItemListCounter() + + entries.append(.disclosure(id: id.count, section: .base, link: .sessionBackupManager, text: "SessionBackup.Title".i18n(lang))) + entries.append(.disclosure(id: id.count, section: .base, link: .messageFilter, text: "MessageFilter.Title".i18n(lang))) + entries.append(.toggle(id: id.count, section: .base, settingName: .inputToolbar, value: SGSimpleSettings.shared.inputToolbar, text: "InputToolbar.Title".i18n(lang), enabled: true)) + + entries.append(.header(id: id.count, section: .notifications, text: presentationData.strings.Notifications_Title.uppercased(), badge: nil)) + entries.append(.oneFromManySelector(id: id.count, section: .notifications, settingName: .pinnedMessageNotifications, text: "Notifications.PinnedMessages.Title".i18n(lang), value: "Notifications.PinnedMessages.value.\(SGSimpleSettings.shared.pinnedMessageNotifications)".i18n(lang), enabled: true)) + entries.append(.oneFromManySelector(id: id.count, section: .notifications, settingName: .mentionsAndRepliesNotifications, text: "Notifications.MentionsAndReplies.Title".i18n(lang), value: "Notifications.MentionsAndReplies.value.\(SGSimpleSettings.shared.mentionsAndRepliesNotifications)".i18n(lang), enabled: true)) + + return entries +} + +public func okUndoController(_ text: String, _ presentationData: PresentationData) -> UndoOverlayController { + return UndoOverlayController(presentationData: presentationData, content: .succeed(text: text, timeout: nil, customUndoText: nil), elevatedLayout: false, action: { _ in return false }) +} + +public func sgProController(context: AccountContext) -> ViewController { + var presentControllerImpl: ((ViewController, ViewControllerPresentationArguments?) -> Void)? + var pushControllerImpl: ((ViewController) -> Void)? + + let simplePromise = ValuePromise(true, ignoreRepeated: false) + + let arguments = SGItemListArguments(context: context, setBoolValue: { toggleName, value in + switch toggleName { + case .inputToolbar: + SGSimpleSettings.shared.inputToolbar = value + } + }, setOneFromManyValue: { setting in + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let lang = presentationData.strings.baseLanguageCode + let actionSheet = ActionSheetController(presentationData: presentationData) + var items: [ActionSheetItem] = [] + + switch (setting) { + case .pinnedMessageNotifications: + let setAction: (String) -> Void = { value in + SGSimpleSettings.shared.pinnedMessageNotifications = value + SGSimpleSettings.shared.synchronizeShared() + simplePromise.set(true) + } + + for value in SGSimpleSettings.PinnedMessageNotificationsSettings.allCases { + items.append(ActionSheetButtonItem(title: "Notifications.PinnedMessages.value.\(value.rawValue)".i18n(lang), color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + setAction(value.rawValue) + })) + } + case .mentionsAndRepliesNotifications: + let setAction: (String) -> Void = { value in + SGSimpleSettings.shared.mentionsAndRepliesNotifications = value + SGSimpleSettings.shared.synchronizeShared() + simplePromise.set(true) + } + + for value in SGSimpleSettings.MentionsAndRepliesNotificationsSettings.allCases { + items.append(ActionSheetButtonItem(title: "Notifications.MentionsAndReplies.value.\(value.rawValue)".i18n(lang), color: .accent, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + setAction(value.rawValue) + })) + } + } + + actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ + ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in + actionSheet?.dismissAnimated() + }) + ])]) + presentControllerImpl?(actionSheet, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + }, openDisclosureLink: { link in + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + switch (link) { + case .sessionBackupManager: + if #available(iOS 13.0, *) { + pushControllerImpl?(sgSessionBackupManagerController(context: context, presentationData: presentationData)) + } else { + presentControllerImpl?(context.sharedContext.makeSGUpdateIOSController(), nil) + } + case .messageFilter: + if #available(iOS 13.0, *) { + pushControllerImpl?(sgMessageFilterController(presentationData: presentationData)) + } else { + presentControllerImpl?(context.sharedContext.makeSGUpdateIOSController(), nil) + } + } + }, action: { _ in + + }) + + let signal = combineLatest(context.sharedContext.presentationData, simplePromise.get()) + |> map { presentationData, _ -> (ItemListControllerState, (ItemListNodeState, Any)) in + + let entries = SGProControllerEntries(presentationData: presentationData) + + let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text("Swiftgram Pro"), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) + + let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: entries, style: .blocks, ensureVisibleItemTag: /*focusOnItemTag*/ nil, initialScrollToItem: nil /* scrollToItem*/ ) + + return (controllerState, (listState, arguments)) + } + + let controller = ItemListController(context: context, state: signal) + presentControllerImpl = { [weak controller] c, a in + controller?.present(c, in: .window(.root), with: a) + } + pushControllerImpl = { [weak controller] c in + (controller?.navigationController as? NavigationController)?.pushViewController(c) + } + // Workaround + let _ = pushControllerImpl + + return controller +} + + diff --git a/Swiftgram/SGProUI/Sources/SessionBackupController.swift b/Swiftgram/SGProUI/Sources/SessionBackupController.swift new file mode 100644 index 0000000000..8781d7b779 --- /dev/null +++ b/Swiftgram/SGProUI/Sources/SessionBackupController.swift @@ -0,0 +1,520 @@ +import Foundation +import UndoUI +import AccountContext +import TelegramCore +import Postbox +import Display +import SwiftSignalKit +import TelegramPresentationData +import PresentationDataUtils +import SGSimpleSettings +import SGLogging +import SGKeychainBackupManager + +struct SessionBackup: Codable { + var name: String? = nil + var date: Date = Date() + let accountRecord: AccountRecord + + var peerIdInternal: Int64 { + var userId: Int64 = 0 + for attribute in accountRecord.attributes { + if case let .backupData(backupData) = attribute, let backupPeerID = backupData.data?.peerId { + userId = backupPeerID + break + } + } + return userId + } + + var userId: Int64 { + return PeerId(peerIdInternal).id._internalGetInt64Value() + } +} + +import SwiftUI +import SGSwiftUI +import LegacyUI +import SGStrings + + +@available(iOS 13.0, *) +struct SessionBackupRow: View { + @Environment(\.lang) var lang: String + let backup: SessionBackup + let isLoggedIn: Bool + + + private let dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateStyle = .short + formatter.timeStyle = .short + return formatter + }() + + var formattedDate: String { + if #available(iOS 15.0, *) { + return backup.date.formatted(date: .abbreviated, time: .shortened) + } else { + return dateFormatter.string(from: backup.date) + } + } + + var body: some View { + HStack { + VStack(alignment: .leading, spacing: 2) { + Text(backup.name ?? String(backup.userId)) + .font(.body) + + Text("ID: \(backup.userId)") + .font(.subheadline) + .foregroundColor(.secondary) + + Text("SessionBackup.LastBackupAt".i18n(lang, args: formattedDate)) + .font(.caption) + .foregroundColor(.secondary) + } + + Spacer() + + Text((isLoggedIn ? "SessionBackup.LoggedIn" : "SessionBackup.LoggedOut").i18n(lang)) + .font(.caption) + .foregroundColor(isLoggedIn ? .white : .secondary) + .padding(.horizontal, 6) + .padding(.vertical, 2) + .background(isLoggedIn ? Color.accentColor : Color.secondary.opacity(0.1)) + .cornerRadius(4) + } + .padding(.vertical, 4) + } +} + + +@available(iOS 13.0, *) +struct BorderedButtonStyle: ButtonStyle { + func makeBody(configuration: Configuration) -> some View { + configuration.label + .background( + RoundedRectangle(cornerRadius: 8) + .stroke(Color.accentColor, lineWidth: 1) + ) + .opacity(configuration.isPressed ? 0.7 : 1.0) + } +} + +@available(iOS 13.0, *) +struct SessionBackupManagerView: View { + @Environment(\.lang) var lang: String + weak var wrapperController: LegacyController? + let context: AccountContext + + @State private var sessions: [SessionBackup] = [] + @State private var loggedInPeerIDs: [Int64] = [] + @State private var loggedInAccountsDisposable: Disposable? = nil + + private func performBackup() { + let controller = OverlayStatusController(theme: context.sharedContext.currentPresentationData.with { $0 }.theme, type: .loading(cancelled: nil)) + + let signal = context.sharedContext.accountManager.accountRecords() + |> take(1) + |> deliverOnMainQueue + + let signal2 = context.sharedContext.activeAccountsWithInfo + |> take(1) + |> deliverOnMainQueue + + wrapperController?.present(controller, in: .window(.root), with: nil) + + Task { + if let result = try? await combineLatest(signal, signal2).awaitable() { + let (view, accountsWithInfo) = result + backupSessionsFromView(view, accountsWithInfo: accountsWithInfo.1) + withAnimation { + sessions = getBackedSessions() + } + controller.dismiss() + } + } + + } + + private func performRestore() { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) + + let _ = (context.sharedContext.accountManager.accountRecords() + |> take(1) + |> deliverOnMainQueue).start(next: { [weak controller] view in + + let backupSessions = getBackedSessions() + var restoredSessions: Int64 = 0 + + func importNextBackup(index: Int) { + // Check if we're done + if index >= backupSessions.count { + // All done, update UI + withAnimation { + sessions = getBackedSessions() + } + controller?.dismiss() + wrapperController?.present( + okUndoController("SessionBackup.RestoreOK".i18n(lang, args: "\(restoredSessions)"), presentationData), + in: .current + ) + return + } + + let backup = backupSessions[index] + + // Check for existing record + let existingRecord = view.records.first { record in + var userId: Int64 = 0 + for attribute in record.attributes { + if case let .backupData(backupData) = attribute { + userId = backupData.data?.peerId ?? 0 + } + } + return userId == backup.peerIdInternal + } + + if existingRecord != nil { + SGLogger.shared.log("SessionBackup", "Record \(backup.userId) already exists, skipping") + importNextBackup(index: index + 1) + return + } + + var importAttributes = backup.accountRecord.attributes + importAttributes.removeAll { attribute in + if case .sortOrder = attribute { + return true + } + return false + } + + let importBackupSignal = context.sharedContext.accountManager.transaction { transaction -> Void in + let nextSortOrder = (transaction.getRecords().map({ record -> Int32 in + for attribute in record.attributes { + if case let .sortOrder(sortOrder) = attribute { + return sortOrder.order + } + } + return 0 + }).max() ?? 0) + 1 + importAttributes.append(.sortOrder(AccountSortOrderAttribute(order: nextSortOrder))) + let accountRecordId = transaction.createRecord(importAttributes) + SGLogger.shared.log("SessionBackup", "Imported record \(accountRecordId) for \(backup.userId)") + restoredSessions += 1 + } + |> deliverOnMainQueue + + let _ = importBackupSignal.start(completed: { + importNextBackup(index: index + 1) + }) + } + + // Start the import chain + importNextBackup(index: 0) + }) + + wrapperController?.present(controller, in: .window(.root), with: nil) + } + + private func performDeleteAll() { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let controller = textAlertController(context: context, title: "SessionBackup.DeleteAllBackups".i18n(lang), text: "SessionBackup.DeleteAllBackups.Subtitle".i18n(lang), actions: [ + TextAlertAction(type: .destructiveAction, title: presentationData.strings.Common_Delete, action: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) + wrapperController?.present(controller, in: .window(.root), with: nil) + do { + try KeychainBackupManager.shared.deleteAllSessions() + withAnimation { + sessions = getBackedSessions() + } + controller.dismiss() + } catch let e { + SGLogger.shared.log("SessionBackup", "Error deleting all sessions: \(e)") + } + }), + TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}) + ]) + + wrapperController?.present(controller, in: .window(.root), with: nil) + } + + private func performDelete(_ session: SessionBackup) { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let controller = textAlertController(context: context, title: "SessionBackup.DeleteSingle.Title".i18n(lang), text: "Sessionbackup.DeleteSingle.Text".i18n(lang, args: "\(session.name ?? "\(session.userId)")"), actions: [ + TextAlertAction(type: .destructiveAction, title: presentationData.strings.Common_Delete, action: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) + wrapperController?.present(controller, in: .window(.root), with: nil) + do { + try KeychainBackupManager.shared.deleteSession(for: "\(session.peerIdInternal)") + withAnimation { + sessions = getBackedSessions() + } + controller.dismiss() + } catch let e { + SGLogger.shared.log("SessionBackup", "Error deleting session: \(e)") + } + }), + TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}) + ]) + + wrapperController?.present(controller, in: .window(.root), with: nil) + } + + + private func performRemoveSessionFromApp(session: SessionBackup) { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + let controller = textAlertController(context: context, title: "SessionBackup.RemoveFromApp.Title".i18n(lang), text: "SessionBackup.RemoveFromApp.Text".i18n(lang, args: "\(session.name ?? "\(session.userId)")"), actions: [ + TextAlertAction(type: .destructiveAction, title: presentationData.strings.Common_Delete, action: { + let controller = OverlayStatusController(theme: presentationData.theme, type: .loading(cancelled: nil)) + wrapperController?.present(controller, in: .window(.root), with: nil) + + let signal = context.sharedContext.accountManager.accountRecords() + |> take(1) + |> deliverOnMainQueue + + let _ = signal.start(next: { [weak controller] view in + + // Find record to delete + let accountRecord = view.records.first { record in + var userId: Int64 = 0 + for attribute in record.attributes { + if case let .backupData(backupData) = attribute { + userId = backupData.data?.peerId ?? 0 + } + } + return userId == session.peerIdInternal + } + + if let record = accountRecord { + let deleteSignal = context.sharedContext.accountManager.transaction { transaction -> Void in + transaction.updateRecord(record.id, { _ in return nil}) + } + |> deliverOnMainQueue + + let _ = deleteSignal.start(next: { + withAnimation { + sessions = getBackedSessions() + } + controller?.dismiss() + }) + } else { + controller?.dismiss() + } + }) + + }), + TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Cancel, action: {}) + ]) + + wrapperController?.present(controller, in: .window(.root), with: nil) + } + + + var body: some View { + List { + Section() { + Button(action: performBackup) { + HStack { + Image(systemName: "key.fill") + .frame(width: 30) + Text("SessionBackup.Actions.Backup".i18n(lang)) + Spacer() + } + } + + Button(action: performRestore) { + HStack { + Image(systemName: "arrow.2.circlepath") + .frame(width: 30) + Text("SessionBackup.Actions.Restore".i18n(lang)) + Spacer() + } + } + + Button(action: performDeleteAll) { + HStack { + Image(systemName: "trash") + .frame(width: 30) + Text("SessionBackup.Actions.DeleteAll".i18n(lang)) + } + } + .foregroundColor(.red) + + } + + Text("SessionBackup.Notice".i18n(lang)) + .font(.caption) + .foregroundColor(.secondary) + + Section(header: Text("SessionBackup.Sessions.Title".i18n(lang))) { + ForEach(sessions, id: \.peerIdInternal) { session in + SessionBackupRow( + backup: session, + isLoggedIn: loggedInPeerIDs.contains(session.peerIdInternal) + ) + .contextMenu { + Button(action: { + performDelete(session) + }, label: { + HStack(spacing: 4) { + Text("SessionBackup.Actions.DeleteOne".i18n(lang)) + Image(systemName: "trash") + } + }) + Button(action: { + performRemoveSessionFromApp(session: session) + }, label: { + + HStack(spacing: 4) { + Text("SessionBackup.Actions.RemoveFromApp".i18n(lang)) + Image(systemName: "trash") + } + }) + } + } +// .onDelete { indexSet in +// performDelete(indexSet) +// } + } + } + .onAppear { + withAnimation { + sessions = getBackedSessions() + } + + let accountsSignal = context.sharedContext.accountManager.accountRecords() + |> deliverOnMainQueue + + loggedInAccountsDisposable = accountsSignal.start(next: { view in + var result: [Int64] = [] + for record in view.records { + var isLoggedOut: Bool = false + var userId: Int64 = 0 + for attribute in record.attributes { + if case .loggedOut = attribute { + isLoggedOut = true + } else if case let .backupData(backupData) = attribute { + userId = backupData.data?.peerId ?? 0 + } + } + + if !isLoggedOut && userId != 0 { + result.append(userId) + } + } + + SGLogger.shared.log("SessionBackup", "Logged in accounts: \(result)") + if loggedInPeerIDs != result { + SGLogger.shared.log("SessionBackup", "Updating logged in accounts: \(result)") + loggedInPeerIDs = result + } + }) + + } + .onDisappear { + loggedInAccountsDisposable?.dispose() + } + } + +} + + +func getBackedSessions() -> [SessionBackup] { + var sessions: [SessionBackup] = [] + do { + let backupSessionsData = try KeychainBackupManager.shared.getAllSessons() + for sessionBackupData in backupSessionsData { + do { + let backup = try JSONDecoder().decode(SessionBackup.self, from: sessionBackupData) + sessions.append(backup) + } catch let e { + SGLogger.shared.log("SessionBackup", "IMPORT ERROR: \(e)") + } + } + } catch let e { + SGLogger.shared.log("SessionBackup", "Error getting all sessions: \(e)") + } + return sessions +} + + +func backupSessionsFromView(_ view: AccountRecordsView, accountsWithInfo: [AccountWithInfo] = []) { + var recordsToBackup: [Int64: AccountRecord] = [:] + for record in view.records { + var sortOrder: Int32 = 0 + var isLoggedOut: Bool = false + var isTestingEnvironment: Bool = false + var peerId: Int64 = 0 + for attribute in record.attributes { + if case let .sortOrder(value) = attribute { + sortOrder = value.order + } else if case .loggedOut = attribute { + isLoggedOut = true + } else if case let .environment(environment) = attribute, case .test = environment.environment { + isTestingEnvironment = true + } else if case let .backupData(backupData) = attribute { + peerId = backupData.data?.peerId ?? 0 + } + } + let _ = sortOrder + let _ = isTestingEnvironment + + if !isLoggedOut && peerId != 0 { + recordsToBackup[peerId] = record + } + } + + for (peerId, record) in recordsToBackup { + var backupName: String? = nil + if let accountWithInfo = accountsWithInfo.first(where: { $0.peer.id == PeerId(peerId) }) { + if let user = accountWithInfo.peer as? TelegramUser { + if let username = user.username { + backupName = "@\(username)" + } else { + backupName = user.nameOrPhone + } + } + } + let backup = SessionBackup(name: backupName, accountRecord: record) + do { + let data = try JSONEncoder().encode(backup) + try KeychainBackupManager.shared.saveSession(id: "\(backup.peerIdInternal)", data) + } catch let e { + SGLogger.shared.log("SessionBackup", "BACKUP ERROR: \(e)") + } + } +} + + +@available(iOS 13.0, *) +public func sgSessionBackupManagerController(context: AccountContext, presentationData: PresentationData? = nil) -> ViewController { + let theme = presentationData?.theme ?? (UITraitCollection.current.userInterfaceStyle == .dark ? defaultDarkColorPresentationTheme : defaultPresentationTheme) + let strings = presentationData?.strings ?? defaultPresentationStrings + + let legacyController = LegacySwiftUIController( + presentation: .navigation, + theme: theme, + strings: strings + ) + legacyController.statusBar.statusBarStyle = theme.rootController + .statusBarStyle.style + legacyController.title = "SessionBackup.Title".i18n(strings.baseLanguageCode) + + let swiftUIView = SGSwiftUIView( + legacyController: legacyController, + manageSafeArea: true, + content: { + SessionBackupManagerView(wrapperController: legacyController, context: context) + } + ) + let controller = UIHostingController(rootView: swiftUIView, ignoreSafeArea: true) + legacyController.bind(controller: controller) + + return legacyController +} diff --git a/Swiftgram/SGSettingsUI/Images.xcassets/SwiftgramPro.imageset/Contents.json b/Swiftgram/SGSettingsUI/Images.xcassets/SwiftgramPro.imageset/Contents.json new file mode 100644 index 0000000000..7506e639eb --- /dev/null +++ b/Swiftgram/SGSettingsUI/Images.xcassets/SwiftgramPro.imageset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "filename" : "SwiftgramPro.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } + } + \ No newline at end of file diff --git a/Swiftgram/SGSettingsUI/Images.xcassets/SwiftgramPro.imageset/SwiftgramPro.pdf b/Swiftgram/SGSettingsUI/Images.xcassets/SwiftgramPro.imageset/SwiftgramPro.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fb4264fd56b5aec98e4c86ce08a3f5bc483ed824 GIT binary patch literal 82179 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ð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 take(1) @@ -861,6 +865,7 @@ private final class NotificationServiceHandler { } let inAppNotificationSettings = sharedData.entries[ApplicationSpecificSharedDataKeys.inAppNotificationSettings]?.get(InAppNotificationSettings.self) ?? InAppNotificationSettings.defaultSettings + let sgStatus = sharedData.entries[ApplicationSpecificSharedDataKeys.sgStatus]?.get(SGStatus.self) ?? SGStatus.default let voiceCallSettings: VoiceCallSettings if let value = sharedData.entries[ApplicationSpecificSharedDataKeys.voiceCallSettings]?.get(VoiceCallSettings.self) { @@ -872,7 +877,7 @@ private final class NotificationServiceHandler { guard let strongSelf = self, let recordId = recordId else { Logger.shared.log("NotificationService \(episode)", "Couldn't find a matching decryption key") - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) completed() @@ -894,7 +899,7 @@ private final class NotificationServiceHandler { guard let stateManager = stateManager else { Logger.shared.log("NotificationService \(episode)", "Didn't receive stateManager") - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) completed() return @@ -912,7 +917,7 @@ private final class NotificationServiceHandler { settings ) |> deliverOn(strongSelf.queue)).start(next: { notificationsKey, notificationSoundList in guard let strongSelf = self else { - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) completed() @@ -921,7 +926,7 @@ private final class NotificationServiceHandler { guard let notificationsKey = notificationsKey else { Logger.shared.log("NotificationService \(episode)", "Didn't receive decryption key") - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) completed() @@ -930,7 +935,7 @@ private final class NotificationServiceHandler { guard let decryptedPayload = decryptedNotificationPayload(key: notificationsKey, data: payloadData) else { Logger.shared.log("NotificationService \(episode)", "Couldn't decrypt payload") - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) completed() @@ -939,7 +944,7 @@ private final class NotificationServiceHandler { guard let payloadJson = try? JSONSerialization.jsonObject(with: decryptedPayload, options: []) as? [String: Any] else { Logger.shared.log("NotificationService \(episode)", "Couldn't process payload as JSON") - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) completed() @@ -1047,7 +1052,7 @@ private final class NotificationServiceHandler { action = .logout case "MESSAGE_MUTED": if let peerId = peerId { - action = .poll(peerId: peerId, content: NotificationContent(isLockedMessage: nil, isEmpty: true, isMentionOrReply: isMentionOrReply, chatId: chatId), messageId: nil, reportDelivery: false) + action = .poll(peerId: peerId, content: NotificationContent(sgStatus: sgStatus, isLockedMessage: nil, isEmpty: true, isMentionOrReply: isMentionOrReply, chatId: chatId), messageId: nil, reportDelivery: false) } case "MESSAGE_DELETED": if let peerId = peerId { @@ -1098,7 +1103,7 @@ private final class NotificationServiceHandler { } } else { if let aps = payloadJson["aps"] as? [String: Any], var peerId = peerId { - var content: NotificationContent = NotificationContent(isLockedMessage: isLockedMessage, isMentionOrReply: isMentionOrReply, chatId: chatId) + var content: NotificationContent = NotificationContent(sgStatus: sgStatus, isLockedMessage: isLockedMessage, isMentionOrReply: isMentionOrReply, chatId: chatId) if let alert = aps["alert"] as? [String: Any] { if let topicTitleValue = payloadJson["topic_title"] as? String { topicTitle = topicTitleValue @@ -1249,7 +1254,7 @@ private final class NotificationServiceHandler { switch action { case let .call(callData): if let stateManager = strongSelf.stateManager { - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) let _ = (stateManager.postbox.transaction { transaction -> String? in @@ -1272,7 +1277,7 @@ private final class NotificationServiceHandler { if #available(iOS 14.5, *), voiceCallSettings.enableSystemIntegration { Logger.shared.log("NotificationService \(episode)", "Will report voip notification") - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) CXProvider.reportNewIncomingVoIPPushPayload(voipPayload, completion: { error in @@ -1281,7 +1286,7 @@ private final class NotificationServiceHandler { completed() }) } else { - var content = NotificationContent(isLockedMessage: nil) + var content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) if let peer = callData.peer { content.title = peer.debugDisplayTitle content.body = incomingCallMessage @@ -1297,7 +1302,7 @@ private final class NotificationServiceHandler { case .logout: Logger.shared.log("NotificationService \(episode)", "Will logout") - let content = NotificationContent(isLockedMessage: nil, isEmpty: true) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil, isEmpty: true) updateCurrentContent(content) completed() case let .poll(peerId, initialContent, messageId, reportDelivery): @@ -1315,7 +1320,7 @@ private final class NotificationServiceHandler { queue.async { guard let strongSelf = self, let stateManager = strongSelf.stateManager else { - let content = NotificationContent(isLockedMessage: isLockedMessage) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: isLockedMessage) updateCurrentContent(content) completed() return @@ -1621,7 +1626,7 @@ private final class NotificationServiceHandler { Logger.shared.log("NotificationService \(episode)", "Updating content to \(content)") if wasDisplayed { - content = NotificationContent(isLockedMessage: nil, isMentionOrReply: isMentionOrReply, chatId: chatId) + content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil, isMentionOrReply: isMentionOrReply, chatId: chatId) Logger.shared.log("NotificationService \(episode)", "Was already displayed, skipping content") } else if let messageId { let _ = (stateManager.postbox.transaction { transaction -> Void in @@ -1708,7 +1713,7 @@ private final class NotificationServiceHandler { case let .idBased(maxIncomingReadId, _, _, _, _): if maxIncomingReadId >= messageId.id { Logger.shared.log("NotificationService \(episode)", "maxIncomingReadId: \(maxIncomingReadId), messageId: \(messageId.id), skipping") - content = NotificationContent(isLockedMessage: nil, isMentionOrReply: isMentionOrReply, chatId: chatId) + content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil, isMentionOrReply: isMentionOrReply, chatId: chatId) } else { Logger.shared.log("NotificationService \(episode)", "maxIncomingReadId: \(maxIncomingReadId), messageId: \(messageId.id), not skipping") } @@ -1771,7 +1776,7 @@ private final class NotificationServiceHandler { queue.async { guard let strongSelf = self, let stateManager = strongSelf.stateManager else { - let content = NotificationContent(isLockedMessage: isLockedMessage, isEmpty: true) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: isLockedMessage, isEmpty: true) updateCurrentContent(content) completed() return @@ -1971,7 +1976,7 @@ private final class NotificationServiceHandler { var content = content if wasDisplayed { - content = NotificationContent(isLockedMessage: nil) + content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) } else { let _ = (stateManager.postbox.transaction { transaction -> Void in _internal_setStoryNotificationWasDisplayed(transaction: transaction, id: StoryId(peerId: peerId, id: storyId)) @@ -2059,7 +2064,7 @@ private final class NotificationServiceHandler { postbox: stateManager.postbox ) |> deliverOn(strongSelf.queue)).start(next: { value in - var content = NotificationContent(isLockedMessage: nil, isEmpty: true) + var content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil, isEmpty: true) if isCurrentAccount { content.badge = Int(value.0) } @@ -2101,7 +2106,7 @@ private final class NotificationServiceHandler { } let completeRemoval: () -> Void = { - let content = NotificationContent(isLockedMessage: nil, isEmpty: true) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil, isEmpty: true) Logger.shared.log("NotificationService \(episode)", "Updating content to \(content)") updateCurrentContent(content) @@ -2153,7 +2158,7 @@ private final class NotificationServiceHandler { postbox: stateManager.postbox ) |> deliverOn(strongSelf.queue)).start(next: { value in - var content = NotificationContent(isLockedMessage: nil, isEmpty: true) + var content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil, isEmpty: true) if isCurrentAccount { content.badge = Int(value.0) } @@ -2194,7 +2199,7 @@ private final class NotificationServiceHandler { } let completeRemoval: () -> Void = { - let content = NotificationContent(isLockedMessage: nil, isEmpty: true) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil, isEmpty: true) updateCurrentContent(content) completed() @@ -2213,7 +2218,7 @@ private final class NotificationServiceHandler { }) } } else { - let content = NotificationContent(isLockedMessage: nil) + let content = NotificationContent(sgStatus: sgStatus, isLockedMessage: nil) updateCurrentContent(content) completed() @@ -2377,7 +2382,7 @@ final class NotificationService: UNNotificationServiceExtension { extension NotificationContent { var forceIsEmpty: Bool { - if !self.isEmpty { + if self.sgStatus.status > 2 && !self.isEmpty { if self.isPinned { var desiredAction = PINNED_MESSAGE_ACTION if let chatId = chatId, let exceptionAction = PINNED_MESSAGE_ACTION_EXCEPTIONS["\(chatId)"] { @@ -2400,7 +2405,7 @@ extension NotificationContent { return false } var forceIsSilent: Bool { - if !self.silent { + if self.sgStatus.status > 2 && !self.silent { if self.isPinned { var desiredAction = PINNED_MESSAGE_ACTION if let chatId = chatId, let exceptionAction = PINNED_MESSAGE_ACTION_EXCEPTIONS["\(chatId)"] { diff --git a/Telegram/Telegram-iOS/SGDucky.alticon/SGDucky@2x.png b/Telegram/Telegram-iOS/SGDucky.alticon/SGDucky@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4ee59e65b7ba3e6e7cb77b7deca477adc064f2 GIT binary patch literal 10153 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 XjsbOQ&#T$L00000NkvXXu0mjfYRl2q literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/SGDucky.alticon/SGDucky@3x.png b/Telegram/Telegram-iOS/SGDucky.alticon/SGDucky@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec818f67351a422d20420cd10a0b9e99fae8323 GIT binary patch literal 16518 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/SGGold.alticon/SGGold@2x.png b/Telegram/Telegram-iOS/SGGold.alticon/SGGold@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1e929251b5d5cdce683ac07f00e4fa3d09259ef7 GIT binary patch literal 14070 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 U`ANHFM*si-07*qoM6N<$g3HP&tpET3 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/SGPro.alticon/SGPro@2x.png b/Telegram/Telegram-iOS/SGPro.alticon/SGPro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bdeaaac60f1bed2f20895ad3f1f560facdd5e04c GIT binary patch literal 13753 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 literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/SGPro.alticon/SGPro@3x.png b/Telegram/Telegram-iOS/SGPro.alticon/SGPro@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..30464e4635de0353c387af97774ffe235fba9abd GIT binary patch literal 28884 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 n=wJ0sN ViewController + func makeSGPayWallController(context: AccountContext) -> ViewController? + func makeSGUpdateIOSController() -> ViewController + var currentInAppNotificationSettings: Atomic { get } var currentMediaInputSettings: Atomic { get } var currentStickerSettings: Atomic { get } diff --git a/submodules/AccountUtils/Sources/AccountUtils.swift b/submodules/AccountUtils/Sources/AccountUtils.swift index 673ea24151..df544dc075 100644 --- a/submodules/AccountUtils/Sources/AccountUtils.swift +++ b/submodules/AccountUtils/Sources/AccountUtils.swift @@ -18,7 +18,7 @@ public func activeAccountsAndPeers(context: AccountContext, includePrimary: Bool func accountWithPeer(_ context: AccountContext) -> Signal<(AccountContext, EnginePeer, Int32)?, NoError> { return combineLatest(context.account.postbox.peerView(id: context.account.peerId), renderedTotalUnreadCount(accountManager: sharedContext.accountManager, engine: context.engine)) |> map { view, totalUnreadCount -> (EnginePeer?, Int32) in - return (view.peers[view.peerId].flatMap(EnginePeer.init) ?? EnginePeer.init(TelegramUser(id: view.peerId, accessHash: nil, firstName: "IMPORTED", lastName: "\(view.peerId.id._internalGetInt64Value())", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: UserInfoFlags(), emojiStatus: nil, usernames: [], storiesHidden: nil, nameColor: nil, backgroundEmojiId: nil, profileColor: nil, profileBackgroundEmojiId: nil, subscriberCount: nil, verificationIconFileId: nil)), totalUnreadCount.0) + return (view.peers[view.peerId].flatMap(EnginePeer.init) ?? EnginePeer.init(TelegramUser(id: view.peerId, accessHash: nil, firstName: "RESTORED", lastName: "\(view.peerId.id._internalGetInt64Value())", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: UserInfoFlags(), emojiStatus: nil, usernames: [], storiesHidden: nil, nameColor: nil, backgroundEmojiId: nil, profileColor: nil, profileBackgroundEmojiId: nil, subscriberCount: nil, verificationIconFileId: nil)), totalUnreadCount.0) } |> distinctUntilChanged { lhs, rhs in if lhs.0 != rhs.0 { diff --git a/submodules/AttachmentTextInputPanelNode/Sources/AttachmentTextInputPanelNode.swift b/submodules/AttachmentTextInputPanelNode/Sources/AttachmentTextInputPanelNode.swift index 004161f1a0..dc9cf2e78c 100644 --- a/submodules/AttachmentTextInputPanelNode/Sources/AttachmentTextInputPanelNode.swift +++ b/submodules/AttachmentTextInputPanelNode/Sources/AttachmentTextInputPanelNode.swift @@ -509,7 +509,7 @@ public class AttachmentTextInputPanelNode: ASDisplayNode, TGCaptionPanelView, AS } // MARK: Swiftgram - self.initToolbarIfNeeded() + self.initToolbarIfNeeded(context: context) } public var sendPressed: ((NSAttributedString?) -> Void)? @@ -636,7 +636,7 @@ public class AttachmentTextInputPanelNode: ASDisplayNode, TGCaptionPanelView, AS textInputNode.view.addGestureRecognizer(recognizer) textInputNode.textView.accessibilityHint = self.textPlaceholderNode.attributedText?.string - self.initToolbarIfNeeded() + self.initToolbarIfNeeded(context: self.context) } private func textFieldMaxHeight(_ maxHeight: CGFloat, metrics: LayoutMetrics) -> CGFloat { @@ -1914,10 +1914,10 @@ public class AttachmentTextInputPanelNode: ASDisplayNode, TGCaptionPanelView, AS // MARK: Swiftgram extension AttachmentTextInputPanelNode { - func initToolbarIfNeeded() { + func initToolbarIfNeeded(context: AccountContext) { guard #available(iOS 13.0, *) else { return } guard SGSimpleSettings.shared.inputToolbar else { return } - guard SGSimpleSettings.shared.b else { return } + guard context.sharedContext.immediateSGStatus.status > 1 else { return } guard self.toolbarNode == nil else { return } let toolbarView = ChatToolbarView( onQuote: { [weak self] in diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift index 9a94ae2138..6342c1ba04 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift @@ -394,6 +394,15 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { case "SGBeta": name = "β Beta" bordered = false + case "SGPro": + name = "Pro" + bordered = false + case "SGGold": + name = "Gold" + bordered = false + case "SGDucky": + name = "Ducky" + bordered = false case "BlueIcon": name = item.strings.Appearance_AppIconDefault case "BlackIcon": @@ -424,7 +433,7 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { name = icon.name } - imageNode.setup(theme: item.theme, icon: image, title: NSAttributedString(string: name, font: selected ? selectedTextFont : textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), locked: !item.isPremium && icon.isPremium, color: item.theme.list.itemPrimaryTextColor, bordered: bordered, selected: selected, action: { + imageNode.setup(theme: item.theme, icon: image, title: NSAttributedString(string: name, font: selected ? selectedTextFont : textFont, textColor: selected ? item.theme.list.itemAccentColor : item.theme.list.itemPrimaryTextColor, paragraphAlignment: .center), locked: !item.isPremium && icon.isSGPro, color: item.theme.list.itemPrimaryTextColor, bordered: bordered, selected: selected, action: { item.updated(icon) }) } diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index 5a0973a866..b69e1212a1 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -567,6 +567,13 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The controller?.replace(with: c) } pushControllerImpl?(controller) + // MARK: Swiftgram + } else if icon.isSGPro && context.sharedContext.immediateSGStatus.status < 2 { + if let payWallController = context.sharedContext.makeSGPayWallController(context: context) { + presentControllerImpl?(payWallController, ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + } else { + presentControllerImpl?(context.sharedContext.makeSGUpdateIOSController(), nil) + } } else { currentAppIconName.set(icon.name) context.sharedContext.applicationBindings.requestSetAlternateIconName(icon.name, { _ in @@ -1027,12 +1034,14 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The }) }) - let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings, SharedDataKeys.chatThemes, ApplicationSpecificSharedDataKeys.mediaDisplaySettings]), cloudThemes.get(), availableAppIcons, currentAppIconName.get(), removedThemeIndexesPromise.get(), animatedEmojiStickers, context.account.postbox.peerView(id: context.account.peerId), context.engine.data.subscribe(TelegramEngine.EngineData.Item.Peer.Peer(id: context.account.peerId))) + let signal = combineLatest(queue: .mainQueue(), context.sharedContext.presentationData, context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings, SharedDataKeys.chatThemes, ApplicationSpecificSharedDataKeys.mediaDisplaySettings, ApplicationSpecificSharedDataKeys.sgStatus]), cloudThemes.get(), availableAppIcons, currentAppIconName.get(), removedThemeIndexesPromise.get(), animatedEmojiStickers, context.account.postbox.peerView(id: context.account.peerId), context.engine.data.subscribe(TelegramEngine.EngineData.Item.Peer.Peer(id: context.account.peerId))) |> map { presentationData, sharedData, cloudThemes, availableAppIcons, currentAppIconName, removedThemeIndexes, animatedEmojiStickers, peerView, accountPeer -> (ItemListControllerState, (ItemListNodeState, Any)) in let settings = sharedData.entries[ApplicationSpecificSharedDataKeys.presentationThemeSettings]?.get(PresentationThemeSettings.self) ?? PresentationThemeSettings.defaultSettings let mediaSettings = sharedData.entries[ApplicationSpecificSharedDataKeys.mediaDisplaySettings]?.get(MediaDisplaySettings.self) ?? MediaDisplaySettings.defaultSettings - let isPremium = peerView.peers[peerView.peerId]?.isPremium ?? false + // MARK: Swiftgram + let sgStatus = sharedData.entries[ApplicationSpecificSharedDataKeys.sgStatus]?.get(SGStatus.self) ?? SGStatus.default + let isPremium = sgStatus.status > 1 let themeReference: PresentationThemeReference if presentationData.autoNightModeTriggered { diff --git a/submodules/TelegramPresentationData/Sources/PresentationData.swift b/submodules/TelegramPresentationData/Sources/PresentationData.swift index 8ad523ddd1..3923b5a349 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationData.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationData.swift @@ -46,8 +46,10 @@ public struct PresentationAppIcon: Equatable { public let imageName: String public let isDefault: Bool public let isPremium: Bool + public let isSGPro: Bool - public init(name: String, imageName: String, isDefault: Bool = false, isPremium: Bool = false) { + public init(isSGPro: Bool = false, name: String, imageName: String, isDefault: Bool = false, isPremium: Bool = false) { + self.isSGPro = isSGPro self.name = name self.imageName = imageName self.isDefault = isDefault diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesSettings.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesSettings.swift index 01fcc66234..a414a11cb0 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesSettings.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesSettings.swift @@ -64,6 +64,7 @@ private func renderIcon(name: String, scaleFactor: CGFloat = 1.0, backgroundColo public struct PresentationResourcesSettings { public static let swiftgram = renderIcon(name: "SwiftgramSettings", scaleFactor: 30.0 / 512.0) + public static let swiftgramPro = renderIcon(name: "SwiftgramPro", scaleFactor: 30.0 / 256.0) public static let editProfile = renderIcon(name: "Settings/Menu/EditProfile") public static let proxy = renderIcon(name: "Settings/Menu/Proxy") public static let savedMessages = renderIcon(name: "Settings/Menu/SavedMessages") diff --git a/submodules/TelegramUI/BUILD b/submodules/TelegramUI/BUILD index 951c3e9ef8..73678f073d 100644 --- a/submodules/TelegramUI/BUILD +++ b/submodules/TelegramUI/BUILD @@ -19,7 +19,9 @@ sgdeps = [ "//Swiftgram/SGDebugUI:SGDebugUI", "//Swiftgram/SGInputToolbar:SGInputToolbar", "//Swiftgram/SGIAP:SGIAP", - "//Swiftgram/SGPayWall:SGPayWall" + "//Swiftgram/SGPayWall:SGPayWall", + "//Swiftgram/SGProUI:SGProUI", + "//Swiftgram/SGKeychainBackupManager:SGKeychainBackupManager", # "//Swiftgram/SGContentAnalysis:SGContentAnalysis" ] diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift b/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift index 9c9243ce83..7e293f2c68 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift @@ -693,7 +693,7 @@ open class ChatMessageItemView: ListViewItemNode, ChatMessageItemNodeProtocol { open func setupItem(_ item: ChatMessageItem, synchronousLoad: Bool) { self.item = item - if !self.wasFilteredKeywordTested && !SGSimpleSettings.shared.messageFilterKeywords.isEmpty { + if !self.wasFilteredKeywordTested && !SGSimpleSettings.shared.messageFilterKeywords.isEmpty && SGSimpleSettings.shared.ephemeralStatus > 1 { let incomingMessage = item.message.effectivelyIncoming(item.context.account.peerId) if incomingMessage { if let matchedKeyword = SGSimpleSettings.shared.messageFilterKeywords.first(where: { item.message.text.contains($0) }) { diff --git a/submodules/TelegramUI/Components/MessageInputPanelComponent/Sources/MessageInputPanelComponent.swift b/submodules/TelegramUI/Components/MessageInputPanelComponent/Sources/MessageInputPanelComponent.swift index 944796b9e5..f4fb5b9100 100644 --- a/submodules/TelegramUI/Components/MessageInputPanelComponent/Sources/MessageInputPanelComponent.swift +++ b/submodules/TelegramUI/Components/MessageInputPanelComponent/Sources/MessageInputPanelComponent.swift @@ -528,8 +528,8 @@ public final class MessageInputPanelComponent: Component { public var likeIconView: UIView? { return (self.likeButton.view as? MessageInputActionButtonComponent.View)?.likeIconView } - - override init(frame: CGRect) { + // MARK: Swifgtram + init(context: AccountContext, frame: CGRect) { self.fieldBackgroundView = BlurredBackgroundView(color: UIColor(white: 0.0, alpha: 0.5), enableBlur: true) self.vibrancyEffectView = UIVisualEffectView(effect: UIVibrancyEffect(blurEffect: UIBlurEffect(style: .dark))) @@ -573,7 +573,7 @@ public final class MessageInputPanelComponent: Component { ) // MARK: Swiftgram - self.initToolbarIfNeeded() + self.initToolbarIfNeeded(context: context) } required init?(coder: NSCoder) { @@ -2277,7 +2277,7 @@ public final class MessageInputPanelComponent: Component { } public func makeView() -> View { - return View(frame: CGRect()) + return View(context: self.context, frame: CGRect()) } public func update(view: View, availableSize: CGSize, state: EmptyComponentState, environment: Environment, transition: ComponentTransition) -> CGSize { @@ -2328,10 +2328,10 @@ final class ViewForOverlayContent: UIView { extension MessageInputPanelComponent.View { - func initToolbarIfNeeded() { + func initToolbarIfNeeded(context: AccountContext) { guard #available(iOS 13.0, *) else { return } guard SGSimpleSettings.shared.inputToolbar else { return } - guard SGSimpleSettings.shared.b else { return } + guard context.sharedContext.immediateSGStatus.status > 1 else { return } guard self.toolbarView == nil else { return } let notificationName = Notification.Name("sgToolbarAction") let toolbar = ChatToolbarView( diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift index bb75a2df3d..978f22a982 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift @@ -504,6 +504,7 @@ private enum PeerInfoContextSubject { private enum PeerInfoSettingsSection { case swiftgram + case swiftgramPro case avatar case edit case proxy @@ -947,7 +948,6 @@ private func settingsItems(showProfileId: Bool, data: PeerInfoScreenData?, conte } } - let sgSectionId = 0 // let locale = presentationData.strings.baseLanguageCode // MARK: Swiftgram let hasNewSGFeatures = { @@ -960,7 +960,10 @@ private func settingsItems(showProfileId: Bool, data: PeerInfoScreenData?, conte swiftgramLabel = .none } - items[.swiftgram]!.append(PeerInfoScreenDisclosureItem(id: sgSectionId, label: swiftgramLabel, text: "Swiftgram", icon: PresentationResourcesSettings.swiftgram, action: { + items[.swiftgram]!.append(PeerInfoScreenDisclosureItem(id: 0, label: .titleBadge(presentationData.strings.Settings_New, presentationData.theme.list.itemAccentColor), text: "Swiftgram Pro", icon: PresentationResourcesSettings.swiftgramPro, action: { + interaction.openSettings(.swiftgramPro) + })) + items[.swiftgram]!.append(PeerInfoScreenDisclosureItem(id: 1, label: swiftgramLabel, text: "Swiftgram", icon: PresentationResourcesSettings.swiftgram, action: { interaction.openSettings(.swiftgram) })) @@ -10247,6 +10250,16 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro switch section { case .swiftgram: self.controller?.push(sgSettingsController(context: self.context)) + case .swiftgramPro: + if self.context.sharedContext.immediateSGStatus.status > 1 { + self.controller?.push(self.context.sharedContext.makeSGProController(context: self.context)) + } else { + if let payWallController = self.context.sharedContext.makeSGPayWallController(context: self.context) { + self.controller?.present(payWallController, in: .window(.root), with: ViewControllerPresentationArguments(presentationAnimation: .modalSheet)) + } else { + self.controller?.present(self.context.sharedContext.makeSGUpdateIOSController(), animated: true) + } + } case .avatar: self.controller?.openAvatarForEditing() case .edit: diff --git a/submodules/TelegramUI/Sources/AppDelegate.swift b/submodules/TelegramUI/Sources/AppDelegate.swift index 92029fa5a5..bca2666b4a 100644 --- a/submodules/TelegramUI/Sources/AppDelegate.swift +++ b/submodules/TelegramUI/Sources/AppDelegate.swift @@ -850,6 +850,10 @@ private func extractAccountManagerState(records: AccountRecordsView 1 else { return } guard self.toolbarNode == nil else { return } let toolbarView = ChatToolbarView( onQuote: { [weak self] in diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index 820309927f..32a1b28fa9 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1,5 +1,9 @@ // MARK: Swiftgram import SGIAP +import SGPayWall +import SGProUI +import SGSimpleSettings +// import Foundation import UIKit import AsyncDisplayKit @@ -484,6 +488,8 @@ public final class SharedAccountContextImpl: SharedAccountContext { |> deliverOnMainQueue).start(next: { sharedData in if let settings = sharedData.entries[ApplicationSpecificSharedDataKeys.sgStatus]?.get(SGStatus.self) { let _ = immediateSGStatusValue.swap(settings) + SGSimpleSettings.shared.ephemeralStatus = settings.status + SGSimpleSettings.shared.status = settings.status } }) self.initSGIAP(isMainApp: applicationBindings.isMainApp) @@ -3050,4 +3056,39 @@ extension SharedAccountContextImpl { self.SGIAP = nil } } + + public func makeSGProController(context: AccountContext) -> ViewController { + let controller = sgProController(context: context) + return controller + } + + public func makeSGPayWallController(context: AccountContext) -> ViewController? { + guard #available(iOS 13.0, *) else { + return nil + } + guard let sgIAP = self.SGIAP else { + return nil + } + + let statusSignal = self.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.sgStatus]) + |> map { sharedData -> Int64 in + let sgStatus = sharedData.entries[ApplicationSpecificSharedDataKeys.sgStatus]?.get(SGStatus.self) ?? SGStatus.default + return sgStatus.status + } + + let proController = self.makeSGProController(context: context) + let payWallController = sgPayWallController(statusSignal: statusSignal, replacementController: proController, presentationData: self.currentPresentationData.with { $0 }, SGIAPManager: sgIAP, openUrl: self.applicationBindings.openUrl) + return payWallController + } + + public func makeSGUpdateIOSController() -> ViewController { + let presentationData = self.currentPresentationData.with { $0 } + let controller = UndoOverlayController( + presentationData: presentationData, + content: .info(title: nil, text: "Common.UpdateOS".i18n(presentationData.strings.baseLanguageCode), timeout: nil, customUndoText: nil), + elevatedLayout: false, + action: { _ in return false } + ) + return controller + } }