FirstTabViewController.swift 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  1. //
  2. // FirstTabViewController.swift
  3. // AppBuilder
  4. //
  5. // Created by Kevin Maulana on 29/03/22.
  6. //
  7. import UIKit
  8. import WebKit
  9. import NexilisLite
  10. import Speech
  11. class FirstTabViewController: UIViewController, UIScrollViewDelegate, UIGestureRecognizerDelegate, WKScriptMessageHandler {
  12. var webView: WKWebView!
  13. var address = ""
  14. private var lastContentOffset: CGFloat = 0
  15. var isAllowSpeech = false
  16. let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "id"))
  17. var recognitionRequest : SFSpeechAudioBufferRecognitionRequest?
  18. var recognitionTask : SFSpeechRecognitionTask?
  19. let audioEngine = AVAudioEngine()
  20. var alertController = LibAlertController()
  21. var dateRefresh: Date?
  22. public static var forceRefresh = false
  23. public static var atFirstPage = true
  24. public static var showModal = false
  25. override func viewDidLoad() {
  26. super.viewDidLoad()
  27. self.view.backgroundColor = self.traitCollection.userInterfaceStyle == .dark ? .black : .white
  28. let tapGesture = UITapGestureRecognizer(target: self, action: #selector(collapseDocked))
  29. tapGesture.cancelsTouchesInView = false
  30. tapGesture.delegate = self
  31. let configuration = WKWebViewConfiguration()
  32. configuration.allowsInlineMediaPlayback = true
  33. let customUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1 \(Utils.getUserAgent())"
  34. let finalUserAgent = "\(customUserAgent)"
  35. configuration.applicationNameForUserAgent = finalUserAgent
  36. webView = WKWebView(frame: .zero, configuration: configuration)
  37. view.addSubview(webView)
  38. webView.translatesAutoresizingMaskIntoConstraints = false
  39. NSLayoutConstraint.activate([
  40. webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
  41. webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
  42. webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
  43. webView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
  44. ])
  45. webView.scrollView.addGestureRecognizer(tapGesture)
  46. let refreshControl = UIRefreshControl()
  47. refreshControl.addTarget(self, action: #selector(reloadWebView(_:)), for: .valueChanged)
  48. webView.scrollView.addSubview(refreshControl)
  49. webView.scrollView.delegate = self
  50. webView.navigationDelegate = self
  51. webView.allowsBackForwardNavigationGestures = true
  52. let contentController = self.webView.configuration.userContentController
  53. contentController.add(self, name: "checkProfile")
  54. contentController.add(self, name: "setIsProductModalOpen")
  55. contentController.add(self, name: "toggleVoiceSearch")
  56. contentController.add(self, name: "blockUser")
  57. contentController.add(self, name: "showAlert")
  58. contentController.add(self, name: "closeProfile")
  59. contentController.add(self, name: "tabShowHide")
  60. let source: String = "var meta = document.createElement('meta');" +
  61. "meta.name = 'viewport';" +
  62. "meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" +
  63. "var head = document.getElementsByTagName('head')[0];" +
  64. "head.appendChild(meta);" +
  65. "$('#header-layout').find('.col-8').removeClass('col-8').addClass('col');" +
  66. "$('#header-layout').find('.col-4').removeClass('col-4').addClass('col');"
  67. let script: WKUserScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: false)
  68. contentController.addUserScript(script)
  69. NotificationCenter.default.addObserver(self, selector: #selector(onShowAC(notification:)), name: NSNotification.Name(rawValue: "onShowAC"), object: nil)
  70. NotificationCenter.default.addObserver(self, selector: #selector(onRefreshWebView(notification:)), name: NSNotification.Name(rawValue: "onRefreshWebView"), object: nil)
  71. }
  72. func loadURLWithCookie(url: URL) {
  73. var urlRequest = URLRequest(url: url)
  74. let cookieHeader = Utils.getCookiesMobile()
  75. urlRequest.addValue(cookieHeader, forHTTPHeaderField: "Cookie")
  76. let customUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1 \(Utils.getUserAgent())"
  77. urlRequest.setValue(customUserAgent, forHTTPHeaderField: "User-Agent")
  78. webView.load(urlRequest)
  79. if let cookies = HTTPCookieStorage.shared.cookies {
  80. for cookie in cookies {
  81. webView.configuration.websiteDataStore.httpCookieStore.setCookie(cookie)
  82. }
  83. }
  84. }
  85. override func viewWillAppear(_ animated: Bool) {
  86. let me = UserDefaults.standard.string(forKey: "me")
  87. var myURL : URL?
  88. let lang = UserDefaults.standard.string(forKey: "i18n_language")
  89. var intLang = 0
  90. if lang == "id" {
  91. intLang = 1
  92. }
  93. if PrefsUtil.getURLFirstTab() != nil {
  94. ViewController.sURL = PrefsUtil.getURLFirstTab()!
  95. }
  96. switch(ViewController.sURL){
  97. case "0":
  98. address = "\(PrefsUtil.getURLBase())nexilis/pages/tab1-main-only?f_pin=\(me ?? "")&lang=\(intLang)&theme=\(self.traitCollection.userInterfaceStyle == .dark ? "0" : "1")"
  99. myURL = URL(string: address)
  100. case "1":
  101. address = "\(PrefsUtil.getURLBase())nexilis/pages/tab3-main-only?f_pin=\(me ?? "")&lang=\(intLang)&theme=\(self.traitCollection.userInterfaceStyle == .dark ? "0" : "1")"
  102. myURL = URL(string: address)
  103. case "2":
  104. address = "\(PrefsUtil.getURLBase())nexilis/pages/tab1-main?f_pin=\(me ?? "")&lang=\(intLang)&theme=\(self.traitCollection.userInterfaceStyle == .dark ? "0" : "1")"
  105. myURL = URL(string: address)
  106. case "3":
  107. address = "\(PrefsUtil.getURLBase())nexilis/pages/tab3-commerce?f_pin=\(me ?? "")&lang=\(intLang)&theme=\(self.traitCollection.userInterfaceStyle == .dark ? "0" : "1")"
  108. myURL = URL(string: address)
  109. case "4":
  110. address = "\(PrefsUtil.getURLBase())nexilis/pages/tab1-video?f_pin=\(me ?? "")&lang=\(intLang)&theme=\(self.traitCollection.userInterfaceStyle == .dark ? "0" : "1")"
  111. myURL = URL(string: address)
  112. default:
  113. if(!ViewController.sURL.isEmpty){
  114. if(ViewController.sURL.lowercased().contains("https://") || ViewController.sURL.lowercased().contains("http://")){
  115. address = ViewController.sURL
  116. myURL = URL(string: address)
  117. }
  118. else {
  119. if ViewController.sURL.contains("nexilis/pages"){
  120. address = "\(PrefsUtil.getURLBase())\(ViewController.sURL)?f_pin=\(me ?? "")&lang=\(intLang)&theme=\(self.traitCollection.userInterfaceStyle == .dark ? "0" : "1")"
  121. } else {
  122. address = "https://\(ViewController.sURL)"
  123. }
  124. myURL = URL(string: address)
  125. }
  126. }
  127. }
  128. if let u = myURL {
  129. self.webView.evaluateJavaScript("{window.localStorage.setItem('currentTab','\(ViewController.sURL)')}")
  130. if ((dateRefresh == nil || Int(Date().timeIntervalSince(dateRefresh!)) >= 60) && FirstTabViewController.atFirstPage) || FirstTabViewController.forceRefresh {
  131. // let myRequest = URLRequest(url: u)
  132. loadURLWithCookie(url: u)
  133. } else {
  134. self.webView.evaluateJavaScript("if(resumeAll){resumeAll();}")
  135. }
  136. dateRefresh = Date()
  137. FirstTabViewController.forceRefresh = false
  138. }
  139. let cpaasMode = PrefsUtil.getCpaasMode()
  140. let isBurger = cpaasMode == PrefsUtil.CPAAS_MODE_BURGER
  141. navigationController?.setNavigationBarHidden(!isBurger, animated: false)
  142. if isBurger {
  143. self.navigationController?.navigationBar.topItem?.title = Bundle.main.displayName
  144. self.navigationController?.navigationBar.setNeedsLayout()
  145. }
  146. }
  147. override func viewDidAppear(_ animated: Bool) {
  148. // if (self.isUsingMyWebview() && self.webView.url != nil && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-main-only") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-main-only") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-main") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-commerce") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab1-video") && !self.webView.url!.absoluteString.contains("nexilis/pages/tab3-main")) || FirstTabViewController.showModal {
  149. // ViewController.alwaysHideButton = true
  150. // self.hideTabBar()
  151. // ThirdTabViewController.atFirstPage = false
  152. // } else {
  153. DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: {
  154. var viewController = UIApplication.shared.windows.first!.rootViewController
  155. if !(viewController is ViewController) {
  156. viewController = self.parent
  157. }
  158. if ViewController.middleButton.isHidden {
  159. ViewController.isExpandButton = false
  160. if let viewController = viewController as? ViewController {
  161. if viewController.tabBar.isHidden {
  162. viewController.tabBar.isHidden = false
  163. ViewController.middleButton.isHidden = false
  164. ViewController.alwaysHideButton = false
  165. }
  166. }
  167. } else if PrefsUtil.getCpaasMode() != PrefsUtil.CPAAS_MODE_DOCKED {
  168. DispatchQueue.main.async {
  169. if let viewController = viewController as? ViewController {
  170. if viewController.tabBar.isHidden {
  171. viewController.tabBar.isHidden = false
  172. ViewController.alwaysHideButton = false
  173. }
  174. }
  175. }
  176. }
  177. })
  178. // }
  179. }
  180. @objc func onShowAC(notification: NSNotification) {
  181. self.webView.evaluateJavaScript("{if(pauseAll){pauseAll();}}")
  182. view.endEditing(true)
  183. resignFirstResponder()
  184. }
  185. @objc func onRefreshWebView(notification: NSNotification) {
  186. FirstTabViewController.forceRefresh = true
  187. }
  188. override func viewWillDisappear(_ animated: Bool) {
  189. if self.webView.scrollView.contentOffset.y < 0 { // Move tableView to top
  190. self.webView.scrollView.setContentOffset(CGPoint.zero, animated: true)
  191. }
  192. self.webView.evaluateJavaScript("{if(pauseAll){pauseAll();}}")
  193. self.webView.evaluateJavaScript("hideAddToCart();")
  194. }
  195. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  196. if (self.lastContentOffset > scrollView.contentOffset.y && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)) {
  197. showTabBar();
  198. }
  199. else if (self.lastContentOffset != 0 && self.lastContentOffset < scrollView.contentOffset.y && self.lastContentOffset >= 0) {
  200. hideTabBar();
  201. }
  202. self.lastContentOffset = scrollView.contentOffset.y
  203. self.collapseDocked()
  204. }
  205. @objc func collapseDocked() {
  206. if ViewController.isExpandButton {
  207. ViewController.expandButton()
  208. }
  209. }
  210. @objc func reloadWebView(_ sender: UIRefreshControl) {
  211. webView.reload()
  212. sender.endRefreshing()
  213. }
  214. func hideTabBar() {
  215. var viewController = UIApplication.shared.windows.first!.rootViewController
  216. if !(viewController is ViewController) {
  217. viewController = self.parent
  218. }
  219. if ViewController.middleButton.isDescendant(of: viewController!.view) {
  220. DispatchQueue.main.async {
  221. if ViewController.isExpandButton {
  222. ViewController.expandButton()
  223. }
  224. ViewController.hideDockedButton()
  225. if let viewController = viewController as? ViewController {
  226. viewController.tabBar.isHidden = true
  227. }
  228. ViewController.removeMiddleButton()
  229. }
  230. } else if PrefsUtil.getCpaasMode() != PrefsUtil.CPAAS_MODE_DOCKED {
  231. DispatchQueue.main.async {
  232. if let viewController = viewController as? ViewController {
  233. if !viewController.tabBar.isHidden {
  234. viewController.tabBar.isHidden = true
  235. }
  236. }
  237. }
  238. }
  239. }
  240. func showTabBar() {
  241. if(ViewController.alwaysHideButton){
  242. return
  243. }
  244. var viewController = UIApplication.shared.windows.first!.rootViewController
  245. if !(viewController is ViewController) {
  246. viewController = self.parent
  247. }
  248. if ViewController.middleButton.isHidden {
  249. if let viewController = viewController as? ViewController {
  250. viewController.tabBar.isHidden = false
  251. ViewController.middleButton.isHidden = false
  252. }
  253. } else if PrefsUtil.getCpaasMode() != PrefsUtil.CPAAS_MODE_DOCKED {
  254. DispatchQueue.main.async {
  255. if let viewController = viewController as? ViewController {
  256. if viewController.tabBar.isHidden {
  257. viewController.tabBar.isHidden = false
  258. }
  259. }
  260. }
  261. }
  262. }
  263. func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
  264. scrollView.pinchGestureRecognizer?.isEnabled = false
  265. }
  266. func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
  267. if message.name == "checkProfile" {
  268. guard let dict = message.body as? [String: AnyObject],
  269. let param1 = dict["param1"] as? String,
  270. let param2 = dict["param2"] as? String else {
  271. return
  272. }
  273. if ViewController.checkIsChangePerson() {
  274. if param2 == "like" {
  275. self.webView.evaluateJavaScript("likeProduct('\(param1)',1,true);")
  276. } else if param2 == "comment" {
  277. self.webView.evaluateJavaScript("openComment('\(param1.split(separator: "|")[0])',\(param1.split(separator: "|")[1]),true);")
  278. } else if param2 == "report_user" {
  279. self.webView.evaluateJavaScript("reportUser('\(param1)',true);")
  280. } else if param2 == "report_content" {
  281. self.webView.evaluateJavaScript("reportContent('\(param1.split(separator: "|")[0])','\(param1.split(separator: "|")[1])',true);")
  282. } else if param2 == "block_user" {
  283. self.webView.evaluateJavaScript("blockUser('\(param1)',true);")
  284. } else if param2 == "follow_user" {
  285. self.webView.evaluateJavaScript("followUser('\(param1.split(separator: "|")[0])',\(param1.split(separator: "|")[1]),true);")
  286. } else if param2 == "homepage" || param2 == "gif" {
  287. self.webView.evaluateJavaScript("window.location.href = '\(param1)';")
  288. } else if param2 == "block_content" {
  289. self.webView.evaluateJavaScript("blockContent('\(param1)',true);")
  290. } else {
  291. self.webView.evaluateJavaScript("openNewPost(true);")
  292. }
  293. } else {
  294. self.webView.evaluateJavaScript("{if(pauseAll){pauseAll();}}")
  295. }
  296. } else if message.name == "setIsProductModalOpen" {
  297. guard let dict = message.body as? [String: AnyObject],
  298. let param1 = dict["param1"] as? Bool else {
  299. return
  300. }
  301. if param1 {
  302. if self.webView.scrollView.contentOffset.y < 0 { // Move tableView to top
  303. self.webView.scrollView.setContentOffset(CGPoint.zero, animated: true)
  304. }
  305. }
  306. FirstTabViewController.showModal = param1
  307. } else if message.name == "toggleVoiceSearch" {
  308. if !isAllowSpeech {
  309. setupSpeech()
  310. } else {
  311. runVoice()
  312. }
  313. } else if message.name == "blockUser" {
  314. guard let dict = message.body as? [String: AnyObject],
  315. let param1 = dict["param1"] as? String,
  316. let param2 = dict["param2"] as? Bool else {
  317. return
  318. }
  319. if param2 {
  320. DispatchQueue.global().async {
  321. if let response = Nexilis.writeAndWait(message: CoreMessage_TMessageBank.getBlock(l_pin: param1)) {
  322. if response.isOk() {
  323. DispatchQueue.main.async {
  324. Database.shared.database?.inTransaction({ (fmdb, rollback) in
  325. _ = Database.shared.updateRecord(fmdb: fmdb, table: "BUDDY", cvalues: [
  326. "ex_block" : "1"
  327. ], _where: "f_pin = '\(param1)'")
  328. })
  329. }
  330. }
  331. }
  332. }
  333. } else {
  334. DispatchQueue.global().async {
  335. if let response = Nexilis.writeAndWait(message: CoreMessage_TMessageBank.getUnBlock(l_pin: param1)) {
  336. if response.isOk() {
  337. DispatchQueue.main.async {
  338. Database.shared.database?.inTransaction({ (fmdb, rollback) in
  339. _ = Database.shared.updateRecord(fmdb: fmdb, table: "BUDDY", cvalues: [
  340. "ex_block" : "0"
  341. ], _where: "f_pin = '\(param1)'")
  342. })
  343. }
  344. }
  345. }
  346. }
  347. }
  348. } else if message.name == "showAlert" {
  349. guard let dict = message.body as? [String: AnyObject],
  350. let param1 = dict["param1"] as? String else {
  351. return
  352. }
  353. showToast(message: param1, controller: self.tabBarController!)
  354. } else if message.name == "blockUser" {
  355. guard let dict = message.body as? [String: AnyObject],
  356. let param1 = dict["param1"] as? String,
  357. let param2 = dict["param2"] as? Bool else {
  358. return
  359. }
  360. if param2 {
  361. DispatchQueue.global().async {
  362. if let response = Nexilis.writeAndWait(message: CoreMessage_TMessageBank.getBlock(l_pin: param1)) {
  363. if response.isOk() {
  364. DispatchQueue.main.async {
  365. Database.shared.database?.inTransaction({ (fmdb, rollback) in
  366. _ = Database.shared.updateRecord(fmdb: fmdb, table: "BUDDY", cvalues: [
  367. "ex_block" : "1"
  368. ], _where: "f_pin = '\(param1)'")
  369. })
  370. }
  371. }
  372. }
  373. }
  374. } else {
  375. DispatchQueue.global().async {
  376. if let response = Nexilis.writeAndWait(message: CoreMessage_TMessageBank.getUnBlock(l_pin: param1)) {
  377. if response.isOk() {
  378. DispatchQueue.main.async {
  379. Database.shared.database?.inTransaction({ (fmdb, rollback) in
  380. _ = Database.shared.updateRecord(fmdb: fmdb, table: "BUDDY", cvalues: [
  381. "ex_block" : "0"
  382. ], _where: "f_pin = '\(param1)'")
  383. })
  384. }
  385. }
  386. }
  387. }
  388. }
  389. } else if message.name == "tabShowHide" {
  390. guard let dict = message.body as? [String: AnyObject],
  391. let param1 = dict["param1"] as? Bool else {
  392. return
  393. }
  394. if param1 {
  395. ViewController.alwaysHideButton = false
  396. showTabBar()
  397. } else {
  398. if self.viewIfLoaded?.window != nil {
  399. ViewController.alwaysHideButton = true
  400. hideTabBar()
  401. }
  402. }
  403. }
  404. }
  405. func setupSpeech() {
  406. self.speechRecognizer?.delegate = self
  407. SFSpeechRecognizer.requestAuthorization { (authStatus) in
  408. var isButtonEnabled = false
  409. switch authStatus {
  410. case .authorized:
  411. isButtonEnabled = true
  412. case .denied:
  413. isButtonEnabled = false
  414. //print("User denied access to speech recognition")
  415. case .restricted:
  416. isButtonEnabled = false
  417. //print("Speech recognition restricted on this device")
  418. case .notDetermined:
  419. isButtonEnabled = false
  420. //print("Speech recognition not yet authorized")
  421. @unknown default:
  422. isButtonEnabled = false
  423. }
  424. OperationQueue.main.addOperation() {
  425. self.isAllowSpeech = isButtonEnabled
  426. if isButtonEnabled {
  427. UserDefaults.standard.set(isButtonEnabled, forKey: "allowSpeech")
  428. self.runVoice()
  429. }
  430. }
  431. }
  432. }
  433. func runVoice() {
  434. if !audioEngine.isRunning {
  435. alertController = LibAlertController(title: "Start Recording".localized(), message: "Say something, I'm listening!".localized(), preferredStyle: .alert)
  436. self.present(alertController, animated: true)
  437. self.webView.evaluateJavaScript("toggleVoiceButton(true)")
  438. self.startRecording()
  439. }
  440. }
  441. func startRecording() {
  442. // Clear all previous session data and cancel task
  443. if recognitionTask != nil {
  444. recognitionTask?.cancel()
  445. recognitionTask = nil
  446. }
  447. // Create instance of audio session to record voice
  448. let audioSession = AVAudioSession.sharedInstance()
  449. do {
  450. try audioSession.setCategory(AVAudioSession.Category.record, mode: .default, options: [])
  451. try audioSession.setMode(AVAudioSession.Mode.measurement)
  452. try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
  453. } catch {
  454. //print("audioSession properties weren't set because of an error.")
  455. }
  456. self.recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
  457. let inputNode = audioEngine.inputNode
  458. guard let recognitionRequest = recognitionRequest else {
  459. fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")
  460. }
  461. recognitionRequest.shouldReportPartialResults = true
  462. self.recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in
  463. var isFinal = false
  464. var text = ""
  465. if result != nil {
  466. text = result?.bestTranscription.formattedString ?? ""
  467. isFinal = (result?.isFinal)!
  468. self.alertController.dismiss(animated: true)
  469. self.audioEngine.stop()
  470. self.recognitionRequest?.endAudio()
  471. } else {
  472. self.alertController.dismiss(animated: true)
  473. }
  474. if error != nil || isFinal {
  475. if error == nil {
  476. self.webView.evaluateJavaScript("toggleVoiceButton(false)")
  477. self.webView.evaluateJavaScript("submitVoiceSearch('\(text)')")
  478. } else {
  479. self.audioEngine.stop()
  480. self.recognitionRequest?.endAudio()
  481. }
  482. inputNode.removeTap(onBus: 0)
  483. self.recognitionRequest = nil
  484. self.recognitionTask = nil
  485. self.isAllowSpeech = true
  486. }
  487. })
  488. let recordingFormat = inputNode.outputFormat(forBus: 0)
  489. inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
  490. self.recognitionRequest?.append(buffer)
  491. }
  492. self.audioEngine.prepare()
  493. do {
  494. try self.audioEngine.start()
  495. } catch {
  496. //print("audioEngine couldn't start because of an error.")
  497. }
  498. }
  499. func isUsingMyWebview() -> Bool{
  500. return PrefsUtil.getURLFirstTab() == "0" || PrefsUtil.getURLFirstTab() == "1" || PrefsUtil.getURLFirstTab() == "2" || PrefsUtil.getURLFirstTab() == "3" || PrefsUtil.getURLFirstTab() == "4"
  501. }
  502. }
  503. extension FirstTabViewController: SFSpeechRecognizerDelegate {
  504. func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) {
  505. if available {
  506. self.isAllowSpeech = true
  507. } else {
  508. self.isAllowSpeech = false
  509. }
  510. }
  511. }
  512. extension FirstTabViewController: WKUIDelegate, WKNavigationDelegate {
  513. func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
  514. if self.viewIfLoaded?.window != nil {
  515. if let urlStr = navigationAction.request.url?.absoluteString {
  516. //print("url: \(urlStr)")
  517. collapseDocked()
  518. if urlStr.contains("nexilis/pages/tab1-main-only") || urlStr.contains("nexilis/pages/tab3-main-only") || urlStr.contains("nexilis/pages/tab1-main") || urlStr.contains("nexilis/pages/tab3-commerce") || urlStr.contains("nexilis/pages/tab1-video") || urlStr.contains("nexilis/pages/tab3-main") {
  519. ViewController.alwaysHideButton = false
  520. showTabBar()
  521. FirstTabViewController.atFirstPage = true
  522. }
  523. // else if isUsingMyWebview() {
  524. // ViewController.alwaysHideButton = true
  525. // hideTabBar()
  526. // FirstTabViewController.atFirstPage = false
  527. // }
  528. }
  529. }
  530. decisionHandler(.allow)
  531. }
  532. }