Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalUI/Stickers/StickerPickerKeyboard.swift
1 views
//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

public import SignalServiceKit

// MARK: - StickerKeyboard

public protocol StickerKeyboardDelegate: AnyObject {

    func stickerKeyboardDidRequestPresentManageStickersView(_ stickerKeyboard: StickerKeyboard)

    func stickerKeyboard(_: StickerKeyboard, didSelect stickerInfo: StickerInfo)
}

public class StickerKeyboard: CustomKeyboard {

    public weak var delegate: StickerKeyboardDelegate?

    private lazy var stickerPickerView = StickerPickerView(delegate: self)

    public init(delegate: StickerKeyboardDelegate?) {
        self.delegate = delegate

        super.init()

        backgroundColor = if #available(iOS 26, *) { .clear } else { .Signal.background }

        // Match rounded corners of the keyboard backdrop view.
        if #available(iOS 26, *) {
            contentView.clipsToBounds = true
            contentView.cornerConfiguration = .uniformTopRadius(.fixed(26))
        }

        // Need to set horizontal margins explicitly because they can't be inherited from the parent.
        let hMargin = OWSTableViewController2.cellHInnerMargin
        stickerPickerView.directionalLayoutMargins = .init(margin: hMargin)
        stickerPickerView.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(stickerPickerView)
        NSLayoutConstraint.activate([
            stickerPickerView.topAnchor.constraint(equalTo: contentView.topAnchor),
            stickerPickerView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
            stickerPickerView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
            stickerPickerView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
        ])
    }

    public required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override public func willPresent() {
        super.willPresent()
        stickerPickerView.willBePresented()
    }

    override public func wasPresented() {
        super.wasPresented()
        stickerPickerView.wasPresented()
    }
}

// MARK: StickerPacksToolbarDelegate

extension StickerKeyboard: StickerPickerViewDelegate {

    func presentManageStickersView(for stickerPickerView: StickerPickerView) {
        delegate?.stickerKeyboardDidRequestPresentManageStickersView(self)
    }

    public func didSelectSticker(_ stickerInfo: StickerInfo) {
        delegate?.stickerKeyboard(self, didSelect: stickerInfo)
    }
}