Skip to content

Commit

Permalink
Fix hardware keyboard detection in Shortcuts Bar setup
Browse files Browse the repository at this point in the history
- Update isHardwareKB in KBTracker when keyboard state changes.
- Stop overriding inputAssistantItem, which is advised against in UIKit's documentation.
- Add comment on why _keyboardWillChangeFrame is disabled.
  • Loading branch information
l2dy committed Mar 17, 2024
1 parent e4bb980 commit 01d5c8f
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 38 deletions.
4 changes: 4 additions & 0 deletions Blink/KBTracker.swift
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ class KBObserver: NSObject, UIInteraction {
return
}

KBTracker.shared.detectHardwareKBWithSoftwareKBHeight(height: kbEndFrame.height)

self.kbScreenFrame = kbEndFrame
self.view?.setNeedsLayout()
NotificationCenter.default.post(name: NSNotification.Name(rawValue: LayoutManagerBottomInsetDidUpdate), object: nil)
Expand All @@ -116,6 +118,8 @@ class KBObserver: NSObject, UIInteraction {
}

@objc private func _keyboardWillChangeFrame(notification: Notification) {
// keyboardWillChangeFrameNotification always comes with a corresponding keyboardWillShowNotification or keyboardWillHideNotification.
// Code moved to the more explicit show and hide notifications.
return
guard
let screen = notification.object as? UIScreen,
Expand Down
68 changes: 30 additions & 38 deletions Blink/SmarterKeys/SmarterTermInput.swift
Original file line number Diff line number Diff line change
Expand Up @@ -175,34 +175,6 @@ class CaretHider {
reportLang(lang, isHardwareKB: kbView.traits.isHKBAttached)
}

override var inputAssistantItem: UITextInputAssistantItem {
let item = super.inputAssistantItem
if KBTracker.shared.isHardwareKB {
item.trailingBarButtonGroups = []
item.leadingBarButtonGroups = []
} else if _barButtonItemGroup != nil {
item.leadingBarButtonGroups = []
if item.trailingBarButtonGroups.first != _barButtonItemGroup || item.trailingBarButtonGroups.count != 1 {
item.trailingBarButtonGroups = [_barButtonItemGroup]

// Reload input views later. Fixes crash for detaching/attaching KB
if let contentView = self.contentView() {
DispatchQueue.main.async {
contentView.reloadInputViews()
}
}

}
kbView.isHidden = false

} else {
item.trailingBarButtonGroups = []
item.leadingBarButtonGroups = []
}

return item
}

override func becomeFirstResponder() -> Bool {

sync(traits: KBTracker.shared.kbTraits, device: KBTracker.shared.kbDevice, hideSmartKeysWithHKB: KBTracker.shared.hideSmartKeysWithHKB)
Expand Down Expand Up @@ -275,21 +247,41 @@ class CaretHider {

func sync(traits: KBTraits, device: KBDevice, hideSmartKeysWithHKB: Bool) {
kbView.kbDevice = device
kbView.traits = traits

defer {

kbView.traits = traits
if let scene = window?.windowScene {
if traitCollection.userInterfaceIdiom == .phone {
kbView.traits.isPortrait = scene.interfaceOrientation.isPortrait
} else if kbView.traits.isFloatingKB {
kbView.traits.isPortrait = true
} else {
kbView.traits.isPortrait = scene.interfaceOrientation.isPortrait
}
}

if let scene = window?.windowScene {
if traitCollection.userInterfaceIdiom == .phone {
kbView.traits.isPortrait = scene.interfaceOrientation.isPortrait
} else if kbView.traits.isFloatingKB {
kbView.traits.isPortrait = true
} else {
kbView.traits.isPortrait = scene.interfaceOrientation.isPortrait
// Update Shortcuts Bar depending on if Hardware KeyBoard (HKB) is attached.
let item = inputAssistantItem
if traits.isHKBAttached {
item.trailingBarButtonGroups = []
item.leadingBarButtonGroups = []
} else if _barButtonItemGroup != nil {
item.leadingBarButtonGroups = []
if item.trailingBarButtonGroups.first != _barButtonItemGroup || item.trailingBarButtonGroups.count != 1 {
item.trailingBarButtonGroups = [_barButtonItemGroup]

// Reload input views later. Fixes crash for detaching/attaching KB
if let contentView = self.contentView() {
DispatchQueue.main.async {
contentView.reloadInputViews()
}
}

}
kbView.isHidden = false

} else {
item.trailingBarButtonGroups = []
item.leadingBarButtonGroups = []
}

if traitCollection.userInterfaceIdiom == .phone {
Expand Down

0 comments on commit 01d5c8f

Please sign in to comment.