Sdk/DcSdk/tool/JLAudioUnitKit.xcframework,
Sdk/DcSdk/tool/OpusTools.swift,
Sdk/DcSdk/VC/AiFunctionVC.swift,
- Sdk/DcSdk/VC/DcCallingRecordVC.swift,
Sdk/DcSdk/VC/DcChatVC.swift,
Sdk/DcSdk/VC/DcChinese2EnglishVC.swift,
Sdk/DcSdk/VC/DcDialogTranslateVC.swift,
Sdk/DcSdk/tool/JLAudioUnitKit.xcframework,
Sdk/DcSdk/tool/OpusTools.swift,
Sdk/DcSdk/VC/AiFunctionVC.swift,
- Sdk/DcSdk/VC/DcCallingRecordVC.swift,
Sdk/DcSdk/VC/DcChatVC.swift,
Sdk/DcSdk/VC/DcChinese2EnglishVC.swift,
Sdk/DcSdk/VC/DcDialogTranslateVC.swift,
CODE_SIGN_ENTITLEMENTS = ShenYin/PLAYBOY.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 202602271457;
+ CURRENT_PROJECT_VERSION = 202603021003;
DEVELOPMENT_TEAM = JKLJ58J33Q;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
CODE_SIGN_ENTITLEMENTS = ShenYin/PLAYBOY.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 202602271457;
+ CURRENT_PROJECT_VERSION = 202603021003;
DEVELOPMENT_TEAM = JKLJ58J33Q;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
return nil
}
}
+class RecordTipSaveCache{
+ static let key = "AutoRecordCache"
+ static func save(value:Bool){
+ let obj = value ? "1":"0"
+ UserDefaults.standard.set(obj, forKey: key)
+ UserDefaults.standard.synchronize()
+ }
+ static func get()->Bool{
+ if let value = UserDefaults.standard.value(forKey: key),let text = value as? String {
+ return text == "1"
+ }
+ return true
+ }
+}
+++ /dev/null
-//
-////
-//// DcCallingRecordVC.swift
-//// ShenYin
-////
-//// Created by liangshi on 2025/8/6.
-////
-//
-//import UIKit
-//import AVFAudio
-//class DcCallingRecordVC:BaseVC{
-// let toolBar = FieldRecordBar()
-// let textView = UITextView()
-// let rhythView = RhythView()
-//
-// var autoStart = false
-// var needSave = true
-// var bgEnter = false//是否是APP在后台进入这个页面的
-//
-// init(autoStart :Bool = false) {
-// self.autoStart = autoStart
-// super.init()
-// bgEnter = App.shared.isInBackground
-// setupSdk()
-// }
-//
-// override func viewDidLoad() {
-// super.viewDidLoad()
-// }
-// override func setupViews() {
-// navBar.title = "通话录音".l10n
-// navBar.backgroundColor = .white
-//
-// toolBar.do { v in
-// v.delegate = self
-// v.hasRightItem = false
-// v.leftItem.language = AiLanguageCache.get(type: .thly) ?? .chinse
-// }
-//
-// view.backgroundColor = .white
-//
-// textView.do { v in
-// v.backgroundColor = .white
-// v.isEditable = false
-// v.font = .regular(14)
-// v.text = ""
-// v.textColor = .color(.first)
-// v.contentInset = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18)
-// }
-// view.addSubviews([rhythView,textView,toolBar])
-//
-// }
-// override func setupLayout() {
-// rhythView.snp.makeConstraints { make in
-// make.width.centerX.equalToSuperview()
-// make.top.equalToSuperview().inset(kNavBtm)
-// make.height.equalTo(110)
-// }
-// toolBar.snp.makeConstraints { make in
-// make.width.centerX.equalToSuperview()
-// make.height.equalTo(120)
-// make.bottom.equalToSuperview().inset(20)
-// }
-// textView.snp.makeConstraints { make in
-// make.top.equalTo(rhythView.snp.bottom)
-// make.left.right.equalToSuperview()
-// make.bottom.equalTo(toolBar.snp.top)
-// }
-// }
-// override func setupData() {
-// if bgEnter {
-// textView.text = DcThly.shared.recordText
-// }
-// }
-// func setupSdk(){
-// DcThly.shared.recordFinish = {[weak self] path in
-// guard let self = self else { return }
-// if !needSave {
-// return
-// }
-// let v = PopTextField()
-// v.show()
-// v.cancelTap = {
-// App.shared.popPage()
-// }
-// v.okTap = { [weak self] text in
-// guard let self = self else{return}
-//
-// let model = RecordDetailModel()
-// model.type = .phone
-// model.from = toolBar.leftItem.language
-// model.to = .english
-// model.name = text
-// model.path = path
-// model.duration = YLToos.getDuration(model.path)
-// model.origin = textView.text
-// model.translate = ""
-// App.shared.popPage(animated: false)
-// App.shared.goToPage(RecordDetailVC(record: model))
-// }
-// }
-// DcThly.shared.recordNeedReloadData = {[weak self] text in
-// guard let self = self else { return }
-// textView.text = text
-//
-// let range = NSMakeRange(textView.text.count - 1, 1)
-// textView.scrollRangeToVisible(range)
-// }
-// //需要完善
-//// DcThly.shared.callRecordAutoFinish = {[weak self] in
-//// guard let self = self else { return }
-//// stopAction()
-//// }
-// DcThly.shared.callRecordNotOnCall = {[weak self] in
-// guard let self = self else { return }
-// YLprogressHUD.showAutoHiden("未处于通话状态".l10n)
-// rhythView.reset()
-// toolBar.recordBtn.isSelected = false
-// toolBar.leftItem.alpha = 1
-// }
-//
-// if autoStart{
-// startRecord()
-// }
-// }
-//
-// override func viewDidAppear(_ animated: Bool) {
-// super.viewDidAppear(animated)
-// navigationController?.fd_fullscreenPopGestureRecognizer?.isEnabled = false
-// }
-// override func viewDidDisappear(_ animated: Bool) {
-// super.viewDidDisappear(animated)
-// navigationController?.fd_fullscreenPopGestureRecognizer?.isEnabled = true
-// }
-// override func navleftViewTapped() {
-// if toolBar.recordBtn.isSelected {
-// CustomAlert.showWith(title: "提示".l10n, messgage: "当前正在录音,确定放弃当前录音吗?".l10n, cancelCallback: {}) {[unowned self] in
-// self.rhythView.stopTimer()
-// self.needSave = false
-// DcThly.shared.recordStop()
-// self.navigationController?.popViewController(animated: true)
-// }
-// }
-// else{
-// super.navleftViewTapped()
-// }
-// }
-// func startRecord(){
-// toolBar.recordBtnAction()
-// }
-// func stopRecord(){
-// toolBar.recordBtnAction()
-// }
-//}
-//
-//extension DcCallingRecordVC:FieldRecordBarDelegate{
-// func fieldRecordBar(_ bar: FieldRecordBar, languageChange language: CCAiLanguage) {
-// DcThly.shared.setRecordLanage(language)
-// AiLanguageCache.save(type: .thly, lan: language)
-// }
-//
-// func fieldRecordBar(_ bar: FieldRecordBar, stateChange state: RecordSate) {
-// if state == .start {
-// textView.text = ""
-// rhythView.startTimer()
-// DcThly.shared.recordStart()
-// }
-// else if state == .stop{
-// stopAction()
-// }
-// }
-// func stopAction(){
-// rhythView.stopTimer()
-// DcThly.shared.recordStop()
-// toolBar.startAnimating()
-// }
-//}
if !needSave {
return
}
- let v = PopTextField()
- v.show()
- v.cancelTap = {
- App.shared.popPage()
+ if RecordTipSaveCache.get(){
+ let v = PopTextField()
+ v.show()
+ v.cancelTap = {
+ App.shared.popPage()
+ }
+ v.okTap = { [weak self] text in
+ guard let self = self else{return}
+ gotoDetail(fileName: text, wavPath: path, language: toolBar.leftItem.language)
+ }
}
- v.okTap = { [weak self] text in
- guard let self = self else{return}
- gotoDetail(fileName: text, wavPath: path, language: toolBar.leftItem.language)
+ else{
+ gotoDetail(fileName: Date().format(.full3), wavPath: path, language: toolBar.leftItem.language)
}
}
DcStereo.shared.stereoNeedReloadData = {[weak self] (text,index) in
sdk.filePathCallback = { [weak self] path in
guard let self = self else{return}
guard let wavPath = DCFolder.recordFileResave(srcPath: path) else{return}
- let v = PopTextField()
- v.show()
- v.cancelTap = {
- App.shared.popPage()
- }
- v.okTap = { [weak self] text in
- guard let self = self else{return}
+
+ if RecordTipSaveCache.get(){
+ let v = PopTextField()
+ v.show()
+ v.cancelTap = {
+ App.shared.popPage()
+ }
+ v.okTap = { [weak self] text in
+ guard let self = self else{return}
+
+ let model = RecordDetailModel()
+ model.type = .translate
+ model.from = toolBar.leftItem.language
+ model.to = toolBar.rightItem.language
+ model.name = text
+ model.path = wavPath
+ model.duration = YLToos.getDuration(model.path)
+ model.origin = textView.text ?? ""
+ model.translate = translateTextView.text ?? ""
+ App.shared.popPage(animated: false)
+ App.shared.goToPage(RecordDetailVC(record: model))
+ }
+ }
+ else{
let model = RecordDetailModel()
model.type = .translate
model.from = toolBar.leftItem.language
model.to = toolBar.rightItem.language
- model.name = text
+ model.name = Date().format(.full3)
model.path = wavPath
model.duration = YLToos.getDuration(model.path)
model.origin = textView.text ?? ""
if !needSave {
return
}
- let v = PopTextField()
- v.show()
- v.cancelTap = {
- App.shared.popPage()
+ Logger.debug("path ===", path)
+ if RecordTipSaveCache.get(){
+ let v = PopTextField()
+ v.show()
+ v.cancelTap = {
+ App.shared.popPage()
+ }
+ v.okTap = { [weak self] text in
+ guard let self = self else{return}
+ Logger.debug("111111 ===",textView.text ?? "")
+ let model = RecordDetailModel()
+ model.type = .present
+ model.from = toolBar.leftItem.language
+ model.to = .english
+ model.name = text
+ model.path = path
+ model.duration = YLToos.getDuration(model.path)
+ model.origin = textView.text
+ model.translate = ""
+ App.shared.popPage(animated: false)
+ App.shared.goToPage(RecordDetailVC(record: model))
+ }
}
- v.okTap = { [weak self] text in
- guard let self = self else{return}
- Logger.debug("111111 ===",textView.text ?? "")
- let model = RecordDetailModel()
- model.type = .present
- model.from = toolBar.leftItem.language
- model.to = .english
- model.name = text
- model.path = path
- model.duration = YLToos.getDuration(model.path)
- model.origin = textView.text
- model.translate = ""
- App.shared.popPage(animated: false)
- App.shared.goToPage(RecordDetailVC(record: model))
+ else{
+ let model = RecordDetailModel()
+ model.type = .present
+ model.from = self.toolBar.leftItem.language
+ model.to = .english
+ model.name = Date().format(.full3)
+ model.path = path
+ model.duration = YLToos.getDuration(model.path)
+ model.origin = self.textView.text
+ model.translate = ""
+ App.shared.popPage(animated: false)
+ App.shared.goToPage(RecordDetailVC(record: model))
+
+
}
}
DcXcly.shared.recordNeedReloadData = {[weak self] text in
finished(nil)
}
}
- return finished(nil)
+// return finished(nil)
}
static func opusTowav(_ opusPath:String,finished:@escaping ((String?)->Void)){
let format = JLOpusFormat.defaultFormats()
finished(nil)
}
}
- return finished(nil)
+// return finished(nil)
}
static func pcmTowav(_ pcmPath:String,sampleRate:UInt32,channels:UInt16)->String?{
if !needSave {
return
}
- let v = PopTextField()
- v.show()
- v.cancelTap = {
- App.shared.popPage()
+ if RecordTipSaveCache.get(){
+ let v = PopTextField()
+ v.show()
+ v.cancelTap = {
+ App.shared.popPage()
+ }
+ v.okTap = { [weak self] text in
+ guard let self = self else{return}
+
+ let model = RecordDetailModel()
+ model.type = .phone
+ model.from = toolBar.leftItem.language
+ model.to = .english
+ model.name = text
+ model.path = path
+ model.duration = YLToos.getDuration(model.path)
+ model.origin = textView.text
+ model.translate = ""
+ App.shared.popPage(animated: false)
+ App.shared.goToPage(RecordDetailVC(record: model))
+ }
}
- v.okTap = { [weak self] text in
- guard let self = self else{return}
-
+ else{
let model = RecordDetailModel()
model.type = .phone
model.from = toolBar.leftItem.language
model.to = .english
- model.name = text
+ model.name = Date().format(.full3)
model.path = path
model.duration = YLToos.getDuration(model.path)
model.origin = textView.text
if !needSave {
return
}
- let v = PopTextField()
- v.show()
- v.cancelTap = {
- App.shared.popPage()
+ if RecordTipSaveCache.get(){
+ let v = PopTextField()
+ v.show()
+ v.cancelTap = {
+ App.shared.popPage()
+ }
+ v.okTap = { [weak self] text in
+ guard let self = self else{return}
+ gotoDetail(fileName: text, wavPath: path, language: toolBar.leftItem.language)
+ }
}
- v.okTap = { [weak self] text in
- guard let self = self else{return}
- gotoDetail(fileName: text, wavPath: path, language: toolBar.leftItem.language)
+ else{
+ gotoDetail(fileName: Date().format(.full3), wavPath: path, language: toolBar.leftItem.language)
}
}
JoySdkManager.shared.callRecord.stereoNeedReloadData = {[weak self] (text,index) in
return
}
guard let wavPath = DCFolder.recordFileResave(srcPath: path) else{return}
- let v = PopTextField()
- v.show()
- v.cancelTap = {
- App.shared.popPage()
+ if RecordTipSaveCache.get(){
+ let v = PopTextField()
+ v.show()
+ v.cancelTap = {
+ App.shared.popPage()
+ }
+ v.okTap = { [weak self] text in
+ guard let self = self else{return}
+
+ let model = RecordDetailModel()
+ model.type = .translate
+ model.from = toolBar.leftItem.language
+ model.to = toolBar.rightItem.language
+ model.name = text
+ model.path = wavPath
+ model.duration = YLToos.getDuration(model.path)
+ model.origin = textView.text ?? ""
+ model.translate = translateTextView.text ?? ""
+ App.shared.popPage(animated: false)
+ App.shared.goToPage(RecordDetailVC(record: model))
+ }
}
- v.okTap = { [weak self] text in
- guard let self = self else{return}
-
+ else{
let model = RecordDetailModel()
model.type = .translate
model.from = toolBar.leftItem.language
model.to = toolBar.rightItem.language
- model.name = text
+ model.name = Date().format(.full3)
model.path = wavPath
model.duration = YLToos.getDuration(model.path)
model.origin = textView.text ?? ""
}
return
}
- let v = PopTextField()
- v.show()
- v.cancelTap = {
- App.shared.popPage()
+ if RecordTipSaveCache.get(){
+ let v = PopTextField()
+ v.show()
+ v.cancelTap = {
+ App.shared.popPage()
+ }
+ v.okTap = { [weak self] text in
+ guard let self = self else{return}
+ Logger.debug("111111 ===",textView.text ?? "")
+ let model = RecordDetailModel()
+ model.type = .present
+ model.from = toolBar.leftItem.language
+ model.to = .english
+ model.name = text
+ model.path = path
+ model.duration = YLToos.getDuration(model.path)
+ model.origin = textView.text
+ model.translate = ""
+ App.shared.popPage(animated: false)
+ App.shared.goToPage(RecordDetailVC(record: model))
+ }
}
- v.okTap = { [weak self] text in
- guard let self = self else{return}
- Logger.debug("111111 ===",textView.text ?? "")
+ else{
let model = RecordDetailModel()
model.type = .present
model.from = toolBar.leftItem.language
model.to = .english
- model.name = text
+ model.name = Date().format(.full3)
model.path = path
model.duration = YLToos.getDuration(model.path)
model.origin = textView.text
import UIKit
class MoreSetVC: BaseVC{
- let tableView = UITableView(frame: .zero, style: .plain)
- let list:[CustomCellType] = [.system]
+ let bgView = UIView()
+ private let switchView = SwitchCell()
+ private let sysCell = MoreCell()
let switchBtn = CustomButton()
let logoutBtn = CustomButton()
}
override func setupViews() {
self.navBar.title = "更多设置".l10n
- tableView.do { v in
- v.backgroundColor = .color(.bgColor)
- v.delegate = self
- v.dataSource = self
- v.rowHeight = 52
- v.sectionHeaderHeight = 52
- v.separatorStyle = .none
- v.register(CustomCell.self, forCellReuseIdentifier: CustomCell.reuseID)
- v.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: kScreenHei, height: 20))
- v.bounces = false
+
+ bgView.do { v in
+ v.yc.setCornerRadius(12)
+ v.backgroundColor = .color(.cellBg)
+ }
+ sysCell.do { v in
+ v.yc.addTap(target: self, action: #selector(sysAction))
}
switchBtn.set(title: "切换账号".l10n,style: .theme3, target: self, action: #selector(swictAction))
logoutBtn.set(title: "退出登录".l10n,style: .theme3, target: self, action: #selector(logoutAction))
deactivateBtn.set(title: "注销账号".l10n,style: .theme3, target: self, action: #selector(deactivateAction))
- view.addSubviews([tableView,switchBtn,logoutBtn,deactivateBtn])
-
+ view.addSubviews([bgView,switchBtn,logoutBtn,deactivateBtn])
+ bgView.addSubviews([switchView,sysCell])
}
override func setupLayout() {
- tableView.snp.makeConstraints { make in
+ bgView.snp.makeConstraints { make in
+ make.left.right.equalToSuperview().inset(18)
+ make.top.equalToSuperview().inset(kNavBtm + 10)
+ make.height.equalTo(130)
+ }
+ switchView.snp.makeConstraints { make in
make.left.right.equalToSuperview()
- make.top.equalToSuperview().inset(kNavBtm)
- make.height.equalTo(124)
+ make.top.equalToSuperview()
+ make.height.equalTo(66)
}
+ sysCell.snp.makeConstraints { make in
+ make.left.right.equalToSuperview()
+ make.top.equalTo(switchView.snp.bottom)
+ make.height.equalTo(60)
+ }
+
deactivateBtn.snp.makeConstraints { make in
make.bottom.equalToSuperview().inset(kSafeBtm + 10)
make.left.right.equalToSuperview().inset(18)
}
//MARK: 跳转到APP系统设置权限界面
- func jumpToSystemPrivacySetting() {
+ @objc func sysAction() {
guard let appSetting = URL(string: UIApplication.openSettingsURLString) else {
return
}
}
}
-extension MoreSetVC:UITableViewDelegate,UITableViewDataSource {
- func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
- return list.count
+
+
+fileprivate class SwitchCell: BaseView {
+ let bgView = UIView()
+ let titleLabel = UILabel()
+ let detailLabel = UILabel()
+ let iSwitch = UISwitch()
+
+ override func setupViews() {
+ addSubview(bgView)
+ bgView.addSubviews([titleLabel,detailLabel,iSwitch])
+
+ bgView.do { v in
+ v.backgroundColor = .color(.cellBg)
+ }
+ titleLabel.do { (v) in
+ v.textColor = .color(.first)
+ v.font = .bold(14)
+ v.textAlignment = .left
+ v.text = "录音结束后提示重命名".l10n
+ }
+ detailLabel.do { (v) in
+ v.textColor = .color(.secondary)
+ v.font = .regular(10)
+ v.textAlignment = .left
+ v.text = "关闭后自动命名并保存".l10n
+ }
+ iSwitch.do { v in
+ v.onTintColor = .color(.theme)
+ v.addTarget(self, action: #selector(swicthAction), for: .valueChanged)
+ v.isOn = RecordTipSaveCache.get()
+ }
}
- func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
- let cell = CustomCell.cell(withTableView: tableView, indexPath: indexPath)
- cell.titleLabel.text = list[indexPath.row].title
- let rect = CGRect(x: 0, y: 0, width: kScreenWid - 36, height: 52)
- if indexPath.row == 0 {
- cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 12, height: 12))
+
+ override func setupLayout() {
+ bgView.snp.makeConstraints { (m) in
+ m.left.right.equalToSuperview().inset(16)
+ m.top.equalToSuperview()
+ m.bottom.equalToSuperview()
+ }
+ titleLabel.snp.makeConstraints { (m) in
+ m.top.equalToSuperview().inset(16)
+ m.left.equalToSuperview()
+ }
+ detailLabel.snp.makeConstraints { (m) in
+ m.bottom.equalToSuperview().inset(16)
+ m.left.equalToSuperview()
}
- else if indexPath.row == list.count - 1{
- cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.bottomLeft,.bottomRight], cornerRadii: CGSize(width: 12, height: 12))
+ iSwitch.snp.makeConstraints { (m) in
+ m.right.equalToSuperview()
+ m.centerY.equalToSuperview()
}
- else{
- cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.allCorners], cornerRadii: CGSize(width: 0, height: 0))
+ }
+
+ @objc func swicthAction(){
+ RecordTipSaveCache.save(value: iSwitch.isOn)
+ }
+}
+fileprivate class MoreCell: BaseView {
+ let bgView = UIView()
+ let titleLabel = UILabel()
+ let nextIcon = UIImageView()
+
+
+ override func setupViews() {
+ addSubview(bgView)
+ bgView.addSubviews([titleLabel,nextIcon])
+
+ bgView.do { v in
+ v.backgroundColor = .color(.cellBg)
}
- if list.count == 1 {
- cell.bgView.yc.setCorners(withRoundedRect: rect, roundingCorners: [.allCorners], cornerRadii: CGSize(width: 12, height: 12))
+ titleLabel.do { (v) in
+ v.text = "系统权限管理".l10n
+ v.textColor = .color(.first)
+ v.font = .bold(14)
+ v.textAlignment = .left
}
- return cell
+
+ nextIcon.image = UIImage(named: "arrow_next")
}
- func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
- let data = list[indexPath.row]
- switch data {
- case .system:
- jumpToSystemPrivacySetting()
- case .notice:
-// App.shared.goToPage(SetPhoneVC())
- break
- default:
- break
+
+ override func setupLayout() {
+ bgView.snp.makeConstraints { (m) in
+ m.left.right.equalToSuperview().inset(16)
+ m.top.equalToSuperview()
+ m.bottom.equalToSuperview()
+ }
+ titleLabel.snp.makeConstraints { (m) in
+ m.centerY.equalToSuperview()
+ m.left.equalToSuperview()
+ m.height.equalToSuperview()
+ }
+ nextIcon.snp.makeConstraints { (m) in
+ m.width.equalTo(8)
+ m.height.equalTo(12)
+ m.right.equalToSuperview()
+ m.centerY.equalToSuperview()
}
}
}
"自定义时间":"",
"眼镜" : "",
+ "录音结束后提示重命名":"",
+ "关闭后自动命名并保存":"",
]
"自定义时间":"Custom Time",
"眼镜" : "glasses",
+"录音结束后提示重命名":"Prompt to rename after the recording ends",
+"关闭后自动命名并保存":"Automatically name and save after closing",
+
]