// // KeyboardViewController+Private.h // CustomKeyboard // // Created by Codex on 2026/02/22. // #import "KeyboardViewController.h" #import "Masonry.h" @class AVAudioPlayer; @class CAGradientLayer; @class KBChatMessage; @class KBChatPanelView; @class KBFunctionView; @class KBKeyBoardMainView; @class KBKeyboardSubscriptionView; @class KBSettingView; @class KBSuggestionEngine; @protocol KBChatLimitPopViewDelegate; @protocol KBChatPanelViewDelegate; @protocol KBFunctionViewDelegate; @protocol KBKeyBoardMainViewDelegate; @protocol KBKeyboardSubscriptionViewDelegate; typedef NS_ENUM(NSInteger, KBKeyboardPanelMode) { KBKeyboardPanelModeMain = 0, KBKeyboardPanelModeFunction, KBKeyboardPanelModeChat, KBKeyboardPanelModeSettings, KBKeyboardPanelModeSubscription, }; @interface KeyboardViewController () { UIButton *_nextKeyboardButton; UIView *_contentView; KBKeyBoardMainView *_keyBoardMainView; KBFunctionView *_functionView; KBSettingView *_settingView; UIImageView *_bgImageView; KBChatPanelView *_chatPanelView; KBKeyboardSubscriptionView *_subscriptionView; KBSuggestionEngine *_suggestionEngine; NSString *_currentWord; UIControl *_chatLimitMaskView; MASConstraint *_contentWidthConstraint; MASConstraint *_contentHeightConstraint; MASConstraint *_keyBoardMainHeightConstraint; MASConstraint *_chatPanelHeightConstraint; NSLayoutConstraint *_kb_heightConstraint; NSLayoutConstraint *_kb_widthConstraint; CGFloat _kb_lastPortraitWidth; CGFloat _kb_lastKeyboardHeight; UIImage *_kb_cachedGradientImage; CGSize _kb_cachedGradientSize; CAGradientLayer *_kb_defaultGradientLayer; NSString *_kb_lastAppliedThemeKey; NSMutableArray *_chatMessages; AVAudioPlayer *_chatAudioPlayer; BOOL _suppressSuggestions; BOOL _chatPanelVisible; NSString *_chatPanelBaselineText; id _kb_fullAccessObserverToken; id _kb_skinObserverToken; id _kb_localizationObserverToken; KBKeyboardPanelMode _kb_panelMode; } @property(nonatomic, strong) UIButton *nextKeyboardButton; // 系统“下一个键盘”按钮(可选) @property(nonatomic, strong) UIView *contentView; @property(nonatomic, strong) KBKeyBoardMainView *keyBoardMainView; // 功能面板视图(点击工具栏第0个时显示) @property(nonatomic, strong) KBFunctionView *functionView; // 功能面板视图(点击工具栏第0个时显示) @property(nonatomic, strong) KBSettingView *settingView; // 设置页 @property(nonatomic, strong) UIImageView *bgImageView; // 背景图(在底层) @property(nonatomic, strong) KBChatPanelView *chatPanelView; @property(nonatomic, strong) KBKeyboardSubscriptionView *subscriptionView; @property(nonatomic, strong) KBSuggestionEngine *suggestionEngine; @property(nonatomic, copy) NSString *currentWord; @property(nonatomic, assign) BOOL suppressSuggestions; @property(nonatomic, strong) UIControl *chatLimitMaskView; @property(nonatomic, strong) MASConstraint *contentWidthConstraint; @property(nonatomic, strong) MASConstraint *contentHeightConstraint; @property(nonatomic, strong) MASConstraint *keyBoardMainHeightConstraint; @property(nonatomic, strong) MASConstraint *chatPanelHeightConstraint; @property(nonatomic, strong) NSLayoutConstraint *kb_heightConstraint; @property(nonatomic, strong) NSLayoutConstraint *kb_widthConstraint; @property(nonatomic, assign) CGFloat kb_lastPortraitWidth; @property(nonatomic, assign) CGFloat kb_lastKeyboardHeight; @property(nonatomic, strong) UIImage *kb_cachedGradientImage; @property(nonatomic, assign) CGSize kb_cachedGradientSize; @property(nonatomic, strong, nullable) CAGradientLayer *kb_defaultGradientLayer; @property(nonatomic, copy, nullable) NSString *kb_lastAppliedThemeKey; @property(nonatomic, strong) NSMutableArray *chatMessages; @property(nonatomic, strong) AVAudioPlayer *chatAudioPlayer; @property(nonatomic, assign) BOOL chatPanelVisible; @property(nonatomic, copy) NSString *chatPanelBaselineText; // 打开聊天面板时宿主输入框已有的文本 @property(nonatomic, strong, nullable) id kb_fullAccessObserverToken; @property(nonatomic, strong, nullable) id kb_skinObserverToken; @property(nonatomic, strong, nullable) id kb_localizationObserverToken; @property(nonatomic, assign) KBKeyboardPanelMode kb_panelMode; @property(nonatomic, strong, nullable) id kb_appGroupObserverToken; @end @interface KeyboardViewController (KBPrivate) // UI - (void)setupUI; - (nullable KBFunctionView *)kb_functionViewIfCreated; // Panels - (void)showFunctionPanel:(BOOL)show; - (void)showSettingView:(BOOL)show; - (void)showChatPanel:(BOOL)show; - (void)showSubscriptionPanel; - (void)hideSubscriptionPanel; - (void)kb_setPanelMode:(KBKeyboardPanelMode)mode animated:(BOOL)animated; - (void)kb_ensureFunctionViewIfNeeded; - (void)kb_ensureChatPanelViewIfNeeded; - (void)kb_ensureKeyBoardMainViewIfNeeded; - (void)kb_releaseMemoryWhenKeyboardHidden; // Suggestions - (void)kb_updateCurrentWordWithInsertedText:(NSString *)text; - (void)kb_clearCurrentWord; - (void)kb_scheduleContextRefreshResetSuppression:(BOOL)resetSuppression; - (void)kb_refreshCurrentWordFromDocumentContextResetSuppression: (BOOL)resetSuppression; - (void)kb_updateSuggestionsForCurrentWord; // Chat - (void)kb_handleChatSendAction; // Theme - (void)kb_applyTheme; - (void)kb_applyDefaultSkinIfNeeded; - (void)kb_consumePendingShopSkin; - (void)kb_registerDarwinSkinInstallObserver; - (void)kb_unregisterDarwinSkinInstallObserver; // Layout - (CGFloat)kb_portraitWidth; - (CGFloat)kb_keyboardHeightForWidth:(CGFloat)width; - (CGFloat)kb_keyboardBaseHeightForWidth:(CGFloat)width; - (CGFloat)kb_chatPanelHeightForWidth:(CGFloat)width; - (void)kb_updateKeyboardLayoutIfNeeded; @end