linphone-ios/Classes/Swift/Voip/Views/Fragments/NumpadView.swift

127 lines
4.1 KiB
Swift

/*
* Copyright (c) 2010-2020 Belledonne Communications SARL.
*
* This file is part of linphone-iphone
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import Foundation
import linphonesw
@objc class NumpadView: UIView {
// Layout constants
let side_margins = 10.0
let margin_top = 100.0
let eneteredDtmf_size = 40.0
let button_size = 70
let button_vertical_space = 17.0
let button_horizontal_space = 14.0
let digit_icon_inset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20)
let corner_radius = 20.0
let pad_height = 550
let side_padding = 50.0
init(superView:UIView, callData:CallData, marginTop:CGFloat, above:UIView, onDismissAction : @escaping ()->Void) {
super.init(frame:.zero)
backgroundColor = VoipTheme.voip_translucent_popup_background
layer.cornerRadius = corner_radius
clipsToBounds = true
superView.addSubview(self)
matchParentSideBorders(insetedByDx: side_margins).alignParentTop(withMargin: marginTop).alignParentBottom().done()
accessibilityIdentifier = "call_numpad_view"
accessibilityViewIsModal = true
callData.callState.observe { state in
if (state == Call.State.End) {
//never happens
onDismissAction()
}
}
// Hide numpad button
let hide = CallControlButton(buttonTheme: VoipTheme.voip_cancel_light, onClickAction: {
onDismissAction()
})
addSubview(hide)
hide.alignParentRight(withMargin: side_margins).alignParentTop(withMargin: side_margins).done()
hide.accessibilityIdentifier = "call_numpad_view_hide"
hide.accessibilityLabel = "Hide"
// DTMF History :
let eneteredDtmf = StyledLabel(VoipTheme.dtmf_label)
addSubview(eneteredDtmf)
eneteredDtmf.height(eneteredDtmf_size).matchParentSideBorders().alignUnder(view:hide,withMargin:side_margins).done()
callData.enteredDTMF.readCurrentAndObserve { (dtmfs) in
eneteredDtmf.text = dtmfs
}
eneteredDtmf.accessibilityIdentifier = "call_numpad_view_text_field"
// Digit buttons
let allRows = UIStackView()
allRows.axis = .vertical
allRows.distribution = .equalSpacing
allRows.alignment = .center
allRows.spacing = button_vertical_space
allRows.layoutMargins = UIEdgeInsets(top: 0, left: side_padding, bottom: 0, right: side_padding)
allRows.isLayoutMarginsRelativeArrangement = true
addSubview(allRows)
_ = allRows.matchParentSideBorders().alignUnder(view:eneteredDtmf,withMargin: side_margins)
for key in [["1","2","3"],["4","5","6"],["7","8","9"],["*","0","#"]] {
let newRow = addRow(allRows: allRows)
for subkey in key {
let digit = CallControlButton(width:button_size, height:button_size, imageInset: digit_icon_inset, buttonTheme: ButtonTheme(tintableStateIcons:[UIButton.State.normal.rawValue : TintableIcon(name: "voip_numpad_\(iconNameForDigit(digit: subkey))")],backgroundStateColors:VoipTheme.numpad_digit_background), onClickAction: {
callData.sendDTMF(dtmf: "\(subkey)")
})
newRow.addArrangedSubview(digit)
digit.accessibilityIdentifier = "call_numpad_view_digit_\(subkey)"
}
}
}
func iconNameForDigit(digit:String) -> String {
if (digit == "*") {
return "star"
}
if (digit == "#") {
return "hash"
}
return digit
}
func addRow(allRows:UIStackView) -> UIStackView {
let row = UIStackView()
row.axis = .horizontal
row.distribution = .equalSpacing
row.alignment = .center
row.spacing = button_vertical_space
row.isLayoutMarginsRelativeArrangement = true
allRows.addArrangedSubview(row)
return row
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}