ViewController.swift 6.64 KB
Newer Older
jzhang's avatar
jzhang committed
1 2 3 4 5 6 7
//
//  ViewController.swift
//  BreastFeedingDemo
//
//  Created by Jay Zhang on 2022/6/2.
//

jzhang's avatar
jzhang committed
8
import AVFoundation
jzhang's avatar
jzhang committed
9 10
import Flutter
import UIKit
jzhang's avatar
jzhang committed
11 12

class ViewController: UIViewController {
jzhang's avatar
jzhang committed
13 14 15 16 17 18
    @IBOutlet weak var titleL: UILabel!
    @IBOutlet weak var stepL1: UILabel!
    @IBOutlet weak var stepL2: UILabel!
    @IBOutlet weak var stepL3: UILabel!
    @IBOutlet weak var startBtn: UIButton!
    @IBOutlet weak var panelV: UIStackView!
jzhang's avatar
jzhang committed
19
    @IBOutlet weak var popupView: UIView!
jzhang's avatar
jzhang committed
20
    @IBOutlet weak var switchBtn: UIButton!
jzhang's avatar
jzhang committed
21 22 23 24 25
    @IBOutlet weak var permisionPopupV: UIView!
    @IBOutlet weak var permissionTitle: UILabel!
    @IBOutlet weak var permissionText: UILabel!
    @IBOutlet weak var permissionOKBtn: UIButton!
    @IBOutlet weak var permissionPanel: UIView!
jzhang's avatar
jzhang committed
26
    var methodChannel: FlutterMethodChannel?
jzhang's avatar
jzhang committed
27
    lazy var vm: ViewModel = .init()
jzhang's avatar
jzhang committed
28
    var isFirstLoad: Bool = true
jzhang's avatar
jzhang committed
29

jzhang's avatar
jzhang committed
30 31 32 33 34
    fileprivate func updateUI() {
        titleL.text = vm.landingPageTitle
        stepL1.text = vm.landingPageStep1
        stepL2.text = vm.landingPageStep2
        stepL3.text = vm.landingPageStep3
jzhang's avatar
jzhang committed
35
        
jzhang's avatar
jzhang committed
36 37 38
        permissionText.text = vm.cameraText1
        permissionTitle.text = vm.cameraText
        permissionOKBtn.setTitle(vm.cameraButtonText, for: .normal)
jzhang's avatar
jzhang committed
39
        startBtn.setTitle(vm.landingPageStart, for: .normal)
jzhang's avatar
jzhang committed
40
        panelV.layer.cornerRadius = 8
jzhang's avatar
jzhang committed
41 42
        permissionPanel.layer.cornerRadius = 8
        permissionPanel.clipsToBounds = true
jzhang's avatar
jzhang committed
43
        panelV.clipsToBounds = true
jzhang's avatar
jzhang committed
44
    }
jzhang's avatar
jzhang committed
45

jzhang's avatar
jzhang committed
46 47
    override func viewDidLoad() {
        super.viewDidLoad()
jzhang's avatar
jzhang committed
48
        overrideUserInterfaceStyle = .light
jzhang's avatar
jzhang committed
49 50
        UIApplication.shared.isIdleTimerDisabled = true
        navigationController?.setNavigationBarHidden(true, animated: false)
jzhang's avatar
jzhang committed
51
        updateUI()
jzhang's avatar
jzhang committed
52 53
        popupView.isHidden = true

jzhang's avatar
jzhang committed
54 55 56 57 58
        if let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine {
            methodChannel = FlutterMethodChannel(name: "com.wmdigit.breastcoachai.native",
                                                 binaryMessenger: flutterEngine.binaryMessenger)
            methodChannel?.setMethodCallHandler { [weak self]
                (call: FlutterMethodCall, result: @escaping FlutterResult) in
jzhang's avatar
jzhang committed
59 60 61
                    if let strongSelf = self {
                        switch call.method {
                        case "init":
jzhang's avatar
jzhang committed
62
                            result(strongSelf.vm.flutterArguments)
jzhang's avatar
jzhang committed
63
                        case "teachingEnd":
jzhang's avatar
jzhang committed
64
                            strongSelf.methodChannel?.invokeMethod("dispose", arguments: nil)
jzhang's avatar
jzhang committed
65 66
                            // ["totalDuration": 3, "reasonText": Concern about my personal privacy, "status": incomplete, "incompleteReasonCode": 2]
                            let argument: [String: Any] = try! JSONSerialization.jsonObject(with: (call.arguments as! String).data(using: .utf8)!) as! [String: Any]
jzhang's avatar
jzhang committed
67 68 69
//                            let totalDuration: Int = argument["totalDuration"] as! Int
//                            let reasonText: String = argument["reasonText"] as! String
//                            let incompleteReasonCode: Int = argument["incompleteReasonCode"] as! Int
jzhang's avatar
jzhang committed
70 71
                            let status: String = argument["status"] as! String
                            if status == "incomplete" {
jzhang's avatar
jzhang committed
72
//                                strongSelf.showError(reasonText)
jzhang's avatar
jzhang committed
73 74
                            } else if status == "complete" {
                                strongSelf.toCompleteVC()
jzhang's avatar
jzhang committed
75
                                return
jzhang's avatar
jzhang committed
76
                            }
jzhang's avatar
jzhang committed
77
                            strongSelf.navigationController?.popViewController(animated: true)
jzhang's avatar
jzhang committed
78 79 80 81
                        default:
                            // Unrecognized method name
                            print("Unrecognized method name: \(call.method)")
                        }
jzhang's avatar
jzhang committed
82
                    }
jzhang's avatar
jzhang committed
83
            }
jzhang's avatar
jzhang committed
84
        }
jzhang's avatar
jzhang committed
85
    }
jzhang's avatar
jzhang committed
86

jzhang's avatar
jzhang committed
87
    func checkCameraPermission() -> Bool? {
jzhang's avatar
jzhang committed
88 89 90
        let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)

        switch cameraAuthorizationStatus {
jzhang's avatar
jzhang committed
91 92
        case .notDetermined:
            return nil
jzhang's avatar
jzhang committed
93 94 95 96 97 98 99 100
        case .authorized:
            return true
        default:
            permisionPopupV.isHidden = false
            return false
        }
    }

jzhang's avatar
jzhang committed
101 102 103
    func showError(_ text: String?) {
        let alertVC = UIAlertController(title: text, message: nil, preferredStyle: .alert)
        alertVC.addAction(UIAlertAction(title: "OK", style: .cancel))
jzhang's avatar
jzhang committed
104
        navigationController?.pushViewController(alertVC, animated: true)
jzhang's avatar
jzhang committed
105 106 107 108 109 110
    }

    func toCompleteVC() {
        let sb = UIStoryboard(name: "Main", bundle: nil)
        let vc = sb.instantiateViewController(withIdentifier: "CompleteVC") as! CompleteVC
        vc.vm = vm
jzhang's avatar
jzhang committed
111
        navigationController?.pushViewController(vc, animated: true)
jzhang's avatar
jzhang committed
112 113
    }

jzhang's avatar
jzhang committed
114 115 116 117 118 119
    @IBAction func toSetting(_ sender: Any) {
        if let appSettingsURL = URL(string: UIApplication.openSettingsURLString) {
            UIApplication.shared.open(appSettingsURL)
        }
    }

jzhang's avatar
jzhang committed
120
    @IBAction func tapStart(_ sender: Any) {
jzhang's avatar
jzhang committed
121
        if checkCameraPermission() == false {
jzhang's avatar
jzhang committed
122 123
            return
        }
jzhang's avatar
jzhang committed
124

jzhang's avatar
jzhang committed
125 126 127 128 129 130 131
        if !isFirstLoad {
            methodChannel?.invokeMethod("reload", arguments: nil)
        }
        isFirstLoad = false
        if let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine {
            let scanVC = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)
            scanVC.modalPresentationStyle = .overFullScreen
jzhang's avatar
jzhang committed
132
            navigationController?.pushViewController(scanVC, animated: true)
jzhang's avatar
jzhang committed
133
        }
jzhang's avatar
jzhang committed
134
    }
jzhang's avatar
jzhang committed
135 136
    
    /// 选择语言
jzhang's avatar
jzhang committed
137 138
    @IBAction func showPanel(_ sender: UIButton) {
        sender.isSelected = !sender.isSelected
jzhang's avatar
jzhang committed
139
        popupView.isHidden = !sender.isSelected
jzhang's avatar
jzhang committed
140
        // 
jzhang's avatar
jzhang committed
141 142 143
        (panelV.viewWithTag(1000) as! UIButton).isSelected = false
        (panelV.viewWithTag(1001) as! UIButton).isSelected = false
        (panelV.viewWithTag(1002) as! UIButton).isSelected = false
jzhang's avatar
jzhang committed
144

jzhang's avatar
jzhang committed
145 146 147 148 149 150 151 152 153
        switch vm.language {
        case .english:
            (panelV.viewWithTag(1000) as! UIButton).isSelected = true
        case .français:
            (panelV.viewWithTag(1001) as! UIButton).isSelected = true
        case .español:
            (panelV.viewWithTag(1002) as! UIButton).isSelected = true
        }
    }
jzhang's avatar
jzhang committed
154

jzhang's avatar
jzhang committed
155 156 157 158
    @IBAction func dismissPermissimPanel(_ sender: Any) {
        permisionPopupV.isHidden = true
    }

jzhang's avatar
jzhang committed
159 160 161 162 163 164 165 166 167 168 169
    @IBAction func selectLanguage(_ sender: UIButton) {
        switch sender.tag {
        case 1000:
            vm.language = .english
        case 1001:
            vm.language = .français
        case 1002:
            vm.language = .español
        default:
            break
        }
jzhang's avatar
jzhang committed
170

jzhang's avatar
jzhang committed
171
        switchBtn.isSelected = false
jzhang's avatar
jzhang committed
172 173
        popupView.isHidden = true

jzhang's avatar
jzhang committed
174
        updateUI()
jzhang's avatar
jzhang committed
175 176
    }
}
jzhang's avatar
jzhang committed
177