mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-13 04:09:25 +00:00
Use InstallableKeyboard struct in KeymanEngine
This commit is contained in:
parent
9ca720426e
commit
1a286d237c
15 changed files with 362 additions and 1006 deletions
|
|
@ -67,6 +67,7 @@
|
|||
C082CE151F90AFD400860F02 /* Collection+SafeAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = C082CE141F90AFD400860F02 /* Collection+SafeAccess.swift */; };
|
||||
C0959CD41F99C44E00B616BC /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0959CD31F99C44E00B616BC /* Constants.swift */; };
|
||||
C0A93A541F8B21240079948B /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A93A531F8B21240079948B /* Manager.swift */; };
|
||||
C0B901AA1FA1AFC200764EB8 /* UserDefaults+Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B901A91FA1AFC200764EB8 /* UserDefaults+Types.swift */; };
|
||||
C0CE581E1F877B4D00AE6A7E /* NSNotification.Name+Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0CE581D1F877B4D00AE6A7E /* NSNotification.Name+Notifications.swift */; };
|
||||
C0D3F35E1F9F33490055C7CF /* Options.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D3F35D1F9F33490055C7CF /* Options.swift */; };
|
||||
C0D3F3601F9F3AD80055C7CF /* InstallableKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0D3F35F1F9F3AD80055C7CF /* InstallableKeyboard.swift */; };
|
||||
|
|
@ -184,6 +185,7 @@
|
|||
C0959CD31F99C44E00B616BC /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
|
||||
C0A5FF361F6682EB00BE740C /* PopoverView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PopoverView.swift; sourceTree = "<group>"; };
|
||||
C0A93A531F8B21240079948B /* Manager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Manager.swift; sourceTree = "<group>"; };
|
||||
C0B901A91FA1AFC200764EB8 /* UserDefaults+Types.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults+Types.swift"; sourceTree = "<group>"; };
|
||||
C0CE581D1F877B4D00AE6A7E /* NSNotification.Name+Notifications.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSNotification.Name+Notifications.swift"; sourceTree = "<group>"; };
|
||||
C0D3F35D1F9F33490055C7CF /* Options.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Options.swift; sourceTree = "<group>"; };
|
||||
C0D3F35F1F9F3AD80055C7CF /* InstallableKeyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstallableKeyboard.swift; sourceTree = "<group>"; };
|
||||
|
|
@ -385,6 +387,7 @@
|
|||
C075EB051F8EFF870041F4BD /* String+Helpers.swift */,
|
||||
C082CE141F90AFD400860F02 /* Collection+SafeAccess.swift */,
|
||||
C06085B31F9485E40057E5B9 /* UIButton+Helpers.swift */,
|
||||
C0B901A91FA1AFC200764EB8 /* UserDefaults+Types.swift */,
|
||||
);
|
||||
path = Extension;
|
||||
sourceTree = "<group>";
|
||||
|
|
@ -752,6 +755,7 @@
|
|||
C0CE581E1F877B4D00AE6A7E /* NSNotification.Name+Notifications.swift in Sources */,
|
||||
C0A93A541F8B21240079948B /* Manager.swift in Sources */,
|
||||
C06D373E1F81F5C400F61AE0 /* KeyboardInfoViewController.swift in Sources */,
|
||||
C0B901AA1FA1AFC200764EB8 /* UserDefaults+Types.swift in Sources */,
|
||||
C06D373F1F81F5C400F61AE0 /* KeyboardPickerViewController.swift in Sources */,
|
||||
C0324B911F8763E100AF3785 /* TextViewDelegateProxy.swift in Sources */,
|
||||
C040E50E1F85FF8A00901EE4 /* KeyPreviewView.swift in Sources */,
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ public struct Key {
|
|||
static let update = "update"
|
||||
}
|
||||
|
||||
// TODO: Remove
|
||||
public struct DefaultKeyboard {
|
||||
public static let keyboardID = "european2"
|
||||
public static let languageID = "eng"
|
||||
|
|
@ -84,3 +85,16 @@ public struct DefaultKeyboard {
|
|||
Key.font: keyboardFont
|
||||
]
|
||||
}
|
||||
|
||||
public struct Constants {
|
||||
private static let defaultFont = Font(family: "LatinWeb", source: ["DejaVuSans.ttf"], size: nil)
|
||||
public static let defaultKeyboard = InstallableKeyboard(id: "european2",
|
||||
name: "EuroLatin2 Keyboard",
|
||||
languageID: "eng",
|
||||
languageName: "English",
|
||||
version: "1.6",
|
||||
isRTL: false,
|
||||
font: defaultFont,
|
||||
oskFont: nil,
|
||||
isCustom: false)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,55 @@
|
|||
//
|
||||
// UserDefaults+Types.swift
|
||||
// KeymanEngine
|
||||
//
|
||||
// Created by Gabriel Wong on 2017-10-26.
|
||||
// Copyright © 2017 SIL International. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
public extension UserDefaults {
|
||||
public func installableKeyboards(forKey key: String) -> [InstallableKeyboard]? {
|
||||
guard let array = array(forKey: key) as? [Data] else {
|
||||
return nil
|
||||
}
|
||||
let decoder = PropertyListDecoder()
|
||||
do {
|
||||
return try array.map { try decoder.decode(InstallableKeyboard.self, from: $0) }
|
||||
} catch {
|
||||
Manager.shared.kmLog("UserDefaults: Error decoding keyboards: \(error)", checkDebugPrinting: false)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
public func set(_ keyboards: [InstallableKeyboard], forKey key: String) {
|
||||
let encoder = PropertyListEncoder()
|
||||
do {
|
||||
let array = try keyboards.map { try encoder.encode($0) }
|
||||
set(array, forKey: key)
|
||||
} catch {
|
||||
Manager.shared.kmLog("UserDefaults: Error encoding keyboards: \(error)", checkDebugPrinting: false)
|
||||
}
|
||||
}
|
||||
|
||||
public func installableKeyboard(forKey key: String) -> InstallableKeyboard? {
|
||||
if let data = self.data(forKey: key) {
|
||||
do {
|
||||
return try PropertyListDecoder().decode(InstallableKeyboard.self, from: data)
|
||||
} catch {
|
||||
Manager.shared.kmLog("UserDefaults: Error decoding keyboard: \(error)", checkDebugPrinting: false)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
public func set(_ keyboard: InstallableKeyboard, forKey key: String) {
|
||||
do {
|
||||
let data = try PropertyListEncoder().encode(keyboard)
|
||||
set(data, forKey: key)
|
||||
} catch {
|
||||
Manager.shared.kmLog("UserDefaults: Error encoding keyboard: \(error)", checkDebugPrinting: false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -54,7 +54,7 @@ open class InputViewController: UIInputViewController, KeymanWebViewDelegate {
|
|||
|
||||
private var keyboardListCount: Int {
|
||||
let userData = Manager.shared.activeUserDefaults()
|
||||
let keyboardList = userData.array(forKey: Key.userKeyboardsList)
|
||||
let keyboardList = userData.installableKeyboards(forKey: Key.userKeyboardsList)
|
||||
return keyboardList?.count ?? 0
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class KeyboardMenuView: UIView, UITableViewDelegate, UITableViewDataSource, UIGe
|
|||
}
|
||||
|
||||
let userData = Manager.shared.activeUserDefaults()
|
||||
let keyboardList = userData.array(forKey: Key.userKeyboardsList)
|
||||
let keyboardList = userData.installableKeyboards(forKey: Key.userKeyboardsList)
|
||||
|
||||
let titleCloseButton: String
|
||||
if let closeButtonTitle = closeButtonTitle {
|
||||
|
|
@ -290,13 +290,10 @@ class KeyboardMenuView: UIView, UITableViewDelegate, UITableViewDataSource, UIGe
|
|||
cell.isSelected = false
|
||||
cell.accessoryType = .disclosureIndicator
|
||||
} else {
|
||||
let keyboard = tableList[indexPath.row] as? [AnyHashable: Any]
|
||||
let languageID = keyboard?[Key.languageId] as? String
|
||||
let keyboardID = keyboard?[Key.keyboardId] as? String
|
||||
cell.textLabel?.text = keyboard?[Key.keyboardName] as? String
|
||||
let keyboard = tableList[indexPath.row] as! InstallableKeyboard
|
||||
cell.textLabel?.text = keyboard.name
|
||||
cell.tag = indexPath.row
|
||||
if (Manager.shared.languageID == languageID) &&
|
||||
(Manager.shared.keyboardID == keyboardID) {
|
||||
if (Manager.shared.languageID == keyboard.languageID) && (Manager.shared.keyboardID == keyboard.id) {
|
||||
cell.selectionStyle = .none
|
||||
cell.isSelected = true
|
||||
cell.accessoryType = .checkmark
|
||||
|
|
@ -338,18 +335,10 @@ class KeyboardMenuView: UIView, UITableViewDelegate, UITableViewDataSource, UIGe
|
|||
inputViewController?.advanceToNextInputMode()
|
||||
return
|
||||
}
|
||||
guard let kb = tableList[index] as? [AnyHashable: Any] else {
|
||||
guard let kb = tableList[index] as? InstallableKeyboard else {
|
||||
return
|
||||
}
|
||||
let langID = kb[Key.languageId] as? String
|
||||
let kbID = kb[Key.keyboardId] as? String
|
||||
let langName = kb[Key.languageName] as? String
|
||||
let kbName = kb[Key.keyboardName] as? String
|
||||
let font = kb[Key.font] as? String
|
||||
let oskFont = kb[Key.oskFont] as? String
|
||||
|
||||
if Manager.shared.setKeyboard(withID: kbID!, languageID: langID!, keyboardName: kbName,
|
||||
languageName: langName, font: font, oskFont: oskFont) {
|
||||
if Manager.shared.setKeyboard(kb) {
|
||||
tableView?.reloadData()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -155,24 +155,16 @@ class KeyboardInfoViewController: UITableViewController, UIAlertViewDelegate {
|
|||
|
||||
if alertView.tag == 1 {
|
||||
let userData = Manager.shared.activeUserDefaults()
|
||||
let userKeyboards = userData.array(forKey: Key.userKeyboardsList) as! [[String: String]]
|
||||
let kbDict = userKeyboards[keyboardIndex]
|
||||
let userKeyboards = userData.installableKeyboards(forKey: Key.userKeyboardsList)!
|
||||
let kb = userKeyboards[keyboardIndex]
|
||||
|
||||
if Manager.shared.removeKeyboard(at: keyboardIndex) {
|
||||
if isCurrentKeyboard {
|
||||
// Select default keyboard
|
||||
|
||||
let kbID = userKeyboards[0][Key.keyboardId]!
|
||||
let langID = userKeyboards[0][Key.languageId]!
|
||||
let kbName = userKeyboards[0][Key.keyboardName]
|
||||
let langName = userKeyboards[0][Key.languageName]
|
||||
let font = userKeyboards[0][Key.font]
|
||||
let oskFont = userKeyboards[0][Key.oskFont]
|
||||
Manager.shared.setKeyboard(withID: kbID, languageID: langID, keyboardName: kbName,
|
||||
languageName: langName, font: font, oskFont: oskFont)
|
||||
Manager.shared.setKeyboard(kb)
|
||||
}
|
||||
NotificationCenter.default.post(name: NSNotification.Name.keymanKeyboardRemoved,
|
||||
object: self, userInfo: [Key.keyboardInfo: kbDict]
|
||||
object: self, userInfo: [Key.keyboardInfo: kb]
|
||||
)
|
||||
navigationController?.popToRootViewController(animated: true)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,8 +14,8 @@ private let toolbarLabelTag = 101
|
|||
private let toolbarActivityIndicatorTag = 102
|
||||
|
||||
class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
||||
private var userKeyboards: [[String: String]] = []
|
||||
private var updateQueue: [[String: String]]?
|
||||
private var userKeyboards: [InstallableKeyboard] = []
|
||||
private var updateQueue: [InstallableKeyboard]?
|
||||
private var _isDoneButtonEnabled = false
|
||||
private var isDidUpdateCheck = false
|
||||
|
||||
|
|
@ -131,26 +131,15 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
return
|
||||
}
|
||||
|
||||
let kbDict = userKeyboards[indexPath.row]
|
||||
let selKbID = kbDict[Key.keyboardId]
|
||||
let selLangID = kbDict[Key.languageId]
|
||||
let isCurrentKB = isCurrentKeyboard(languageID: selLangID, keyboardID: selKbID)
|
||||
|
||||
if Manager.shared.removeKeyboard(at: indexPath.row) {
|
||||
let userData = Manager.shared.activeUserDefaults()
|
||||
userKeyboards = userData.array(forKey: Key.userKeyboardsList) as! [[String : String]]
|
||||
if isCurrentKB {
|
||||
let kbID = userKeyboards[0][Key.keyboardId]
|
||||
let langID = userKeyboards[0][Key.languageId]
|
||||
let kbName = userKeyboards[0][Key.keyboardName]
|
||||
let langName = userKeyboards[0][Key.languageName]
|
||||
let font = userKeyboards[0][Key.font]
|
||||
let oskFont = userKeyboards[0][Key.oskFont]
|
||||
Manager.shared.setKeyboard(withID: kbID!, languageID: langID!, keyboardName: kbName,
|
||||
languageName: langName, font: font, oskFont: oskFont)
|
||||
let kb = userKeyboards[indexPath.row]
|
||||
if isCurrentKeyboard(languageID: kb.id, keyboardID: kb.languageID) {
|
||||
let userData = Manager.shared.activeUserDefaults()
|
||||
userKeyboards = userData.installableKeyboards(forKey: Key.userKeyboardsList)!
|
||||
Manager.shared.setKeyboard(userKeyboards[0])
|
||||
}
|
||||
NotificationCenter.default.post(name: NSNotification.Name.keymanKeyboardRemoved,
|
||||
object: self, userInfo: [Key.keyboardInfo: kbDict])
|
||||
object: self, userInfo: [Key.keyboardInfo: kb])
|
||||
self.tableView.reloadData()
|
||||
}
|
||||
setIsDoneButtonEnabled(true)
|
||||
|
|
@ -163,22 +152,17 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
|
||||
func showKeyboardInfoView(with index: Int) {
|
||||
setIsDoneButtonEnabled(true)
|
||||
let kbID = userKeyboards[index][Key.keyboardId]!
|
||||
let langID = userKeyboards[index][Key.languageId]!
|
||||
let kbName = userKeyboards[index][Key.keyboardName]
|
||||
let isCustom = userKeyboards[index][Key.customKeyboard] == "Y"
|
||||
let kbVersion = userKeyboards[index][Key.keyboardVersion]
|
||||
?? Manager.shared.latestKeyboardFileVersion(withID: kbID)
|
||||
?? "1.0"
|
||||
let kb = userKeyboards[index]
|
||||
let version = kb.version
|
||||
|
||||
let infoView = KeyboardInfoViewController()
|
||||
infoView.title = kbName
|
||||
infoView.title = kb.name
|
||||
infoView.keyboardCount = userKeyboards.count
|
||||
infoView.keyboardIndex = index
|
||||
infoView.keyboardID = kbID
|
||||
infoView.languageID = langID
|
||||
infoView.keyboardVersion = kbVersion
|
||||
infoView.isCustomKeyboard = isCustom
|
||||
infoView.keyboardID = kb.id
|
||||
infoView.languageID = kb.languageID
|
||||
infoView.keyboardVersion = version
|
||||
infoView.isCustomKeyboard = kb.isCustom
|
||||
navigationController?.pushViewController(infoView, animated: true)
|
||||
}
|
||||
|
||||
|
|
@ -186,14 +170,13 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
willDisplay cell: UITableViewCell,
|
||||
forRowAt indexPath: IndexPath) {
|
||||
cell.selectionStyle = .none
|
||||
let languageID = userKeyboards[indexPath.row][Key.languageId]
|
||||
let keyboardID = userKeyboards[indexPath.row][Key.keyboardId]
|
||||
let kb = userKeyboards[indexPath.row]
|
||||
|
||||
cell.textLabel?.text = userKeyboards[indexPath.row][Key.languageName]
|
||||
cell.detailTextLabel?.text = userKeyboards[indexPath.row][Key.keyboardName]
|
||||
cell.textLabel?.text = kb.languageName
|
||||
cell.detailTextLabel?.text = kb.name
|
||||
cell.tag = indexPath.row
|
||||
|
||||
if isCurrentKeyboard(languageID: languageID, keyboardID: keyboardID) {
|
||||
if isCurrentKeyboard(languageID: kb.languageID, keyboardID: kb.id) {
|
||||
cell.selectionStyle = .blue
|
||||
cell.isSelected = true
|
||||
cell.accessoryType = .detailDisclosureButton
|
||||
|
|
@ -222,16 +205,17 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
Manager.shared.shouldReloadKeyboard = true
|
||||
|
||||
// Update keyboard version
|
||||
let downloadedKbInfo = notification.userInfo?[Key.keyboardInfo] as? [String: String]
|
||||
if let kbID = downloadedKbInfo?[Key.keyboardId],
|
||||
let currentKbInfo = Manager.shared.keyboardsInfo?[kbID] {
|
||||
Manager.shared.updateKeyboardVersion(forID: kbID, newKeyboardVersion: currentKbInfo.version)
|
||||
let keyboards = notification.userInfo?[Key.keyboardInfo] as! [InstallableKeyboard]
|
||||
for keyboard in keyboards {
|
||||
if let currentKbInfo = Manager.shared.keyboardsInfo?[keyboard.id] {
|
||||
Manager.shared.updateKeyboardVersion(forID: keyboard.id, newKeyboardVersion: currentKbInfo.version)
|
||||
}
|
||||
}
|
||||
|
||||
updateQueue!.remove(at: 0)
|
||||
if !updateQueue!.isEmpty {
|
||||
let langID = updateQueue![0][Key.languageId]!
|
||||
let kbID = updateQueue![0][Key.keyboardId]!
|
||||
let langID = updateQueue![0].languageID
|
||||
let kbID = updateQueue![0].id
|
||||
Manager.shared.downloadKeyboard(withID: kbID, languageID: langID, isUpdate: true)
|
||||
} else {
|
||||
loadUserKeyboards()
|
||||
|
|
@ -260,23 +244,13 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
navigationItem.rightBarButtonItem?.isEnabled = true
|
||||
}
|
||||
|
||||
let kbInfo = notification.userInfo?[Key.keyboardInfo] as? [String: String]
|
||||
let langID = kbInfo![Key.languageId]!
|
||||
let kbID = kbInfo![Key.keyboardId]!
|
||||
let key = "\(langID)_\(kbID)"
|
||||
let keyboardDict = Manager.shared.keyboardsDictionary[key]
|
||||
let langName = keyboardDict![Key.languageName]!
|
||||
let kbName = keyboardDict![Key.keyboardName]!
|
||||
let isRTL = keyboardDict?[Key.keyboardRTL] == "Y"
|
||||
let font = keyboardDict?[Key.font]
|
||||
let oskFont = keyboardDict?[Key.oskFont]
|
||||
|
||||
// Add keyboard.
|
||||
Manager.shared.addKeyboard(withID: kbID, languageID: langID, keyboardName: kbName,
|
||||
languageName: langName, isRTL: isRTL, isCustom: false, font: font,
|
||||
oskFont: oskFont)
|
||||
Manager.shared.setKeyboard(withID: kbID, languageID: langID, keyboardName: kbName,
|
||||
languageName: langName, font: font, oskFont: oskFont)
|
||||
let keyboards = notification.userInfo![Key.keyboardInfo] as! [InstallableKeyboard]
|
||||
for keyboard in keyboards {
|
||||
Manager.shared.addKeyboard(keyboard)
|
||||
Manager.shared.setKeyboard(keyboard)
|
||||
}
|
||||
|
||||
navigationController?.popToRootViewController(animated: true)
|
||||
}
|
||||
}
|
||||
|
|
@ -309,15 +283,7 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
|
||||
private func switchKeyboard(_ index: Int) {
|
||||
// Switch keyboard and register to user defaults.
|
||||
let langID = userKeyboards[index][Key.languageId]!
|
||||
let kbID = userKeyboards[index][Key.keyboardId]!
|
||||
let langName = userKeyboards[index][Key.languageName]
|
||||
let kbName = userKeyboards[index][Key.keyboardName]
|
||||
let font = userKeyboards[index][Key.font]
|
||||
let oskFont = userKeyboards[index][Key.oskFont]
|
||||
|
||||
if Manager.shared.setKeyboard(withID: kbID, languageID: langID, keyboardName: kbName,
|
||||
languageName: langName, font: font, oskFont: oskFont) {
|
||||
if Manager.shared.setKeyboard(userKeyboards[index]) {
|
||||
tableView.reloadData()
|
||||
}
|
||||
|
||||
|
|
@ -329,20 +295,10 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
private func loadUserKeyboards() {
|
||||
let userData = Manager.shared.activeUserDefaults()
|
||||
|
||||
if let userKeyboards = userData.array(forKey: Key.userKeyboardsList) as? [[String: String]] {
|
||||
if let userKeyboards = userData.installableKeyboards(forKey: Key.userKeyboardsList) {
|
||||
self.userKeyboards = userKeyboards
|
||||
} else {
|
||||
let kbVersion = Manager.shared.latestKeyboardFileVersion(withID: DefaultKeyboard.keyboardID)
|
||||
userKeyboards = [[
|
||||
Key.keyboardId: DefaultKeyboard.keyboardID,
|
||||
Key.languageId: DefaultKeyboard.languageID,
|
||||
Key.keyboardName: DefaultKeyboard.keyboardName,
|
||||
Key.languageName: DefaultKeyboard.languageName,
|
||||
Key.keyboardVersion: kbVersion ?? "nil",
|
||||
Key.keyboardRTL: DefaultKeyboard.keyboardRTL,
|
||||
Key.font: DefaultKeyboard.keyboardFont
|
||||
]]
|
||||
|
||||
userKeyboards = [Constants.defaultKeyboard]
|
||||
userData.set(userKeyboards, forKey: Key.userKeyboardsList)
|
||||
userData.synchronize()
|
||||
}
|
||||
|
|
@ -351,11 +307,7 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
}
|
||||
|
||||
private func isAdded(languageID langID: String, keyboardID kbID: String) -> Bool {
|
||||
return userKeyboards.contains { keyboard in
|
||||
let languageID = keyboard[Key.languageId]
|
||||
let keyboardID = keyboard[Key.keyboardId]
|
||||
return languageID == langID && keyboardID == kbID
|
||||
}
|
||||
return userKeyboards.contains { kb in kb.languageID == langID && kb.id == kbID }
|
||||
}
|
||||
|
||||
@objc func doneClicked(_ sender: Any) {
|
||||
|
|
@ -406,39 +358,34 @@ class KeyboardPickerViewController: UITableViewController, UIAlertViewDelegate {
|
|||
|
||||
isDidUpdateCheck = true
|
||||
return userKeyboards.contains { keyboard in
|
||||
let kbID = keyboard[Key.keyboardId]!
|
||||
let kbID = keyboard.id
|
||||
return Manager.shared.stateForKeyboard(withID: kbID) == .needsUpdate
|
||||
}
|
||||
}
|
||||
|
||||
private func updateKeyboards() {
|
||||
updateQueue = [[String: String]]()
|
||||
updateQueue = []
|
||||
var kbIDs = Set<String>()
|
||||
for kb in userKeyboards {
|
||||
guard let kbID = kb[Key.keyboardId] else {
|
||||
continue
|
||||
}
|
||||
let kbState = Manager.shared.stateForKeyboard(withID: kbID)
|
||||
let kbState = Manager.shared.stateForKeyboard(withID: kb.id)
|
||||
if kbState == .needsUpdate {
|
||||
if !kbIDs.contains(kbID) {
|
||||
kbIDs.insert(kbID)
|
||||
if !kbIDs.contains(kb.id) {
|
||||
kbIDs.insert(kb.id)
|
||||
updateQueue!.append(kb)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !updateQueue!.isEmpty {
|
||||
let langID = updateQueue![0][Key.languageId]!
|
||||
let kbID = updateQueue![0][Key.keyboardId]!
|
||||
let langID = updateQueue![0].languageID
|
||||
let kbID = updateQueue![0].id
|
||||
Manager.shared.downloadKeyboard(withID: kbID, languageID: langID, isUpdate: true)
|
||||
}
|
||||
}
|
||||
|
||||
private func scroll(toSelectedKeyboard animated: Bool) {
|
||||
let index = userKeyboards.index { kb in
|
||||
let langID = kb[Key.languageId]
|
||||
let kbID = kb[Key.keyboardId]
|
||||
return isCurrentKeyboard(languageID: langID, keyboardID: kbID)
|
||||
return isCurrentKeyboard(languageID: kb.languageID, keyboardID: kb.id)
|
||||
}
|
||||
|
||||
if let index = index {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ private let toolbarLabelTag = 101
|
|||
private let toolbarActivityIndicatorTag = 102
|
||||
|
||||
class LanguageDetailViewController: UITableViewController, UIAlertViewDelegate {
|
||||
private var userKeyboards: [String: [String: Any]] = [:]
|
||||
private var userKeyboards: [String: InstallableKeyboard] = [:]
|
||||
private var isUpdate = false
|
||||
private let language: Language
|
||||
|
||||
|
|
@ -154,17 +154,14 @@ class LanguageDetailViewController: UITableViewController, UIAlertViewDelegate {
|
|||
|
||||
private func loadUserKeyboards() {
|
||||
let userData = Manager.shared.activeUserDefaults()
|
||||
guard let userKbList = userData.array(forKey: Key.userKeyboardsList) as? [[String: String]],
|
||||
!userKbList.isEmpty else {
|
||||
guard let userKbList = userData.installableKeyboards(forKey: Key.userKeyboardsList), !userKbList.isEmpty else {
|
||||
userKeyboards = [:]
|
||||
return
|
||||
}
|
||||
|
||||
userKeyboards = [:]
|
||||
for kb in userKbList {
|
||||
let langID = kb[Key.languageId]
|
||||
let kbID = kb[Key.keyboardId]
|
||||
let dictKey = "\(langID!)_\(kbID!)"
|
||||
let dictKey = "\(kb.languageID)_\(kb.id)"
|
||||
userKeyboards[dictKey] = kb
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -275,16 +275,14 @@ class LanguageViewController: UITableViewController, UIAlertViewDelegate {
|
|||
func loadUserKeyboards() {
|
||||
userKeyboards = [:]
|
||||
let userData = Manager.shared.activeUserDefaults()
|
||||
guard let userKbList = userData.array(forKey: Key.userKeyboardsList) as? [[String: Any]] else {
|
||||
guard let userKbList = userData.installableKeyboards(forKey: Key.userKeyboardsList) else {
|
||||
userKeyboards = [:]
|
||||
return
|
||||
}
|
||||
|
||||
for kb in userKbList {
|
||||
if let langID = kb[Key.languageId] as? String, let kbID = kb[Key.keyboardId] as? String {
|
||||
let dictKey = "\(langID)_\(kbID)"
|
||||
userKeyboards[dictKey] = kb
|
||||
}
|
||||
let dictKey = "\(kb.languageID)_\(kb.id)"
|
||||
userKeyboards[dictKey] = kb
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -10,15 +10,15 @@ import Foundation
|
|||
|
||||
/// Mainly differs from the API `Keyboard` by having an associated language.
|
||||
public struct InstallableKeyboard: Codable {
|
||||
public let id: String
|
||||
public let name: String
|
||||
public let languageID: String
|
||||
public let languageName: String
|
||||
public let version: String
|
||||
public let isRTL: Bool
|
||||
public let font: Font?
|
||||
public let oskFont: Font?
|
||||
public let isCustom: Bool
|
||||
public var id: String
|
||||
public var name: String
|
||||
public var languageID: String
|
||||
public var languageName: String
|
||||
public var version: String
|
||||
public var isRTL: Bool
|
||||
public var font: Font?
|
||||
public var oskFont: Font?
|
||||
public var isCustom: Bool
|
||||
|
||||
public init(id: String,
|
||||
name: String,
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@ public struct Keyboard: Codable {
|
|||
let filename = try container.decode(String.self, forKey: .filename)
|
||||
let isDefault = try container.decodeIfPresent(Bool.self, forKey: .isDefault)
|
||||
let isRTL = try container.decodeIfPresent(Bool.self, forKey: .isRTL)
|
||||
// TODO: Handle both seconds and ISO 8601
|
||||
let lastModified = try container.decode(Date.self, forKey: .lastModified)
|
||||
let fileSize = try container.decode(Int.self, forKey: .fileSize)
|
||||
let version = try container.decode(String.self, forKey: .version)
|
||||
|
|
|
|||
|
|
@ -254,7 +254,7 @@ public class TextField: UITextField, UITextFieldDelegate, KeymanWebViewDelegate
|
|||
let isRTL: Bool
|
||||
if let keyboardID = Manager.shared.keyboardID,
|
||||
let languageID = Manager.shared.languageID {
|
||||
isRTL = Manager.shared.isRTLKeyboard(withID: keyboardID, languageID: languageID)
|
||||
isRTL = Manager.shared.isRTLKeyboard(withID: keyboardID, languageID: languageID) ?? false
|
||||
} else {
|
||||
isRTL = false
|
||||
}
|
||||
|
|
@ -330,10 +330,9 @@ public class TextField: UITextField, UITextFieldDelegate, KeymanWebViewDelegate
|
|||
return
|
||||
}
|
||||
|
||||
let kbInfo = notification.userInfo?[Key.keyboardInfo] as? [AnyHashable: Any]
|
||||
let keyboardID = kbInfo?[Key.keyboardId] as? String
|
||||
let languageID = kbInfo?[Key.languageId] as? String
|
||||
let fontName = Manager.shared.fontNameForKeyboard(withID: keyboardID!, languageID: languageID!)
|
||||
// TODO: Get font name directly from keyboard object
|
||||
let kb = notification.userInfo?[Key.keyboardInfo] as! InstallableKeyboard
|
||||
let fontName = Manager.shared.fontNameForKeyboard(withID: kb.id, languageID: kb.languageID)
|
||||
let fontSize = font?.pointSize ?? UIFont.systemFontSize
|
||||
if let fontName = fontName {
|
||||
font = UIFont(name: fontName, size: fontSize)
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ public class TextView: UITextView, UITextViewDelegate, UIInputViewAudioFeedback,
|
|||
let isRTL: Bool
|
||||
if let keyboardID = Manager.shared.keyboardID,
|
||||
let languageID = Manager.shared.languageID {
|
||||
isRTL = Manager.shared.isRTLKeyboard(withID: keyboardID, languageID: languageID)
|
||||
isRTL = Manager.shared.isRTLKeyboard(withID: keyboardID, languageID: languageID) ?? false
|
||||
} else {
|
||||
isRTL = false
|
||||
}
|
||||
|
|
@ -323,10 +323,9 @@ public class TextView: UITextView, UITextViewDelegate, UIInputViewAudioFeedback,
|
|||
return
|
||||
}
|
||||
|
||||
let kbInfo = notification.userInfo?[Key.keyboardInfo] as? [AnyHashable: Any]
|
||||
let keyboardID = kbInfo?[Key.keyboardId] as? String
|
||||
let languageID = kbInfo?[Key.languageId] as? String
|
||||
let fontName = Manager.shared.fontNameForKeyboard(withID: keyboardID!, languageID: languageID!)
|
||||
// TODO: Get font name directly from keyboard
|
||||
let kb = notification.userInfo?[Key.keyboardInfo] as! InstallableKeyboard
|
||||
let fontName = Manager.shared.fontNameForKeyboard(withID: kb.id, languageID: kb.languageID)
|
||||
let fontSize = font?.pointSize ?? UIFont.systemFontSize
|
||||
if let fontName = fontName {
|
||||
font = UIFont(name: fontName, size: fontSize)
|
||||
|
|
|
|||
|
|
@ -213,59 +213,30 @@ class MainViewController: UIViewController, UIAlertViewDelegate, TextViewDelegat
|
|||
|
||||
// MARK: - Responding to Keyman notifications
|
||||
@objc func keyboardDownloadStarted(_ notification: Notification) {
|
||||
let kbInfo = notification.userInfo?[Key.keyboardInfo] as? [AnyHashable: Any]
|
||||
let kbID = kbInfo?[Key.keyboardId] as? String
|
||||
let langID = kbInfo?[Key.languageId] as? String
|
||||
let kbName = kbInfo?[Key.keyboardName] as? String
|
||||
let langName = kbInfo?[Key.languageName] as? String
|
||||
if kbID != nil && langID != nil && kbName != nil && langName != nil {
|
||||
showActivityIndicator()
|
||||
}
|
||||
showActivityIndicator()
|
||||
}
|
||||
|
||||
@objc func keyboardDownloaded(_ notification: Notification) {
|
||||
// This is an example of responding to a Keyman event.
|
||||
// - for a list of all events, see KMManager.h
|
||||
|
||||
let kbInfo = notification.userInfo?[Key.keyboardInfo] as? [AnyHashable: Any]
|
||||
let kbID = kbInfo?[Key.keyboardId] as? String
|
||||
let langID = kbInfo?[Key.languageId] as? String
|
||||
let kbName = kbInfo?[Key.keyboardName] as? String
|
||||
let langName = kbInfo?[Key.languageName] as? String
|
||||
let isRTL = (kbInfo?[Key.keyboardRTL] as? String) == "Y"
|
||||
let isCustom = (kbInfo?[Key.customKeyboard] as? String) == "Y"
|
||||
let font = kbInfo?[Key.font] as? String
|
||||
let oskFont = kbInfo?[Key.oskFont] as? String
|
||||
|
||||
if let kbID = kbID,
|
||||
let langID = langID,
|
||||
let kbName = kbName,
|
||||
let langName = langName {
|
||||
Manager.shared.addKeyboard(withID: kbID, languageID: langID, keyboardName: kbName,
|
||||
languageName: langName, isRTL: isRTL, isCustom: isCustom,
|
||||
font: font, oskFont: oskFont)
|
||||
Manager.shared.setKeyboard(withID: kbID, languageID: langID, keyboardName: kbName,
|
||||
languageName: langName, font: font, oskFont: oskFont)
|
||||
perform(#selector(self.dismissActivityIndicator), with: nil, afterDelay: 1.0)
|
||||
let keyboards = notification.userInfo![Key.keyboardInfo] as! [InstallableKeyboard]
|
||||
for keyboard in keyboards {
|
||||
Manager.shared.addKeyboard(keyboard)
|
||||
Manager.shared.setKeyboard(keyboard)
|
||||
}
|
||||
perform(#selector(self.dismissActivityIndicator), with: nil, afterDelay: 1.0)
|
||||
}
|
||||
|
||||
@objc func keyboardDownloadFailed(_ notification: Notification) {
|
||||
let kbInfo = notification.userInfo?[Key.keyboardInfo] as? [AnyHashable: Any]
|
||||
let kbID = kbInfo?[Key.keyboardId] as? String
|
||||
let langID = kbInfo?[Key.languageId] as? String
|
||||
let kbName = kbInfo?[Key.keyboardName] as? String
|
||||
let langName = kbInfo?[Key.languageName] as? String
|
||||
if kbID != nil && langID != nil && kbName != nil && langName != nil {
|
||||
guard let error = notification.userInfo?[NSUnderlyingErrorKey] as? Error else {
|
||||
return
|
||||
}
|
||||
if error.localizedDescription != "Download queue is busy" {
|
||||
perform(#selector(self.dismissActivityIndicator), with: nil, afterDelay: 1.0)
|
||||
perform(#selector(self.showAlert), with: error.localizedDescription, afterDelay: 1.1)
|
||||
} else {
|
||||
showAlert(error.localizedDescription)
|
||||
}
|
||||
guard let error = notification.userInfo?[NSUnderlyingErrorKey] as? Error else {
|
||||
return
|
||||
}
|
||||
if error.localizedDescription != "Download queue is busy" {
|
||||
perform(#selector(self.dismissActivityIndicator), with: nil, afterDelay: 1.0)
|
||||
perform(#selector(self.showAlert), with: error.localizedDescription, afterDelay: 1.1)
|
||||
} else {
|
||||
showAlert(error.localizedDescription)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue