Use InstallableKeyboard struct in KeymanEngine

This commit is contained in:
Gabriel Wong 2017-10-27 08:31:26 +07:00
parent 9ca720426e
commit 1a286d237c
15 changed files with 362 additions and 1006 deletions

View file

@ -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 */,

View file

@ -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)
}

View file

@ -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)
}
}
}

View file

@ -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
}

View file

@ -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()
}
}

View file

@ -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)
}

View file

@ -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 {

View file

@ -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
}
}

View file

@ -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

View file

@ -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,

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)
}
}