diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 359c2843..41ab6bf3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -20,6 +20,9 @@ + + + diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/ble/BleBridge.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/ble/BleBridge.kt index 84bd9eb7..36d8b4bf 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/ble/BleBridge.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/ble/BleBridge.kt @@ -1,5 +1,6 @@ package com.cloud.diplomaticquarterapp.ble +import TmpInfo import android.annotation.SuppressLint import android.bluetooth.BluetoothDevice import android.os.Build @@ -13,7 +14,6 @@ import android.util.SparseArray import androidx.annotation.RequiresApi import com.cloud.diplomaticquarterapp.ble.utils.EcgData import com.cloud.diplomaticquarterapp.ble.utils.HexString -import com.cloud.diplomaticquarterapp.check_me_pro.UiChannel import com.cloud.diplomaticquarterapp.check_me_pro.bean.BleBean import com.cloud.diplomaticquarterapp.check_me_pro.bean.UserBean import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.UserInfo @@ -21,6 +21,12 @@ import com.cloud.diplomaticquarterapp.check_me_pro.ble.manager.BleScanManager import com.cloud.diplomaticquarterapp.check_me_pro.ble.worker.BleDataWorker import com.cloud.diplomaticquarterapp.utils.Constant import com.cloud.diplomaticquarterapp.MainActivity +import com.cloud.diplomaticquarterapp.check_me_pro.bean.toJson +import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.BpInfo +import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.EcgInfo +import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.GluInfo +import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.OxyInfo +import com.cloud.diplomaticquarterapp.utils.UiChannel import com.google.gson.Gson @@ -56,6 +62,8 @@ import kotlinx.coroutines.withTimeoutOrNull import org.apache.commons.io.FileUtils import org.json.JSONObject import java.io.File +import java.text.SimpleDateFormat +import java.util.Locale class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivity: MainActivity) { @@ -102,7 +110,6 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi var mUserData: MutableList = java.util.ArrayList() - private val userChannel = Channel(Channel.CONFLATED) @@ -311,6 +318,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi @RequiresApi(Build.VERSION_CODES.M) private fun scanForCheckMePro(bleScanManager: BleScanManager, scanResultHandler: (String, BluetoothDevice) -> Unit) { + initVar() bleScanManager.initScan(this.mainActivity) bleScanManager.setCallBack(object : BleScanManager.Scan { override fun scanReturn(name: String, bluetoothDevice: BluetoothDevice) { @@ -319,6 +327,10 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi }) } + private fun initVar() { + Constant.initVar(this.mainActivity) + } + @SuppressLint("MissingPermission") fun onScanResult(name: String, bluetoothDevice: BluetoothDevice) { @@ -356,7 +368,8 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi private suspend fun readUserFromCheckMePro() { userChannel.receive() - val userTemp = File(Constant.getPathX("usr.dat")).readBytes() + + val userTemp = File(Constant.getPathX("usr.dat")).readBytes() // CRASHES HERE userTemp.apply { userInfo = UserInfo(this) @@ -369,6 +382,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi tIndex++ UiChannel.progressChannel.send(tIndex * 100 / total) } + mUserData.add(user) } for (f in commonFileName) { bleWorker.getFile(f) @@ -378,7 +392,105 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi delay(300) UiChannel.progressChannel.close() + sendUsersDataToFlutter() + + } + } + + + private fun sendUsersDataToFlutter() { + if (mUserData.isNotEmpty()) { + + val jsonDataList = mutableListOf() + for (user in mUserData) { + val jsonData = user.toJson() + jsonDataList.add(jsonData) + } + Log.d("userBeanJSON", jsonDataList.toString()) + val returnData = mapOf("type" to "CheckMeUsersList", "data" to jsonDataList) + eventSink?.success(returnData) + } + } + + private fun getBPDataFromCheckMePro(s: String) { + val file = File(Constant.getPathX(s + "nibp.dat")) + if (file.exists()) { + val temp = file.readBytes() + if (temp.isNotEmpty()) { + temp.let { + val f = BpInfo(it) + val json = gson.toJson(f.Bp) + Log.d("BPMeter", json.toString()) + } + } + } else { + // HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER + } + } + + private fun getGlucoseDataFromCheckMePro(s: String) { + val file = File(Constant.getPathX(s + "glu.dat")) + if (file.exists()) { + val temp = file.readBytes() + if (temp.isNotEmpty()) { + temp.let { + val f = GluInfo(it) + val json = gson.toJson(f.Glu) + Log.d("BloodGlucoseMeter", json.toString()) + } + } + } else { + // HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER + } + } + + + private fun getOxyDataFromCheckMePro() { + val file = File(Constant.getPathX("oxi.dat")) + if (file.exists()) { + val temp = file.readBytes() + if (temp.isNotEmpty()) { + temp.let { + val f = OxyInfo(it) + val json = gson.toJson(f.Oxy) + Log.d("Oximeter", json.toString()) + } + } + } else { + // HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER + } + } + + private fun getECGDataFromCheckMePro() { + val file = File(Constant.getPathX("ecg.dat")) + if (file.exists()) { + val temp = file.readBytes() + if (temp.isNotEmpty()) { + temp.let { + val f = EcgInfo(it) + val json = gson.toJson(f.ecg) + Log.d("ECGMeter", json.toString()) + } + } + } else { + // HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER + } + } + + private fun getTemperatureDataFromCheckMePro() { + val file = File(Constant.getPathX("tmp.dat")) + if (file.exists()) { + val temp = file.readBytes() + if (temp.isNotEmpty()) { + temp.let { + val f = TmpInfo(it) + val json = gson.toJson(f.Tmp) + Log.d("TempMeter", json.toString()) + } + } + } else { + // HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER } } @@ -709,24 +821,41 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi Log.d("DeviceFound", "This is the Device i have : ${currentBluetoothDevice.name}") // stopScanForCheckMePro() bleWorker.initWorker(this.mainActivity, currentBluetoothDevice.bluetoothDevice) - - uiScope.launch { + dataScope.launch { val a = withTimeoutOrNull(10000) { bleWorker.waitConnect() } + a?.let { + val b = withTimeoutOrNull(10000) { + Log.d("getFile", "getFile 718") + bleWorker.getFile("usr.dat") + } + b?.let { + userChannel.send(1) + } + + + } + } + uiScope.launch { + readUserFromCheckMePro() + } + + +// uiScope.launch { +// val a = withTimeoutOrNull(10000) { +// bleWorker.waitConnect() +// } // a?.let { // val b = withTimeoutOrNull(10000) { // bleWorker.getFile("usr.dat") // } -// b?.let { -// userChannel.send(1) -// } // } - } +// } // uiScope.launch { -//// readUserFromCheckMePro() +//// // getCheckMeProDeviceInfo() // } diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/UiChannel.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/UiChannel.kt index 5f4c18d4..d730cd2b 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/UiChannel.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/UiChannel.kt @@ -2,6 +2,6 @@ package com.cloud.diplomaticquarterapp.check_me_pro import kotlinx.coroutines.channels.Channel -object UiChannel { - val progressChannel = Channel(Channel.CONFLATED) -} \ No newline at end of file +//object UiChannel { +// val progressChannel = Channel(Channel.CONFLATED) +//} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/bean/UserBean.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/bean/UserBean.kt index 009c7856..c65812a1 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/bean/UserBean.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/bean/UserBean.kt @@ -1,5 +1,6 @@ package com.cloud.diplomaticquarterapp.check_me_pro.bean +import com.google.gson.Gson import java.util.* data class UserBean( @@ -12,3 +13,7 @@ data class UserBean( var height: Int = 0, var color: Int = 0 ) + +fun UserBean.toJson(): String { + return Gson().toJson(this) +} diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/format/OxyInfo.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/format/OxyInfo.kt index 08ddc44f..ab5d8643 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/format/OxyInfo.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/format/OxyInfo.kt @@ -7,11 +7,9 @@ import java.util.* class OxyInfo constructor(var bytes: ByteArray) { var size: Int = bytes.size / 12 - var Oxy: ArrayList = arrayListOf() - + var Oxy: ArrayList = arrayListOf() init { - var start: Int for (k in 0 until size) { start = k * 12 @@ -48,17 +46,11 @@ class OxyInfo constructor(var bytes: ByteArray) { face = toUInt(setRange(start + 11, 1)) if (face > 2) face = 2 } - - } - - } private fun setRange(start: Int, len: Int): ByteArray { return bytes.copyOfRange(start, start + len) } - - } diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/manager/BleScanManager.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/manager/BleScanManager.kt index cff89423..2c41034e 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/manager/BleScanManager.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/manager/BleScanManager.kt @@ -12,6 +12,7 @@ import android.content.Context import android.os.Build import android.util.Log import androidx.annotation.RequiresApi +import com.cloud.diplomaticquarterapp.utils.Constant class BleScanManager { diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/worker/BleDataWorker.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/worker/BleDataWorker.kt index e81554b7..ba9fab1b 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/worker/BleDataWorker.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/check_me_pro/ble/worker/BleDataWorker.kt @@ -2,9 +2,11 @@ package com.cloud.diplomaticquarterapp.check_me_pro.ble.worker import android.bluetooth.BluetoothDevice import android.content.Context +import android.os.Environment import android.util.Log import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.CheckMeResponse import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.DeviceInfo +import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.UserInfo import com.cloud.diplomaticquarterapp.check_me_pro.ble.manager.BleDataManager import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.EndReadPkg import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.GetDeviceInfoPkg @@ -124,11 +126,14 @@ class BleDataWorker(private val updateEventSink: (Map) -> Unit) { result = 0 Log.i("file", "receive $currentFileName") File(Constant.getPathX(currentFileName)).writeBytes(this) + } val pkg = EndReadPkg() Log.i("file", "bytes ${pkg.buf}") sendCmd(pkg.buf) cmdState = 3 + + } else { val pkg = ReadContentPkg(currentPkg) sendCmd(pkg.buf) @@ -157,7 +162,6 @@ class BleDataWorker(private val updateEventSink: (Map) -> Unit) { s += "$k: " s += "${json.get(k)} " } - Log.d("DeviceInfoFaiz", "This is the DeviceInfo: ${gson.toJson(json)}"); val returnData = mapOf("type" to "infoDataCheckMe", "data" to gson.toJson(json)) updateEventSink(returnData) } @@ -184,8 +188,6 @@ class BleDataWorker(private val updateEventSink: (Map) -> Unit) { myBleDataManager?.setNotifyListener(comeData) bluetoothDevice?.let { myBleDataManager?.connect(it)?.useAutoConnect(false)?.retry(150, 100)?.done { - Log.i("BLE", "连接成功了.>>.....>>>>") - getDeviceInfo(); dataScope.launch { connectChannel.send("yes") } @@ -202,7 +204,7 @@ class BleDataWorker(private val updateEventSink: (Map) -> Unit) { this.currentFileName = name cmdState = 1 val pkg = StartReadPkg(name) - Log.i("----- Current PKG -----", pkg.toString()); + Log.i("----- Current PKG -----", pkg.buf.toString()); sendCmd(pkg.buf) return fileChannel.receive() } diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/utils/UiChannel.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/utils/UiChannel.kt new file mode 100644 index 00000000..6437981e --- /dev/null +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/utils/UiChannel.kt @@ -0,0 +1,7 @@ +package com.cloud.diplomaticquarterapp.utils + +import kotlinx.coroutines.channels.Channel + +object UiChannel { + val progressChannel = Channel(Channel.CONFLATED) +} \ No newline at end of file diff --git a/lib/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_all_in-one_connect_screen.dart b/lib/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_all_in-one_connect_screen.dart index 02f3c0ad..818b4492 100644 --- a/lib/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_all_in-one_connect_screen.dart +++ b/lib/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_all_in-one_connect_screen.dart @@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/ble_de import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -31,11 +32,62 @@ class _AndesAllInOneConnectScreenState extends State super.dispose(); } - Widget buildWeightScaleUI(MyTrackersViewModel myTrackersViewModel) { + String getTrackerNameByEnum(TrackerTypeEnum trackerTypeEnum) { + switch (trackerTypeEnum) { + case TrackerTypeEnum.OxymeterTracker: + return "Oxymeter"; + + case TrackerTypeEnum.BloodPressureTracker: + return "Blood Pressure"; + + case TrackerTypeEnum.BloodSugarTracker: + return "Blood Glucose"; + + case TrackerTypeEnum.ECGTracker: + return "ECG"; + + case TrackerTypeEnum.WeightScale: + return "Weight Scale"; + + case TrackerTypeEnum.Temperature: + return "Temperature"; + + case TrackerTypeEnum.Spirometer: + return "Spirometer"; + + case TrackerTypeEnum.AllInOneTracker: + return "All in One"; + } + return "All in One"; + } + + Future onTrackerTypePressed(TrackerTypeEnum trackerTypeEnum, MyTrackersViewModel myTrackersViewModel) async { + switch (trackerTypeEnum) { + case TrackerTypeEnum.BloodPressureTracker: + case TrackerTypeEnum.BloodSugarTracker: + myTrackersViewModel.getCheckMeUsersListDialog(context); + break; + case TrackerTypeEnum.OxymeterTracker: + // TODO: Handle this case. + break; + case TrackerTypeEnum.ECGTracker: + // TODO: Handle this case. + break; + case TrackerTypeEnum.Temperature: + // TODO: Handle this case. + break; + case TrackerTypeEnum.Spirometer: + case TrackerTypeEnum.WeightScale: + case TrackerTypeEnum.AllInOneTracker: + break; + } + } + + Widget buildAllInOneUI(MyTrackersViewModel myTrackersViewModel) { return Expanded( child: ListView( children: [ - if (myTrackersViewModel.checkMeInfo == null) ...[ + if (myTrackersViewModel.checkMeProUsersList == null) ...[ Padding( padding: const EdgeInsets.all(24.0), child: Center( @@ -46,15 +98,30 @@ class _AndesAllInOneConnectScreenState extends State ), ) ] else ...[ - Padding( - padding: const EdgeInsets.all(24.0), - child: Center( - child: Text( - "${myTrackersViewModel.checkMeInfo.toString()}", - style: TextStyle(fontSize: 9.0), + Center( + child: Column( + children: [ + GridView.builder( + shrinkWrap: true, + primary: false, + physics: NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 2 / 2, crossAxisSpacing: 12, mainAxisSpacing: 12), + padding: EdgeInsets.zero, + itemCount: myTrackersViewModel.checkMeProTrackers.length, + itemBuilder: (BuildContext context, int index) { + return InkWell( + onTap: () => onTrackerTypePressed(myTrackersViewModel.checkMeProTrackers[index], myTrackersViewModel), + child: MedicalProfileItem( + title: getTrackerNameByEnum(myTrackersViewModel.checkMeProTrackers[index]), + imagePath: 'tracker.svg', + subTitle: "", + isEnable: true, + ), + ); + }, ), - ), - ) + ], + )) ] ], ), @@ -77,8 +144,8 @@ class _AndesAllInOneConnectScreenState extends State crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - buildWeightScaleUI(myTrackersViewModel), - if (myTrackersViewModel.isAndesfitDeviceConnected != null && myTrackersViewModel.isAndesfitDeviceConnected) ...[ + buildAllInOneUI(myTrackersViewModel), + if (myTrackersViewModel.checkMeProUsersList != null) ...[ Row( children: [ Expanded( diff --git a/lib/pages/medical/my_trackers/ble_device_type_screens/ble_devices_screen.dart b/lib/pages/medical/my_trackers/ble_device_type_screens/ble_devices_screen.dart index da3470a9..8c73703f 100644 --- a/lib/pages/medical/my_trackers/ble_device_type_screens/ble_devices_screen.dart +++ b/lib/pages/medical/my_trackers/ble_device_type_screens/ble_devices_screen.dart @@ -16,6 +16,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; class BleDevicesScreen extends StatefulWidget { @@ -118,7 +119,22 @@ class _BleDevicesScreenState extends State { if (myTrackersVm.isDeviceFromAndesFit(device.name)) { return; } - Navigator.pushReplacement(context, FadePage(page: AndesAllInOneConnectScreen(deviceModel: device))); + + Permission.storage.isGranted.then((isGranted) { + log("isGranted: $isGranted"); + + if (!isGranted) { + Permission.manageExternalStorage.request().then((granted) { + log("status: $granted"); + + if (granted == PermissionStatus.granted) { + Navigator.pushReplacement(context, FadePage(page: AndesAllInOneConnectScreen(deviceModel: device))); + } + }); + } else { + Navigator.pushReplacement(context, FadePage(page: AndesAllInOneConnectScreen(deviceModel: device))); + } + }); break; } } diff --git a/lib/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/bloodpressure_connect_screen.dart b/lib/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/bloodpressure_connect_screen.dart index df56ba18..82f55c0c 100644 --- a/lib/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/bloodpressure_connect_screen.dart +++ b/lib/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/bloodpressure_connect_screen.dart @@ -324,7 +324,6 @@ class _BloodPressureConnectScreenState extends State if (myTrackersVm.isECGSelected) ...[ IconButton( onPressed: () async { - myTrackersVm.updateFilesLoader(true); showHistoryDialog(context); await myTrackersVm.getEcgFilesList(widget.deviceModel); diff --git a/lib/pages/medical/my_trackers/ble_device_type_screens/select_tracker_type.dart b/lib/pages/medical/my_trackers/ble_device_type_screens/select_tracker_type.dart index 471090d0..f12b2d1d 100644 --- a/lib/pages/medical/my_trackers/ble_device_type_screens/select_tracker_type.dart +++ b/lib/pages/medical/my_trackers/ble_device_type_screens/select_tracker_type.dart @@ -1,4 +1,3 @@ - import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/ble_devices_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; @@ -10,7 +9,6 @@ import 'package:provider/provider.dart'; class SelectTrackerType extends StatelessWidget { const SelectTrackerType(); - List myTrackersTypeList({BuildContext context}) { List medical = []; medical.add(InkWell( @@ -25,90 +23,104 @@ class SelectTrackerType extends StatelessWidget { isEnable: true, ), )); - medical.add(InkWell( - onTap: () { - context.read().updateSelectedTrackerType(TrackerTypeEnum.BloodPressureTracker); - Navigator.of(context).push(FadePage(page: BleDevicesScreen())); - }, - child: MedicalProfileItem( - title: "Blood Pressure", - imagePath: 'tracker.svg', - subTitle: "Tracker", - isEnable: true, + medical.add( + InkWell( + onTap: () { + context.read().updateSelectedTrackerType(TrackerTypeEnum.BloodPressureTracker); + Navigator.of(context).push(FadePage(page: BleDevicesScreen())); + }, + child: MedicalProfileItem( + title: "Blood Pressure", + imagePath: 'tracker.svg', + subTitle: "Tracker", + isEnable: true, + ), ), - )); - medical.add(InkWell( - onTap: () { - context.read().updateSelectedTrackerType(TrackerTypeEnum.BloodSugarTracker); - Navigator.of(context).push(FadePage(page: BleDevicesScreen())); - }, - child: MedicalProfileItem( - title: "Blood Sugar", - imagePath: 'tracker.svg', - subTitle: "Tracker", - isEnable: true, + ); + medical.add( + InkWell( + onTap: () { + context.read().updateSelectedTrackerType(TrackerTypeEnum.BloodSugarTracker); + Navigator.of(context).push(FadePage(page: BleDevicesScreen())); + }, + child: MedicalProfileItem( + title: "Blood Sugar", + imagePath: 'tracker.svg', + subTitle: "Tracker", + isEnable: true, + ), ), - )); - medical.add(InkWell( - onTap: () { - context.read().updateSelectedTrackerType(TrackerTypeEnum.ECGTracker); - Navigator.of(context).push(FadePage(page: BleDevicesScreen())); - }, - child: MedicalProfileItem( - title: "ECG", - imagePath: 'tracker.svg', - subTitle: "Tracker", - isEnable: true, + ); + medical.add( + InkWell( + onTap: () { + context.read().updateSelectedTrackerType(TrackerTypeEnum.ECGTracker); + Navigator.of(context).push(FadePage(page: BleDevicesScreen())); + }, + child: MedicalProfileItem( + title: "ECG", + imagePath: 'tracker.svg', + subTitle: "Tracker", + isEnable: true, + ), ), - )); - medical.add(InkWell( - onTap: () { - context.read().updateSelectedTrackerType(TrackerTypeEnum.WeightScale); - Navigator.of(context).push(FadePage(page: BleDevicesScreen())); - }, - child: MedicalProfileItem( - title: "Weight", - imagePath: 'tracker.svg', - subTitle: "Scale", - isEnable: true, + ); + medical.add( + InkWell( + onTap: () { + context.read().updateSelectedTrackerType(TrackerTypeEnum.WeightScale); + Navigator.of(context).push(FadePage(page: BleDevicesScreen())); + }, + child: MedicalProfileItem( + title: "Weight", + imagePath: 'tracker.svg', + subTitle: "Scale", + isEnable: true, + ), ), - )); - medical.add(InkWell( - onTap: () { - context.read().updateSelectedTrackerType(TrackerTypeEnum.Temperature); - Navigator.of(context).push(FadePage(page: BleDevicesScreen())); - }, - child: MedicalProfileItem( - title: "Temperature", - imagePath: 'tracker.svg', - subTitle: "Scale", - isEnable: true, + ); + medical.add( + InkWell( + onTap: () { + context.read().updateSelectedTrackerType(TrackerTypeEnum.Temperature); + Navigator.of(context).push(FadePage(page: BleDevicesScreen())); + }, + child: MedicalProfileItem( + title: "Temperature", + imagePath: 'tracker.svg', + subTitle: "Scale", + isEnable: true, + ), ), - )); - medical.add(InkWell( - onTap: () { - context.read().updateSelectedTrackerType(TrackerTypeEnum.Spirometer); - Navigator.of(context).push(FadePage(page: BleDevicesScreen())); - }, - child: MedicalProfileItem( - title: "Spirometer", - imagePath: 'tracker.svg', - subTitle: "Tracker", - isEnable: true, + ); + medical.add( + InkWell( + onTap: () { + context.read().updateSelectedTrackerType(TrackerTypeEnum.Spirometer); + Navigator.of(context).push(FadePage(page: BleDevicesScreen())); + }, + child: MedicalProfileItem( + title: "Spirometer", + imagePath: 'tracker.svg', + subTitle: "Tracker", + isEnable: true, + ), ), - )); - medical.add(InkWell( - onTap: () { - context.read().updateSelectedTrackerType(TrackerTypeEnum.AllInOneTracker); - Navigator.of(context).push(FadePage(page: BleDevicesScreen())); - }, - child: MedicalProfileItem( - title: "All in one Monitor", - imagePath: 'tracker.svg', - subTitle: "Tracker", - isEnable: true, + ); + medical.add( + InkWell( + onTap: () { + context.read().updateSelectedTrackerType(TrackerTypeEnum.AllInOneTracker); + Navigator.of(context).push(FadePage(page: BleDevicesScreen())); + }, + child: MedicalProfileItem( + title: "All in one Monitor", + imagePath: 'tracker.svg', + subTitle: "Tracker", + isEnable: true, + ), ), - )); + ); return medical; } diff --git a/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_bp_model.dart b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_bp_model.dart new file mode 100644 index 00000000..0dc05d99 --- /dev/null +++ b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_bp_model.dart @@ -0,0 +1,27 @@ +class CheckMeBPModel { + String date; + int dia; + int pr; + int sys; + String timeString; + + CheckMeBPModel({this.date, this.dia, this.pr, this.sys, this.timeString}); + + CheckMeBPModel.fromJson(Map json) { + date = json['date']; + dia = json['dia']; + pr = json['pr']; + sys = json['sys']; + timeString = json['timeString']; + } + + Map toJson() { + final Map data = new Map(); + data['date'] = this.date; + data['dia'] = this.dia; + data['pr'] = this.pr; + data['sys'] = this.sys; + data['timeString'] = this.timeString; + return data; + } +} diff --git a/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_ecg_model.dart b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_ecg_model.dart new file mode 100644 index 00000000..3a57e762 --- /dev/null +++ b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_ecg_model.dart @@ -0,0 +1,27 @@ +class CheckMeECGModel { + String date; + int face; + String timeString; + int voice; + int way; + + CheckMeECGModel({this.date, this.face, this.timeString, this.voice, this.way}); + + CheckMeECGModel.fromJson(Map json) { + date = json['date']; + face = json['face']; + timeString = json['timeString']; + voice = json['voice']; + way = json['way']; + } + + Map toJson() { + final Map data = new Map(); + data['date'] = this.date; + data['face'] = this.face; + data['timeString'] = this.timeString; + data['voice'] = this.voice; + data['way'] = this.way; + return data; + } +} diff --git a/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_glucose_model.dart b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_glucose_model.dart new file mode 100644 index 00000000..6b5d6797 --- /dev/null +++ b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_glucose_model.dart @@ -0,0 +1,24 @@ +class CheckMeGlucoseModel { + String date; + double glu; + String note; + String timeString; + + CheckMeGlucoseModel({this.date, this.glu, this.note, this.timeString}); + + CheckMeGlucoseModel.fromJson(Map json) { + date = json['date']; + glu = json['glu']; + note = json['note']; + timeString = json['timeString']; + } + + Map toJson() { + final Map data = new Map(); + data['date'] = this.date; + data['glu'] = this.glu; + data['note'] = this.note; + data['timeString'] = this.timeString; + return data; + } +} diff --git a/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_oxi_model.dart b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_oxi_model.dart new file mode 100644 index 00000000..00a83c82 --- /dev/null +++ b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_oxi_model.dart @@ -0,0 +1,36 @@ +class CheckMeOxiModel { + String date; + int face; + int oxy; + int pi; + int pr; + String timeString; + int way; + + CheckMeOxiModel({this.date, this.face, this.oxy, this.pi, this.pr, this.timeString, this.way}); + + CheckMeOxiModel.fromJson(Map json) { + date = json['date']; + face = json['face']; + oxy = json['oxy']; + pi = json['pi']; + pr = json['pr']; + timeString = json['timeString']; + way = json['way']; + } + + Map toJson() { + final Map data = new Map(); + data['date'] = this.date; + data['face'] = this.face; + data['oxy'] = this.oxy; + data['pi'] = this.pi; + data['pr'] = this.pr; + data['timeString'] = this.timeString; + data['way'] = this.way; + return data; + } +} + + + diff --git a/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_temperature_model.dart b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_temperature_model.dart new file mode 100644 index 00000000..90265fe9 --- /dev/null +++ b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_temperature_model.dart @@ -0,0 +1,29 @@ +class CheckMeTemperatureModel { + String date; + int face; + String timeString; + double tmp; + int way; + + CheckMeTemperatureModel({this.date, this.face, this.timeString, this.tmp, this.way}); + + CheckMeTemperatureModel.fromJson(Map json) { + date = json['date']; + face = json['face']; + timeString = json['timeString']; + tmp = json['tmp']; + way = json['way']; + } + + Map toJson() { + final Map data = new Map(); + data['date'] = this.date; + data['face'] = this.face; + data['timeString'] = this.timeString; + data['tmp'] = this.tmp; + data['way'] = this.way; + return data; + } +} + + diff --git a/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_user_model.dart b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_user_model.dart new file mode 100644 index 00000000..faf377fc --- /dev/null +++ b/lib/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_user_model.dart @@ -0,0 +1,36 @@ +class CheckMeUserInfoModel { + String birthday; + int color; + int height; + int ico; + String id; + String name; + int sex; + int weight; + + CheckMeUserInfoModel({this.birthday, this.color, this.height, this.ico, this.id, this.name, this.sex, this.weight}); + + CheckMeUserInfoModel.fromJson(Map json) { + birthday = json['birthday']; + color = json['color']; + height = json['height']; + ico = json['ico']; + id = json['id']; + name = json['name']; + sex = json['sex']; + weight = json['weight']; + } + + Map toJson() { + final Map data = new Map(); + data['birthday'] = this.birthday; + data['color'] = this.color; + data['height'] = this.height; + data['ico'] = this.ico; + data['id'] = this.id; + data['name'] = this.name; + data['sex'] = this.sex; + data['weight'] = this.weight; + return data; + } +} diff --git a/lib/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart b/lib/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart index 5f6cd5cf..187bb283 100644 --- a/lib/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart +++ b/lib/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart @@ -1,10 +1,12 @@ import 'dart:async'; import 'dart:convert'; import 'dart:developer'; +import 'package:diplomaticquarterapp/config/size_config.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/andesfit_devices/all_in_one_monitor/check_me_info_model.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/andesfit_devices/bt_constants.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/andesfit_devices/weight_data_model.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/ble_devices_model.dart'; +import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_user_model.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/viatom_devices/bp_rt_model.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/viatom_devices/ecg_file_detail_model.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/viatom_devices/ecg_rt_model.dart'; @@ -14,6 +16,7 @@ import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/ble_utils.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:flutter/services.dart'; import 'package:flutter/cupertino.dart'; @@ -21,6 +24,7 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_helpers/ble_connect_helper.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, AllInOneTracker } @@ -31,7 +35,7 @@ String kRealTimeDataBPResult = "RealTimeDataBPResult"; String kOxyRtParam = "OxyRtParam"; String kDevicesList = "DevicesList"; String kDevicesListCheckMe = "DevicesListCheckMe"; -String kInfoDataCheckMe = "infoDataCheckMe"; +String kCheckMeUsersList = "CheckMeUsersList"; String kRealTimeDataECGMeasuring = "RealTimeDataECGMeasuring"; // This is for the device that measures BP and ECG also Like BP2 0567 String kRealTimeDataECGResult = "RealTimeDataECGResult"; String kRealTimeDataECG = "RealTimeDataECG"; @@ -103,6 +107,13 @@ class MyTrackersViewModel extends ChangeNotifier { }; List ecgEnabledDevices = ["BP2 0567", "DuoEK", "ER1", "PM101897"]; + List checkMeProTrackers = [ + TrackerTypeEnum.Temperature, + TrackerTypeEnum.BloodPressureTracker, + TrackerTypeEnum.OxymeterTracker, + TrackerTypeEnum.BloodSugarTracker, + TrackerTypeEnum.ECGTracker, + ]; List andesFitDevices = [ "BPM", "PM101897", @@ -211,13 +222,102 @@ class MyTrackersViewModel extends ChangeNotifier { notifyListeners(); } - String checkMeInfo; + List checkMeProUsersList; + + void updateCheckMeUserInfoModel(List returnData) { + if (checkMeProUsersList != null) { + checkMeProUsersList.clear(); + } + checkMeProUsersList = List.generate(returnData.length, (index) => CheckMeUserInfoModel.fromJson(jsonDecode(returnData[index]))); - void updateCheckMeInfoModel(String mapData) { - checkMeInfo = mapData; notifyListeners(); } + getCheckMeUsersListDialog(BuildContext context) { + return showDialog( + context: context, + builder: (context) => Container( + decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(15)), color: Colors.white), + padding: const EdgeInsets.all(20), + margin: const EdgeInsets.symmetric(vertical: 35, horizontal: 30), + child: SingleChildScrollView( + child: Consumer(builder: (BuildContext context, MyTrackersViewModel myTrackersVm, Widget child) { + return Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Material( + child: Center( + child: Text( + "Users List", + style: TextStyle( + fontSize: SizeConfig.textMultiplier * 1.8, + fontWeight: FontWeight.w600, + letterSpacing: -0.3, + height: 13 / 10, + ), + ), + ), + ), + if (myTrackersVm.filesLoader) ...[ + Center(child: CircularProgressIndicator()) + ] else if (myTrackersVm.checkMeProUsersList != null && myTrackersVm.checkMeProUsersList.isNotEmpty) ...[ + Material( + child: SizedBox( + height: MediaQuery.of(context).size.height * 0.7, + child: ListView.separated( + itemCount: checkMeProUsersList.length, + separatorBuilder: (context, index) => SizedBox(height: 14), + shrinkWrap: true, + reverse: false, + itemBuilder: (context, index) { + CheckMeUserInfoModel userModel = checkMeProUsersList[index]; + return InkWell( + onTap: () => Navigator.pop(context), + child: Container( + decoration: cardRadius(12), + padding: EdgeInsets.all(12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("${userModel.id}. ${userModel.name}"), + mHeight(4.0), + Text("Gender: ${userModel.sex == 1 ? "Female" : "Male"}"), + mHeight(4.0), + Text("Height: ${userModel.height}"), + mHeight(4.0), + Text("Weight: ${userModel.height}"), + ], + ), + ), + ); + }, + ), + ), + ) + ] else ...[ + Material( + child: Center( + child: Text( + "No Users to show", + style: TextStyle( + fontSize: SizeConfig.textMultiplier * 1.6, + fontWeight: FontWeight.w600, + letterSpacing: -0.3, + height: 13 / 10, + ), + ), + ), + ), + ] + ], + ); + }), + ), + ), + ); + } + Widget getFilesListWidget(List filesList, BuildContext context) { return Material( child: SizedBox( @@ -323,8 +423,8 @@ class MyTrackersViewModel extends ChangeNotifier { parsesDevicesList(list); } - if (event['type'] == kInfoDataCheckMe) { - updateCheckMeInfoModel(event['data'].toString()); + if (event['type'] == kCheckMeUsersList) { + updateCheckMeUserInfoModel(event['data']); } }); @@ -651,8 +751,6 @@ class MyTrackersViewModel extends ChangeNotifier { String resultSet1 = ""; String resultSet2 = ""; - String resultSetCheckMeProUsers = ""; - Future connectAndesfitWeightDevice(BluetoothDevice device) async { log("deviceToConnect: ${device.toString()}"); @@ -1093,16 +1191,10 @@ class MyTrackersViewModel extends ChangeNotifier { bool isDeviceSelected = false; - List listOutput = []; - - int cmdState = 0; - String currentFileName = "usr.dat"; - var currentFileSize = 0; - int pkgTotal = 0; - int result = 0; - int currentPkg = 0; - Future connectAndesfitAllInOneDevice(BluetoothDevice device) async { log("deviceToConnect: ${device.toString()}"); } + +//// --> CHECK ME PRO + }