Compare commits

..

626 Commits

Author SHA1 Message Date
haroon amjad 8e3f20794d Radiology ExamId updates 8 months ago
haroon amjad c1dae542c9 tamara fix 10 months ago
haroon amjad 220c954a4a updates 10 months ago
Syed Taha Alam 303e9114a3 Wd: Nearest appointemtn added in search by hospital 11 months ago
haroon amjad fff45cd3a8 Update to stores VersionID 18.6 11 months ago
haroon amjad 1ee86d0813 PDF report implemented for Lab, Rad, Prescription, SickLeave & Medical Report. 11 months ago
haroon amjad 0c3ef15895 Privacy policy updates 11 months ago
haroon amjad f7599a47e7 LiveCare Phone Call type Mobile number edit field disabled as per Mr Rwaid's instructions. 11 months ago
haroon amjad a0528da4cd fix for medical report & user agreement page 11 months ago
haroon amjad cb68731679 updates & fixes 11 months ago
haroon amjad f56a1627db updates & fixes 11 months ago
haroon amjad 260edfa303 update to stores, VersionID 18.4 11 months ago
haroon amjad 5fc939bf1e Merge branch 'dev_v3.13.6_deep_link' into dev_v3.13.6 11 months ago
haroon amjad f621f8c8d1 fixes 11 months ago
taha.alam f8a66a58f8 WD:new deeplink schema added. make it compatible to link as follows:
* with https http and www
* without www and containing http or https
* only link e.g hmg.com/navigate
11 months ago
Syed Taha Alam 57415bd670 Merge remote-tracking branch 'origin/dev_v3.13.6_deep_link' into dev_v3.13.6_deep_link 11 months ago
Syed Taha Alam 390455e5a2 deeplink done 11 months ago
taha.alam ec96fecf2f WD:deeplink changes. 11 months ago
taha.alam bdcda02b26 WD:deeplink changes. 11 months ago
taha.alam 68eab7639c Merge dev_3.13.6 to deep_link 11 months ago
haroon amjad cb7a444d83 fixes 11 months ago
haroon amjad c1212c2c6a Dental updates & fixes, Update to stores VersionID 18.3 11 months ago
haroon amjad 4564b42018 updates & fixes 11 months ago
haroon amjad d921b1d081 Merge branch 'dev_v3.13.6_search_hospital_by_region' into dev_v3.13.6 11 months ago
haroon amjad b308079255 updates & fixes 11 months ago
haroon amjad 7a821a4604 updates 11 months ago
haroon amjad a2dd8f2e35 no message 11 months ago
haroon amjad 4cde49cb51 er checkin changes 11 months ago
taha.alam bbf18baade WD: 0 count hmg or hmc will not be displayed 11 months ago
taha.alam 2e9f6bcb51 WD: show nearest doctor item different for search clinic 11 months ago
Haroon Amjad 8d23ea6fda Release Sent to stores, VersionID 18.2 12 months ago
taha.alam 9074bf2e65 WD:location icon added. 12 months ago
taha.alam b46eb6214e Merge branch 'dev_v3.13.6' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_search_hospital_by_region 12 months ago
taha.alam 4b40d5d5a0 WD: Color of hospital name will be as of the type of it. 12 months ago
taha.alam 5dbd97aa46 WD: hospital name selection change 12 months ago
Haroon Amjad 556ff02e64 update sent to stores, VersionID 18.1 12 months ago
taha.alam e3b75b18c8 WD: stepper back button added and text directionality added. 12 months ago
taha.alam cb8eb316ec Merge branch 'dev_v3.13.6' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_search_hospital_by_region
# Conflicts:
#	lib/config/localized_values.dart
#	lib/uitl/translations_delegate_base.dart
12 months ago
Syed Taha Alam 159135bb77 Wd: Item size changes. 12 months ago
taha.alam 88cd6f811a WD: doctor screen issue changes and string changes of top bar 12 months ago
taha.alam ca965a6d06 WD:String value change and context changes 12 months ago
taha.alam e6fcb1fddf WD:select hospital by region changes 12 months ago
taha.alam 951a5a4932 WD: search by region changes 12 months ago
Syed Taha Alam ae4c287af2 new ui integrated. 12 months ago
taha.alam 8ffcebc44e WD:deeplink changes. 12 months ago
haroon amjad 9590d268a0 Update sent to stores, VersionID 18.0 1 year ago
haroon amjad a1600dbfce LiveCare Terms & Conditions updated 1 year ago
haroon amjad 0dc32e061f User agreement updates done. 1 year ago
haroon amjad d865bd9c3b user agreement updates 1 year ago
haroon amjad 7842f95d7b livecare insurance navigation issue fixed 1 year ago
taha.alam e876eaaa33 Merge branch 'dev_v3.13.6' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_deep_link
# Conflicts:
#	pubspec.yaml
1 year ago
taha.alam d4c741e1ec Merge branch 'dev_v3.13.6' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_search_hospital_by_region
# Conflicts:
#	lib/uitl/translations_delegate_base.dart
1 year ago
haroon amjad 21fda7987a Updates & fixes, App uploaded to Stores VersionID 17.9 1 year ago
taha.alam e5198f093a Merge branch 'dev_v3.13.6_deep_link' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_deep_link 1 year ago
taha.alam e2efc3749c WD:deeplink changes. 1 year ago
haroon amjad 91b9e792c6 updates 1 year ago
haroon amjad c2785c5f68 Updates & fixes 1 year ago
haroon amjad 7ed401fb1c Riyal symbol update & sent to stores VersionID 17.8 1 year ago
haroon amjad 0706d9f5f9 App update sent to Stores VersionID 17.7 1 year ago
haroon amjad 889828d4d4 Lab report download VIDA Plus implementation 1 year ago
haroon amjad 8b74c9df61 updates 1 year ago
sultan khan e66e42edda next day appointment updates 1 year ago
sultan khan b93d373c6f next appointment updated. 1 year ago
sultan khan 2c746bf783 next day appointments change. 1 year ago
taha.alam 81ddb81b8e Merge branch 'dev_v3.13.6' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_deep_link 1 year ago
haroon amjad 3bf1e3fceb Ask Dr error toast issue resolved 1 year ago
sultan khan 08965c72c8 Merge branch 'dev_v3.13.6' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_deep_link 1 year ago
haroon amjad b445d1d59e image added 1 year ago
haroon amjad 1080a59106 Lab report download enabled 1 year ago
Haroon Amjad 2c5be020e9 LanguageID added in Lab Report Email API 1 year ago
haroon amjad 7d33ace5c9 images added 1 year ago
haroon amjad f74a3301da SAR new symbol integrated 1 year ago
haroon amjad 744e3978d3 user agreement service privilege added 1 year ago
haroon amjad a24582a578 InPatient check added in Family file switch 1 year ago
Haroon Amjad 04413aa7d6 lab report updates 1 year ago
taha.alam 6cf86e2e84 WIP: deeplink added to android and ios 1 year ago
taha.alam 06192292d0 WD: unresolved reference issue fixed 1 year ago
taha.alam 2a37777b9a Merge branch 'dev_v3.13.6_search_hospital_by_region' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_search_hospital_by_region 1 year ago
taha.alam c2f38f1b7f Merge branch 'dev_v3.13.6' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6_search_hospital_by_region
# Conflicts:
#	android/app/build.gradle
#	android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt
#	android/app/src/main/res/values/strings.xml
1 year ago
sultan khan 2ab0d0b682 WD:get current location place change and live care ui changes 1 year ago
taha.alam 0221cb1250 WD: search by region added for the doctors to be mapped. 1 year ago
haroon amjad d98f2c31a2 updates 1 year ago
taha.alam 7cafe3aaa9 WD: Arabic name value is handled. 1 year ago
taha.alam 11b83d1276 WD: Grouped by region ui changed and added to other two tabs of Search 1 year ago
haroon amjad c77ffb1730 updates 1 year ago
haroon amjad 780f645cbe Updates & fixes, CR 6038 Ask Dr changes implemented 1 year ago
Haroon Amjad a31c677919 invoice type check added 1 year ago
haroon amjad 95a4d8dd14 PaymentRequestID added in InPatient Advance Insert API 1 year ago
haroon amjad 880611f7bb Insurance card details button removed, Autofill for WhatsApp for android implemented, Updated to stores VersionID 17.3 1 year ago
haroon amjad e9accb00ef updates 1 year ago
haroon amjad 62bc29d450 updates 1 year ago
taha.alam bd3dca6719 WD: session id issue fixed 1 year ago
taha.alam 59335ac04d WD: reverting changes 1 year ago
taha.alam 8509c3d94d WD: picking otp and providing the code to flutter channel 1 year ago
taha.alam c4de4c1bd9 Merge branch 'dev_v3.13.6' of http://34.17.52.180/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/uitl/whatsapp_method_channel.dart
1 year ago
haroon amjad b677be9e3c Updates & fixes 1 year ago
taha.alam ff7afe5997 WD: vital sign camera screen added 1 year ago
taha.alam 4bfaf0a0d8 WD: vital sign camera screen added 1 year ago
taha.alam 21b2fae806 WD: vital sign changes 1 year ago
taha.alam f52aed49fd WD: gradle changes 1 year ago
taha.alam c6787ff966 WD: doctor list by region and sorting by name and distance 1 year ago
taha.alam 615f3bfa8e WD: region filter is added. 1 year ago
taha.alam cd460ee31b WIP: doctor list by region 1 year ago
haroon amjad 229efb2e25 Medical report In-App view & share enabled & update sent to stores VersionID 17.2 1 year ago
haroon amjad c72892b1a6 SMS Auto OTP Verify enabled & build sent to stores, VersionID 17.1 1 year ago
haroon amjad 32cf61d1bf Download & Share options added for Ready Medical Report. 1 year ago
haroon amjad b5eaedb721 Update to stores VersionID 17.1, CR 5047 & CR 7241. 1 year ago
haroon amjad 3f22d69058 Merge branch 'dev_v3.13.6' into dev_3.13.6_CR5047_LiveCare_Enhancements
# Conflicts:
#	lib/config/config.dart
#	lib/main.dart
#	lib/splashPage.dart
#	lib/uitl/CalendarUtils.dart
#	lib/uitl/translations_delegate_base.dart
1 year ago
haroon amjad 0e73d6d23e updates 1 year ago
haroon amjad e0de0768b6 CR 7241 changes, ProjectID added in radiology results if navigating from appointment details 1 year ago
haroon amjad ab33d06b91 Fix for VIDA4 Lab Special Result 1 year ago
haroon amjad 6f0f422adf CheckIn button removed as per Mr Rwaid's instructions. 1 year ago
haroon amjad 65d7f3f9b9 Font family fixes 1 year ago
haroon amjad d474eb9a24 Code commented for Lab result widget, ER Online CheckIn QR & location check-in & Patient occupation selection to publish laser clinic changes to store - VersionID 17.0 1 year ago
haroon amjad 9909cfaa57 QRCode & Location checkin implemented in ER Online Check-In 1 year ago
haroon amjad 291cf16d22 Changes for Laser clinic full body part 1 year ago
haroon amjad baa7790b89 Patient occupation selection implemented 1 year ago
haroon amjad 545cfcd6d9 updates 1 year ago
haroon amjad 924c111771 Lab result widget fixes 1 year ago
haroon amjad cfcba179c4 CR 7241 Lab result enhancement code merged 1 year ago
haroon amjad b80e171d25 Merge branch 'dev_3.3_LabReportEnhancementCR' into dev_3.13.6_Development
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/core/model/labs/patient_lab_orders.dart
#	lib/uitl/translations_delegate_base.dart
#	lib/uitl/utils.dart
#	lib/widgets/charts/show_chart.dart
#	lib/widgets/data_display/medical/LabResult/LabResultWidget.dart
#	lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart
#	lib/widgets/my_rich_text.dart
1 year ago
haroon amjad 1561a776e3 Merge branch 'dev_v3.13.6' into dev_3.13.6_Development
# Conflicts:
#	lib/config/config.dart
#	lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInBookAppointment.dart
#	lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInHome.dart
#	lib/pages/ErService/EROnlineCheckIn/EROnlineCheckInPaymentDetails.dart
#	lib/pages/landing/fragments/home_page_fragment2.dart
#	lib/services/appointment_services/GetDoctorsList.dart
#	lib/services/clinic_services/get_clinic_service.dart
1 year ago
haroon amjad cd7da0dd70 Penguin SDK changes & crashlytics 1 year ago
haroon amjad 21403a2bba InPatient Help PRO error handling issue resolved 1 year ago
haroon amjad 849164be2c Laser appointment booking changes 1 year ago
haroon amjad 931e748a54 updates 1 year ago
haroon amjad dff03796e9 Crashlytics enabled 1 year ago
haroon amjad c58cbae99c InPatient prescription send email issue fixed 1 year ago
haroon amjad 1cadee754e CR Implemented 1 year ago
haroon amjad 20bfdc3652 Project Name Top & Bottom changes implemented 1 year ago
haroon amjad 091f3b0830 CRs 5656, 5801 & 6265 (InPatient CRs & ER Online Check-In) update to stores with versionID 16.8 1 year ago
haroon amjad 8e46738982 bug fixes 1 year ago
haroon amjad 0bdfa9157b updates 1 year ago
haroon amjad 41b0e65e41 iOS Calendar fix 1 year ago
haroon amjad 068b6c8494 calendar events updates 1 year ago
haroon amjad f58e07d789 Merge branch 'dev_v3.13.6' into dev_3.13.6_CR5047_LiveCare_Enhancements
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/core/service/client/base_app_client.dart
#	lib/pages/conference/zoom/call_screen.dart
#	lib/uitl/translations_delegate_base.dart
1 year ago
haroon amjad 7188919172 Updates & fixes 1 year ago
haroon amjad 82de56266e InPatient Services issues fixed 1 year ago
haroon amjad d9b4b1575d Merge branch 'dev_3.13.6_merge_ER_Online_CheckIn' into dev_v3.13.6 1 year ago
haroon amjad 2997f49a95 updates 1 year ago
haroon amjad 6386da8936 Mapbox key updated to custom maps 1 year ago
haroon amjad 9d444ccca3 updates 1 year ago
haroon amjad 71542e9db6 Inpatient module code merged & code fixes 1 year ago
haroon amjad 6a555ace41 ER Online CheckIn & InPatient CR implemented 1 year ago
haroon amjad 42dbe066fd Merge branch 'dev_3.3_ER_Online_CheckIn' into dev_3.13.6_merge_ER_Online_CheckIn
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/pages/landing/fragments/home_page_fragment2.dart
#	lib/pages/landing/widgets/services_view.dart
#	lib/services/payfort_services/payfort_service.dart
#	lib/services/payfort_services/payfort_view_model.dart
#	lib/uitl/translations_delegate_base.dart
1 year ago
haroon amjad 18b4fc5317 Patient app update 1 year ago
haroon amjad 14a5fec61a updates 1 year ago
haroon amjad 3d44aa2e64 Sickleave updates 1 year ago
haroon amjad 3071a20b8a VIDA 4 package booking update 1 year ago
haroon amjad c6ee01c652 Waiting appointment bug fix 1 year ago
haroon amjad 605f02afe2 Sickleave CR updates & changes 1 year ago
haroon amjad 073cb9f7e8 Update to stores 16.5:
1. Indoor navigation
2. Walkin Appointment
3. Derma Package
4. NPHIES Eligibility
1 year ago
haroon amjad cee903dd6b changes for the hospital gesture clicked area and nearest check not showing the hospital dropdown area 1 year ago
haroon amjad 7ddd932c51 no message 1 year ago
taha.alam 34ffec93fd WD: calender issue fixed. 1 year ago
haroon amjad a6ee6869cc Merge commit '81b94814ce4f0a1e4626fe07a9b7933246d71336' into dev_v3.13.6 1 year ago
taha.alam 81b94814ce WD: hospital top and bottom name added 1 year ago
Haroon Amjad ecd4422905 updates & fixes 1 year ago
Haroon Amjad fb13096f94 NPHIES Eligibility check implemented in LiveCare Schedule Appointment booking in ToDo list 1 year ago
Haroon Amjad 05abea2d53 NPHIES Eligibility check implemented in LiveCare Schedule Appointment booking 1 year ago
taha.alam fe9d259cbd build context handled 1 year ago
Haroon Amjad b042292f9a code merged 1 year ago
Haroon Amjad 69493934b1 Merge branch 'dev_v3.13.6' into dev_v_3.13.6_CR_6804
# Conflicts:
#	lib/config/localized_values.dart
#	lib/pages/BookAppointment/BookConfirm.dart
#	lib/pages/BookAppointment/QRCode.dart
1 year ago
Haroon Amjad 057994dfd2 Merge branch 'dev_3.13.6_CR6750' of http://34.17.75.184/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/config/localized_values.dart
#	lib/core/viewModels/project_view_model.dart
#	lib/uitl/translations_delegate_base.dart
1 year ago
taha.alam 936682ff95 WD: clinic by hospital 1 year ago
Haroon Amjad cf72ffe9ce Merge branch 'dev_v3.13.6' of http://34.17.75.184/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	pubspec.yaml
1 year ago
haroon amjad 8cc1e08421 icons for indoor navigation updated 1 year ago
haroon amjad 8862cc6c06 Release issues resolved 1 year ago
haroon amjad 1e98539537 Code merged for PenguinIn Indoor navigation into main branch 2 years ago
haroon amjad fd70387b2d Merge branch 'dev_v3.13.6' into dev_v3.13.6_PenguinIn
# Conflicts:
#	pubspec.yaml
2 years ago
haroon amjad ef36e8bd30 fixes 2 years ago
haroon amjad 06c0580d84 updates 2 years ago
haroon amjad 03e5604f68 updates 2 years ago
haroon amjad e4d0b93c9f Implemented NPHIES check in WalkIn Appointment 2 years ago
Haroon Amjad 7b4a98bbb9 updates 2 years ago
taha.alam f80892b630 WD: header added to location list 2 years ago
taha.alam 633059b0be WD: Location dialog is added. 2 years ago
haroon amjad b64cf0bf6c SFCalendar issue fixed & update to stores 16.4 2 years ago
haroon amjad faeba6a14c CloudFlare & NPHIES in livecare reinstated 2 years ago
taha.alam e14dc10c1c WD: permission updated for android version 31 and later 2 years ago
haroon amjad 92ccbaa2b5 updates 2 years ago
Haroon Amjad 49c11537b3 updated to latest flutter 3.24 2 years ago
haroon amjad db91921de1 update to stores version 16.3 2 years ago
taha.alam 88940d2c54 Merge remote-tracking branch 'origin/dev_v3.13.6_PenguinIn' into dev_v3.13.6_PenguinIn 2 years ago
taha.alam c6e74e73d0 WD: icon updated 2 years ago
Aamir.Muhammad 3aaaf3c01c Merge branch 'refs/heads/dev_v3.13.6_PenguinIn_3.24-IOS' into dev_v3.13.6_PenguinIn 2 years ago
Aamir.Muhammad 5883b06fcb Updated to 3.24 Flutter & Penguin Fixed. 2 years ago
Aamir.Muhammad e045c375d2 Merge branch 'refs/heads/dev_v3.13.6' into dev_v3.13.6_PenguinIn_3.22-IOS
# Conflicts:
#	lib/config/localized_values.dart
#	lib/uitl/translations_delegate_base.dart
2 years ago
taha.alam 2b293d3c96 WD: penguin library updated. 2 years ago
haroon amjad f42223292a Merge branch 'dev_v3.13.6' into dev_v_3.13.6_CR_6804
# Conflicts:
#	lib/config/config.dart
2 years ago
haroon amjad 6c98f9f94f updates & fixes 2 years ago
haroon amjad 536c95c825 Merge branch 'dev_v3.13.6' into dev_3.13.6_CR6750
# Conflicts:
#	lib/config/localized_values.dart
#	lib/pages/landing/landing_page.dart
#	lib/uitl/translations_delegate_base.dart
#	lib/widgets/drawer/app_drawer_widget.dart
2 years ago
haroon amjad b6ba9fff2f Updates n fixes 2 years ago
haroon amjad dc17576c26 Flutter version upgraded to 3.22.0 2 years ago
haroon amjad 6f0cfebc89 Translation updates as requested by QA 2 years ago
haroon amjad 21c29e6355 LiveCare NPHIES eligibility check implemented 2 years ago
haroon amjad b6adfb2534 ER Online Check-In CR implemented 2 years ago
Haroon Amjad 1c66351011 Updates & fixes 2 years ago
Haroon Amjad e193568aaf Merge branch 'dev_v3.13.6_PenguinIn' of http://34.17.75.184/Haroon6138/diplomatic-quarter into dev_v3.13.6_PenguinIn 2 years ago
taha.alam 771b20f21c WD: clinic_id converted to clinicID. 2 years ago
Haroon Amjad 60a35032e5 Merge branch 'dev_v3.13.6_PenguinIn' of http://34.17.75.184/Haroon6138/diplomatic-quarter into dev_v3.13.6_PenguinIn 2 years ago
Aamir.Muhammad 145cd6010a Merge remote-tracking branch 'origin/dev_v3.13.6_PenguinIn' into dev_v3.13.6_PenguinIn 2 years ago
Aamir.Muhammad 7065b00c5c Penguin Map Integration & Permissions Fixes. 2 years ago
Haroon Amjad e27594d017 Merge branch 'dev_v3.13.6_PenguinIn' of http://34.17.75.184/Haroon6138/diplomatic-quarter into dev_v3.13.6_PenguinIn
# Conflicts:
#	android/app/build.gradle
#	lib/services/payfort_services/payfort_service.dart
2 years ago
Haroon Amjad 72d459ce10 PenguinIn updates 2 years ago
taha.alam ae7fbbfb98 WD: penguin view navigation to clinic id added and username modified. 2 years ago
Aamir.Muhammad 94c3992c8d Merge remote-tracking branch 'origin/dev_v3.13.6_PenguinIn' into dev_v3.13.6_PenguinIn
# Conflicts:
#	android/app/build.gradle
2 years ago
haroon amjad f83d538472 fixes 2 years ago
taha.alam 7ca806571f WD: base url replaced with data url 2 years ago
Aamir.Muhammad 787a3d8662 Merge remote-tracking branch 'origin/dev_v3.13.6_PenguinIn' into dev_v3.13.6_PenguinIn 2 years ago
taha.alam 1ee19ac696 Merge branch 'dev_v3.13.6_PenguinIn' of http://34.17.75.184/Haroon6138/diplomatic-quarter into dev_v3.13.6_PenguinIn 2 years ago
taha.alam e996653253 WD:penguin new sdk 2 years ago
Haroon Amjad 05d0d2d5a7 PenguinIn Params updated 2 years ago
Haroon Amjad 6efb316377 homepage updates 2 years ago
haroon amjad 2d82b97680 updates 2 years ago
Aamir.Muhammad 29830f4f55 Merge remote-tracking branch 'origin/dev_v3.13.6_PenguinIn' into dev_v3.13.6_PenguinIn
# Conflicts:
#	ios/Runner/Helper/HMGPenguinInPlatformBridge.swift
#	ios/Runner/Penguin/PenguinView.swift
2 years ago
Aamir.Muhammad cba8369a51 Penguin Map Integration & Permissions Fixes. 2 years ago
haroon amjad a5d68bf470 update 2 years ago
Haroon Amjad 87c7dcb68a Merge branch 'dev_v3.13.6_PenguinIn' of http://34.17.75.184/Haroon6138/diplomatic-quarter into dev_v3.13.6_PenguinIn 2 years ago
Haroon Amjad 029f174a6c Penguin scenarios implemented 2 years ago
taha.alam 96b7fea5c9 WD:payfort services changes reverted 2 years ago
taha.alam 1e8953538a WD: notification for navigation added 2 years ago
haroon amjad 147fb6cee8 updates 2 years ago
haroon amjad 76545bd152 updates 2 years ago
haroon amjad 393ea45d2c updates 2 years ago
haroon amjad 6d2484e6ac ClinicID fix 2 years ago
haroon amjad f714d17686 fixes 2 years ago
haroon amjad f8d797f80a updates 2 years ago
haroon amjad 98389e3f68 LiveCare Call Type implemented 2 years ago
haroon amjad 9f629afb9c Merge branch 'dev_v3.13.6' into dev_v_3.13.6_CR_6804
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/uitl/app_shared_preferences.dart
2 years ago
haroon amjad f36fc4d88d ListView accordion fixes 2 years ago
haroon amjad d3d8d1f121 Update to stores 16.0 2 years ago
haroon amjad 50ba0372db language updates 2 years ago
haroon amjad 34778d91d7 language fixes 2 years ago
haroon amjad baaacdb2f8 updates 2 years ago
haroon amjad 0eb0a94f48 updates 2 years ago
haroon amjad cab1854cce Merge branch 'dev_v3.13.6' into dev_3.13.6_CR6750 2 years ago
haroon amjad a39d2840e0 Merge branch 'dev_v3.13.6' into dev_v_3.13.6_CR_6804 2 years ago
haroon amjad 66ec7b5ca4 Derma package appointment booking fixes 2 years ago
haroon amjad ed037edf22 Apple Pay fixes 2 years ago
haroon amjad 8838eb4769 Dr speciality translation fix 2 years ago
haroon amjad 5e8fe20f52 updates 2 years ago
haroon amjad b1432280a1 updates 2 years ago
Aamir.Muhammad fb4cf08b89 Penguin Map Integration & Permissions Fixes. 2 years ago
haroon amjad 11a43eb0ae updates 2 years ago
haroon amjad 53015422e5 PenguinIn integration with HMG App 2 years ago
haroon amjad 43741e24cf fixes 2 years ago
haroon amjad 0eaeb75207 Merge branch 'dev_v3.13.6' into dev_3.13.6_CR6750 2 years ago
haroon amjad 82e933a06f updates & fixes for walkin appointment CR 2 years ago
Aamir.Muhammad 4c5ba6048f CR Fixes Search By Clinic & Search By Doctor List Reload Issue 2 years ago
haroon amjad 1b545c4d0b Walkin appointment booking implemented in Appointment Details page 2 years ago
haroon amjad ca8533190a Walkin appointment booking implementation contd 2 years ago
haroon amjad adf00e101f Merge branch 'dev_v3.13.6' into dev_3.13.6_Development 2 years ago
haroon amjad 31aa09e35b translation fix 2 years ago
haroon amjad d65325f998 Payment flow integration for Walk-In appointments 2 years ago
Sultan khan 554548bc9a CR updates 2 years ago
Sultan khan 9501c2ea9a derma CR 6804 CHANGES and language on initial load issue fix. 2 years ago
haroon amjad 984459d314 Walkin appointment implementation contd 2 years ago
haroon amjad b3f2904e9a Waiting appointment implementation contd. 2 years ago
haroon amjad 1094d297f4 Update to stores 15.9 2 years ago
haroon amjad 52e63fe5e4 Update to stores 15.9 2 years ago
haroon amjad d0e743dcc9 Family members issue fixed in android 2 years ago
haroon amjad f6b89e1ae6 ER Online Check-In fixes 2 years ago
haroon amjad 752d5e5944 Appointment timeline fix 2 years ago
haroon amjad 4dc0a3f6c2 ER Online Check-In changes 2 years ago
haroon amjad 84159656b6 updates for ER Online-Checkin 2 years ago
haroon amjad 8a319cc2f2 updates & fixes 2 years ago
haroon amjad 8f9882fc5c Updates 2 years ago
haroon amjad 88d79367ba updates & fixes 2 years ago
haroon amjad de5317ae55 Merge branch 'dev_3.3_ER_Online_CheckIn' into dev_3.13.6_Development
# Conflicts:
#	lib/pages/landing/fragments/home_page_fragment2.dart
2 years ago
haroon amjad 8edf65daf1 Updates & Fixes 2 years ago
haroon amjad c948a1780c Update to stores VersionID 15.8 2 years ago
Aamir.Muhammad be4022cee5 Calender Event Fixes Function Changes 2 years ago
haroon amjad e9404f1656 Prescription reminder fixes 2 years ago
haroon amjad 2b560840aa lab special result fix 2 years ago
Aamir.Muhammad 02878b7df9 Calender Event Fixes 2 years ago
Aamir.Muhammad 0ef716f536 Calender Event Fixes 2 years ago
Aamir.Muhammad 2e25940b62 Calender Event Fixes 2 years ago
Aamir.Muhammad 515896c265 Calender Event Fixes 2 years ago
Aamir.Muhammad 76f5fc2ef8 Merge remote-tracking branch 'origin/dev_v3.13.6' into dev_v3.13.6 2 years ago
Aamir.Muhammad 69ed32917f Null fixes after merge from 3.13 2 years ago
haroon amjad 5b7b40c732 Updates & fixes 2 years ago
haroon amjad 6c9ab32d98 Native changes 2 years ago
haroon amjad c97fd25cdd Zoom integration updates & other stability fixes 2 years ago
Aamir.Muhammad e962469c7e Null fixes after merge from 3.13 2 years ago
Aamir.Muhammad d9cf383648 Merge branch 'refs/heads/development_v3.3' into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
#	lib/core/service/client/base_app_client.dart
#	lib/pages/MyAppointments/AppointmentDetails.dart
#	lib/pages/MyAppointments/widgets/AppointmentActions.dart
#	lib/pages/login/confirm-login.dart
#	lib/pages/medical/reports/report_home_page.dart
2 years ago
haroon amjad 9a0a658083 Online CheckIn CR implementation Contd. 2 years ago
haroon amjad 3a64858905 Invalid NFC Scan check added 2 years ago
haroon amjad f65fe26fd2 ER Online CheckIn implementation contd 2 years ago
haroon amjad 3a65113149 Update to stores 15.7 2 years ago
haroon amjad f5df1b1d01 ER Online CheckIn implementation Contd 2 years ago
haroon amjad 704d691816 ER Online Check-In contd. 2 years ago
Sultan khan 51bbc42ca9 security patch for 3 attempt fixed. 2 years ago
Sultan khan 21e4bb5138 error code 699 fixes 2 years ago
haroon amjad 9c957741b4 medical report fix 2 years ago
Aamir.Muhammad 011f5b1f57 Merge remote-tracking branch 'origin/development_v3.3' into dev_v3.13.6 2 years ago
Haroon Amjad eefdb1fa3e Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Haroon Amjad 582f1f1566 updates 2 years ago
Aamir.Muhammad 29c2fd067e Null fixes after merge from 3.13 2 years ago
Aamir.Muhammad 8441a0ef00 Merge remote-tracking branch 'origin/development_v3.3' into dev_v3.13.6
# Conflicts:
#	lib/pages/login/login.dart
#	lib/pages/medical/medical_profile_page_new.dart
#	lib/services/clinic_services/get_clinic_service.dart
#	lib/uitl/utils.dart
#	lib/widgets/dialogs/radio_selection_dialog.dart
2 years ago
Aamir.Muhammad 0588e68c67 local Auth fix 2 years ago
haroon amjad 672d0b7e8c InPatient medical report enabled 2 years ago
haroon amjad 9a102be7c7 PatientID QR image added 2 years ago
haroon amjad 96d5c3ce1d My Instructions added 2 years ago
haroon amjad 5f90435442 National ID input validation added 2 years ago
haroon amjad 6e30df2a29 WeCare service added 2 years ago
haroon amjad 4c0d758dd1 Zoom updates 2 years ago
haroon amjad 9ab10eebce Zoom Video SDK integrated 2 years ago
Sultan khan d1b13d5ce9 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
haroon amjad a4a638aa37 updates 2 years ago
Sultan khan c9be715436 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/core/service/client/base_app_client.dart
#	lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart
#	lib/pages/Blood/blood_donation.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/MyAppointments/AppointmentDetails.dart
#	lib/pages/MyAppointments/widgets/AppointmentActions.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/livecare/widgets/clinic_list.dart
#	lib/pages/medical/balance/confirm_payment_page.dart
2 years ago
haroon amjad 69e64fd5fb Blood Donation CR merged into dev_3.3 2 years ago
haroon amjad f8e7ccf73f updates 2 years ago
haroon amjad 7b181192f6 Apple Pay updates 2 years ago
Aamir Muhammad e18ba6822a changes local 2 years ago
Aamir Muhammad 660ec3a207 changes local 2 years ago
Aamir Muhammad 52a5e978a7 changes local 2 years ago
haroon amjad 3dffb26aee updates 2 years ago
Sultan khan 5e9d08b9aa Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
2 years ago
Sultan khan 08b4c8f86e Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	ios/Runner.xcodeproj/project.pbxproj
#	lib/config/config.dart
#	lib/core/viewModels/project_view_model.dart
#	lib/main.dart
#	lib/pages/BookAppointment/BookConfirm.dart
#	lib/pages/landing/landing_page.dart
#	lib/pages/livecare/widgets/LiveCareHistoryCard.dart
#	lib/pages/medical/eye/ContactLensPage.dart
#	lib/pages/medical/medical_profile_page_new.dart
#	lib/uitl/LocalNotification.dart
#	lib/uitl/gif_loader_dialog_utils.dart
#	lib/widgets/Loader/gif_loader_container.dart
#	lib/widgets/data_display/medical/time_line_new_widget.dart
#	lib/widgets/drawer/app_drawer_widget.dart
#	pubspec.yaml
2 years ago
haroon amjad 968e59707e updates 2 years ago
Sultan khan 99e2edea31 lab result change for PMA-892 2 years ago
haroon amjad 2ebaed4841 label updated 2 years ago
haroon amjad d6dacfb743 Load more added in appointments timeline. 2 years ago
haroon amjad 5256d8873f ToDo & Appo Timeline changes 2 years ago
haroon amjad fe37de9621 Loading dialog updates 2 years ago
Sultan khan 63f5f7890e updates 2 years ago
Sultan khan eee2ccf148 updates 2 years ago
haroon amjad 727a9f1363 updates & checks 2 years ago
haroon amjad e0c9914206 Issue for appointment reschedule fixed 2 years ago
haroon amjad 7fc47ebf34 LiveCare invoice fix 2 years ago
haroon amjad 162b2fd22a updates 2 years ago
Aamir Muhammad 64568edc01 Android build issue fixed 2 years ago
Sultan khan d255ada2ea eye measurements fixed 2 years ago
Aamir Muhammad b6d222a7ea JIRA Fixes 2 years ago
haroon amjad b42c47f074 Update to stores 2 years ago
Sultan khan 0e04012219 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart
#	lib/pages/BookAppointment/DentalComplaints.dart
#	lib/pages/MyAppointments/MyAppointments.dart
#	lib/services/clinic_services/get_clinic_service.dart
2 years ago
Sultan khan a4ed832147 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
#	lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/Covid-DriveThru/covid-payment-summary.dart
#	lib/pages/ErService/AmbulanceRequestIndexPages/AmbulanceRequestIndex.dart
#	lib/pages/ErService/AmbulanceRequestIndexPages/PickupLocation.dart
#	lib/pages/ErService/AmbulanceRequestIndexPages/SelectTransportationMethod.dart
#	lib/pages/ErService/AmbulanceRequestIndexPages/Summary.dart
#	lib/pages/ErService/OrderLogPage.dart
#	lib/pages/ErService/rapid-response-team/rrt-request-page.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/livecare/widgets/clinic_list.dart
#	lib/pages/medical/balance/confirm_payment_page.dart
#	lib/services/payfort_services/payfort_service.dart
#	lib/services/payfort_services/payfort_view_model.dart
#	lib/splashPage.dart
#	pubspec.yaml
2 years ago
haroon amjad e0ae8d7c8e Updates & fixes 2 years ago
Sultan khan d4519e1507 fixed 2 years ago
Sultan khan 001417f9b3 fixes 2 years ago
haroon amjad 357f0f8c24 updates 2 years ago
haroon amjad a12558076f Merge branch 'development_v3.3' into dev_3.3_AmbulanceRequestCR
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/uitl/translations_delegate_base.dart
2 years ago
haroon amjad 46ad672649 Apple Pay fixes 2 years ago
Sultan khan 735582e3ab updated code. 2 years ago
Sultan khan 6983e309e0 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	android/build.gradle
#	android/gradle.properties
#	ios/Runner.xcodeproj/project.pbxproj
#	lib/config/config.dart
#	lib/core/model/prescriptions/prescription_report_inp.dart
#	lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/BookAppointment/DentalComplaints.dart
#	lib/pages/BookAppointment/DoctorProfile.dart
#	lib/pages/BookAppointment/components/DocAvailableAppointments.dart
#	lib/pages/BookAppointment/widgets/DoctorView.dart
#	lib/pages/ToDoList/ObGyne/ObGyne-TimeSlots.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/livecare/widgets/clinic_list.dart
#	lib/pages/medical/balance/confirm_payment_page.dart
#	lib/services/appointment_services/GetDoctorsList.dart
#	lib/services/clinic_services/get_clinic_service.dart
#	pubspec.yaml
2 years ago
haroon amjad 6e558bf5a6 Splash fix 2 years ago
Sultan khan 90dc8e5e05 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/core/service/client/base_app_client.dart
#	lib/main.dart
#	lib/models/LiveCare/ApplePayInsertRequest.dart
#	lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart
#	lib/pages/BookAppointment/BookConfirm.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/livecare/widgets/clinic_list.dart
#	lib/pages/medical/balance/confirm_payment_page.dart
#	lib/services/appointment_services/GetDoctorsList.dart
#	lib/uitl/gif_loader_dialog_utils.dart
#	lib/uitl/location_util.dart
#	pubspec.yaml
2 years ago
haroon amjad 32757c85f8 updates 2 years ago
haroon amjad 180cc43705 Update to stores 2 years ago
haroon amjad cb79d625d1 Update to stores for LiveCare fix 2 years ago
haroon amjad 30b57ff5f0 updates 2 years ago
haroon amjad ccdf410995 Update to stores 2 years ago
haroon amjad 9043e3c687 Apple Pay Updates 2 years ago
haroon amjad e28805f70f updates 2 years ago
haroon amjad b4138b2066 Show Date check added in DoctorView 2 years ago
haroon amjad c65d668c92 updates 2 years ago
haroon amjad 3792a67ae7 updates 2 years ago
haroon amjad 7850748ea2 Dental updates 2 years ago
Sultan khan 30c14c2167 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	ios/Runner.xcodeproj/project.pbxproj
#	ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
#	lib/core/model/reports/Reports.dart
#	lib/core/service/client/base_app_client.dart
#	lib/core/viewModels/medical/ask_doctor_view_model.dart
#	lib/pages/BookAppointment/BookConfirm.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/BookAppointment/DoctorProfile.dart
#	lib/pages/BookAppointment/QRCode.dart
#	lib/pages/Covid-DriveThru/Covid-TimeSlots.dart
#	lib/pages/DrawerPages/family/my-family.dart
#	lib/pages/MyAppointments/AppointmentDetails.dart
#	lib/pages/MyAppointments/MyAppointments.dart
#	lib/pages/MyAppointments/widgets/PrescriptionReport.dart
#	lib/pages/ToDoList/ObGyne/ObGyne-TimeSlots.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/medical/eye/EyeHomePage.dart
#	lib/pages/medical/reports/report_list_widget.dart
#	lib/services/appointment_services/GetDoctorsList.dart
#	lib/uitl/location_util.dart
#	lib/uitl/utils.dart
#	lib/widgets/drawer/app_drawer_widget.dart
#	pubspec.yaml
2 years ago
haroon amjad 0168f06bb9 updates 2 years ago
haroon amjad 1b0961a08f location timeout 2 years ago
haroon amjad c29e2c88f0 location timeout handled in online check-in via location 2 years ago
haroon amjad eb1bddf772 updates 2 years ago
haroon amjad f1a74749f7 param update 2 years ago
haroon amjad bbc42bd1e7 updates 2 years ago
haroon amjad d3bdcfa975 Apple Pay code merged into main branch 2 years ago
haroon amjad 48202ffd12 updates 2 years ago
haroon amjad bea15150aa Merge branch 'development_v3.3' into dev_3.3_faiz_payfort 2 years ago
haroon amjad ec0bed04d3 Apple Pay in production implemented & tested 2 years ago
haroon amjad fe7c2c6873 CR 6631 2 years ago
haroon amjad ac52ba75a7 Updates & Fixes 2 years ago
haroon amjad 98a5b7d049 my appointments fixes 2 years ago
haroon amjad 27ed5c95f2 update to stores 2 years ago
haroon amjad e67bd54c04 updates 2 years ago
haroon amjad b39357a497 Medical report changes, Loading added in Location Check-In 2 years ago
haroon amjad 63621b5fed Updates & fixes 2 years ago
haroon amjad cd8b76a374 In App Apple Pay implemented 2 years ago
haroon amjad e1718270eb updates 2 years ago
haroon amjad e6d093a84c updates 2 years ago
haroon amjad 86d3e03c06 Updates 2 years ago
haroon amjad 37aa700b2e fixes 2 years ago
haroon amjad e5d8505c2d Updates & fixes 2 years ago
Sultan khan 4b28581c55 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/config/localized_values.dart
#	lib/core/service/client/base_app_client.dart
#	lib/models/Appointments/toDoCountProviderModel.dart
#	lib/pages/MyAppointments/AppointmentDetails.dart
#	lib/pages/MyAppointments/MyAppointments.dart
#	lib/pages/ToDoList/ObGyne/ObGyne-TimeSlots.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/login/login.dart
#	lib/services/authentication/auth_provider.dart
#	lib/widgets/drawer/app_drawer_widget.dart
2 years ago
haroon amjad 75bfeaa716 My appointment fixes 2 years ago
haroon amjad 27b6e04d33 updates 2 years ago
haroon amjad 3401496739 Updates & fixes 2 years ago
Sultan khan 86f5e81fea merge with 3.3 2 years ago
Sultan khan d0c7b08eac Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
 Conflicts:
	lib/config/config.dart
	lib/core/service/client/base_app_client.dart
	lib/core/viewModels/er/EdOnlineViewModel.dart
	lib/pages/AlHabibMedicalService/health_calculator/bmi_calculator/bariatrics-screen.dart
	lib/pages/BookAppointment/DentalComplaints.dart
	lib/pages/BookAppointment/components/SearchByClinic.dart
	lib/pages/BookAppointment/widgets/DentalComplaintCard.dart
	lib/pages/BookAppointment/widgets/DoctorView.dart
	lib/pages/DrawerPages/family/my-family.dart
	lib/pages/MyAppointments/MyAppointments.dart
	lib/pages/landing/landing_page.dart
	lib/pages/livecare/widgets/clinic_card.dart
	lib/pages/login/login.dart
	lib/pages/rateAppointment/rate_appointment_clinic.dart
	lib/pages/rateAppointment/rate_appointment_doctor.dart
	lib/services/clinic_services/get_clinic_service.dart
	lib/uitl/push-notification-handler.dart
	lib/widgets/others/bottom_bar.dart
	pubspec.yaml
2 years ago
haroon amjad fddb423451 Updates & fixes 2 years ago
haroon amjad aa04e943ef updates & fixes 2 years ago
Sultan khan 98a2545a9b Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into development_v3.3
# Conflicts:
#	lib/config/config.dart
#	lib/pages/DrawerPages/family/my-family.dart
#	lib/uitl/push-notification-handler.dart
2 years ago
Sultan khan c1fbce7eae bug fixes 2 years ago
haroon amjad cfa341aba5 Apple Pay Updates 2 years ago
haroon amjad 4ac11b2169 LanguageID Fixes 2 years ago
haroon amjad e4ce158277 updates 2 years ago
Sultan khan 4338da513d Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
#	lib/core/model/labs/patient_lab_orders.dart
#	lib/core/model/labs/request_patient_lab_special_result.dart
#	lib/core/model/labs/request_send_lab_report_email.dart
#	lib/core/model/radiology/final_radiology.dart
#	lib/core/model/radiology/request_send_rad_report_email.dart
#	lib/core/model/rate/appoitment_rated.dart
#	lib/core/service/client/base_app_client.dart
#	lib/core/service/medical/labs_service.dart
#	lib/core/service/medical/radiology_service.dart
#	lib/core/viewModels/medical/labs_view_model.dart
#	lib/core/viewModels/medical/radiology_view_model.dart
#	lib/models/Authentication/check_activation_code_request.dart
#	lib/models/FamilyFiles/GetAllSharedRecordsByStatusReq.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/BookAppointment/QRCode.dart
#	lib/pages/DrawerPages/family/my-family.dart
#	lib/pages/DrawerPages/notifications/notification_details_page.dart
#	lib/pages/MyAppointments/AppointmentDetails.dart
#	lib/pages/MyAppointments/MyAppointments.dart
#	lib/pages/MyAppointments/widgets/AppointmentActions.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/landing/landing_page.dart
#	lib/pages/livecare/widgets/clinic_list.dart
#	lib/pages/login/confirm-login.dart
#	lib/pages/login/login.dart
#	lib/pages/medical/labs/laboratory_result_page.dart
#	lib/pages/medical/radiology/radiology_details_page.dart
#	lib/services/authentication/auth_provider.dart
#	lib/splashPage.dart
#	lib/uitl/push-notification-handler.dart
#	lib/widgets/drawer/app_drawer_widget.dart
2 years ago
haroon amjad 52b3c196d6 updates 2 years ago
Faiz Hashmi 704c0bbbc6 Merge branch 'development_v3.3' into dev_3.3_faiz_payfort 2 years ago
Faiz Hashmi fe665fd5ae Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into development_v3.3
# Conflicts:
#	pubspec.yaml
2 years ago
haroon amjad 512db615be Language ID fixes & app update to stores, VersionID 11.5 2 years ago
Faiz Hashmi ccb9e93d62 Added InAppApple Pay with PayFort 2 years ago
haroon amjad 2008ccf92c updates 2 years ago
Faiz Hashmi b769959823 Revert "changes to build app"
This reverts commit 1492efde
2 years ago
Faiz Hashmi 0e67851646 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into development_v3.3 2 years ago
haroon amjad f7dffea2eb Language ID fixes 2 years ago
haroon amjad 724a26ca68 Updates 2 years ago
haroon amjad a9d4cb2fd8 InApp Browser Update 2 years ago
haroon amjad bcfeff2661 updates 2 years ago
haroon amjad cfd8b5e8a5 Language ID Changes 2 years ago
haroon amjad 264aed70a0 NFC Check added 2 years ago
Faiz Hashmi d3b4f37c73 Merge branch 'development_v3.3' of http://34.17.52.79/Haroon6138/diplomatic-quarter into development_v3.3
# Conflicts:
#	pubspec.yaml
2 years ago
haroon amjad 165f3fb9f6 NFC Check removed for appo checkin 2 years ago
haroon amjad 47779f6fa7 last appointment rating fixed 2 years ago
haroon amjad faf3bbdd9e Unit column position changed 2 years ago
haroon amjad 01db5408c9 fixes 2 years ago
haroon amjad 80167378d9 lat long fixes 2 years ago
haroon amjad eef6f78fd6 Updates 2 years ago
haroon amjad c6c4f933b2 Invoice Type param added in Labs & Rad 2 years ago
haroon amjad 0a9aee0246 updates 2 years ago
haroon amjad 421bae2037 updates 2 years ago
Sultan khan f2a57255fc no message 2 years ago
haroon amjad 8b468fe4b5 Updates & fixes 2 years ago
Sultan khan 6a74cdd2da Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Sultan khan 70077c97db local auth change 2 years ago
Aamir Muhammad 6f99aca8a5 Inpatient Cr Merge 2 years ago
Aamir Muhammad 77651f9652 Merge remote-tracking branch 'origin/Dev_3.3_InPatient_CR' into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/core/service/client/base_app_client.dart
#	lib/core/viewModels/project_view_model.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/MyAppointments/MyAppointments.dart
#	lib/pages/insurance/AttachInsuranceCardImageDialog.dart
#	lib/pages/login/confirm-login.dart
#	lib/pages/paymentService/payment_service.dart
#	lib/uitl/push-notification-handler.dart
#	lib/uitl/translations_delegate_base.dart
#	lib/uitl/utils.dart
#	lib/uitl/utils_new.dart
#	lib/widgets/avatar/large_avatar.dart
#	lib/widgets/bottom_navigation/bottom_navigation_item.dart
#	lib/widgets/bottom_options/BottomSheet.dart
#	lib/widgets/data_display/medical/medical_profile_item.dart
#	lib/widgets/drawer/app_drawer_widget.dart
#	pubspec.yaml
2 years ago
Aamir Muhammad 22b48aef92 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
haroon amjad 70176e0cb1 updates 2 years ago
Sultan khan 359a177797 updates 2 years ago
haroon amjad beb3453ff5 updates 2 years ago
Aamir Muhammad b450091457 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Sultan khan f2079d4bbd payment fix 2 years ago
Aamir Muhammad 0a9d3e2b4d Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Sultan khan 557a3baafe theme change 2 years ago
Aamir Muhammad 881b1fba53 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Aamir Muhammad e914925181 Calender Permission 2 years ago
haroon amjad ded6e02663 CheckIn By Param added 2 years ago
devamirsaleemahmad 6671dea8d8 Delete Event on Calender 2 years ago
haroon amjad a0bca92195 CR Implemented 2 years ago
Sultan khan f534ee6f58 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/pages/BookAppointment/widgets/reminder_dialog.dart
2 years ago
Sultan khan 62dc3c162a updated 3.13.6 2 years ago
devamirsaleemahmad 2def9f3744 Merges From 3.3 2 years ago
devamirsaleemahmad d73cc13100 Merge branch 'development_v3.3' into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
#	lib/core/service/client/base_app_client.dart
#	lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart
#	lib/pages/BookAppointment/QRCode.dart
#	lib/pages/MyAppointments/widgets/AppointmentActions.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/landing/fragments/home_page_fragment2.dart
#	lib/splashPage.dart
#	lib/uitl/utils.dart
2 years ago
devamirsaleemahmad fb62ce2f19 Calender Fix Ios 17+ 2 years ago
devamirsaleemahmad 1ddac14efb Calender Permission Fix Ios 17+ 2 years ago
Aamir Muhammad a24afd4302 Calender Permission 2 years ago
Aamir Muhammad f211fd5617 Call Notification Fix 2 years ago
haroon amjad cb9ced27c2 updates 2 years ago
haroon amjad 1ecb8ebfe9 updated to stores version 11.3 2 years ago
Aamir Muhammad 542864c89c Gif Loader & My Family Fixes 2 years ago
haroon amjad f8fb336740 Location checkin privilege applied 2 years ago
Sultan khan d459600f22 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Sultan khan 5cca651963 no message 2 years ago
Aamir Muhammad 75b969b265 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Aamir Muhammad 7f890bb24a Changes 2 years ago
Sultan khan 8c46d2577d updated with assets 2 years ago
Sultan khan 8c520d9431 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/pages/BookAppointment/widgets/DoctorView.dart
2 years ago
Sultan khan 432e64e51d updates 2 years ago
Aamir Muhammad b4bc99369f Changes into Rating Bar 2 years ago
haroon amjad 245716119e Location based Check In implemented 2 years ago
haroon amjad 6dd5fda997 Location check in implementing 2 years ago
haroon amjad 5c8bb241b3 Next Actions handled when navigating from My Appointments to ToDo list 2 years ago
devamirsaleemahmad 8bdcfcb764 Changes & Latest Merges 3.3 2 years ago
devamirsaleemahmad 0e8c1a8b2f Merge branch 'development_v3.3' into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
#	lib/core/service/client/base_app_client.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/BookAppointment/book_reminder_page.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/ToDoList/widgets/paymentDialog.dart
#	lib/pages/insurance/AttachInsuranceCardImageDialog.dart
#	lib/pages/medical/labs/laboratory_result_page.dart
#	pubspec.yaml
2 years ago
devamirsaleemahmad 9d1b153739 Dropdown Changed 2 years ago
haroon amjad b579e494c1 updates 2 years ago
Sultan khan 413535ef0b null safety fixed. 2 years ago
Sultan khan 649521c31f Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Sultan khan c96c151f44 null safety issue fixed. 2 years ago
devamirsaleemahmad d6f51f6c82 changes 2 years ago
haroon amjad 7d2744d29c Lab report CR implemented 2 years ago
haroon amjad 7f753014df Inpatient advance payment projectID param issue resolved 2 years ago
haroon amjad 47ccf68b3a updates 2 years ago
haroon amjad 7c426b90e5 updates 2 years ago
haroon amjad a6a541b903 Lab Orders CR implementation contd. 2 years ago
Sultan khan 1a5687a27c Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/pages/BookAppointment/widgets/DoctorView.dart
#	lib/uitl/app_toast.dart
2 years ago
Sultan khan ec13edc28b updates. 2 years ago
devamirsaleemahmad 8f591654a5 changes 2 years ago
haroon amjad b10383c3ff Translation updates 2 years ago
haroon amjad dd0099236d Insurance dialog added post registration 2 years ago
haroon amjad 1997dbe128 updates 2 years ago
haroon amjad c7ee76d816 updates 2 years ago
haroon amjad e4492cbc1f Medical instructions updates 2 years ago
haroon amjad cb2bacf539 Update insurance for cash patient in ToDo List 2 years ago
haroon amjad 4fcc698f50 CR 6654 done 2 years ago
haroon amjad bbee4dba66 CR 6654 cancel manual insurance update CR done. 2 years ago
devamirsaleemahmad cbc38940ea changes 2 years ago
devamirsaleemahmad ed748a626b changes 2 years ago
devamirsaleemahmad 23b7d85911 changes 2 years ago
haroon amjad 81de6f9848 updated app to stores Version ID 11.0 2 years ago
devamirsaleemahmad 4231c85055 Merge branch 'development_v3.3' into dev_v3.13.6
# Conflicts:
#	lib/config/config.dart
#	lib/core/model/labs/patient_lab_orders.dart
#	lib/core/model/labs/request_patient_lab_special_result.dart
#	lib/core/model/labs/request_send_lab_report_email.dart
#	lib/core/model/privilege/VidaPlusProjectListModel.dart
#	lib/core/model/radiology/final_radiology.dart
#	lib/core/model/radiology/request_send_rad_report_email.dart
#	lib/core/service/client/base_app_client.dart
#	lib/core/service/medical/labs_service.dart
#	lib/core/service/medical/radiology_service.dart
#	lib/core/service/privilege_service.dart
#	lib/core/viewModels/medical/labs_view_model.dart
#	lib/core/viewModels/medical/radiology_view_model.dart
#	lib/core/viewModels/project_view_model.dart
#	lib/models/anicllary-orders/ancillary_order_list_model.dart
#	lib/models/anicllary-orders/ancillary_orders_proc_list.dart
#	lib/pages/AlHabibMedicalService/ancillary-orders/ancillaryOrdersDetails.dart
#	lib/pages/Blood/confirm_payment_page.dart
#	lib/pages/BookAppointment/BookConfirm.dart
#	lib/pages/BookAppointment/BookSuccess.dart
#	lib/pages/BookAppointment/QRCode.dart
#	lib/pages/Covid-DriveThru/covid-payment-summary.dart
#	lib/pages/MyAppointments/MyAppointments.dart
#	lib/pages/MyAppointments/widgets/AppointmentActions.dart
#	lib/pages/ToDoList/ToDo.dart
#	lib/pages/feedback/send_feedback_page.dart
#	lib/pages/insurance/insurance_update_screen.dart
#	lib/pages/login/login.dart
#	lib/pages/medical/ask_doctor/doctor_response.dart
#	lib/pages/medical/balance/confirm_payment_page.dart
#	lib/pages/medical/balance/my_balance_page.dart
#	lib/pages/medical/labs/laboratory_result_page.dart
#	lib/pages/medical/radiology/radiology_details_page.dart
#	lib/pages/medical/radiology/radiology_home_page.dart
#	lib/pages/paymentService/payment_service.dart
#	lib/splashPage.dart
#	lib/uitl/utils.dart
#	lib/widgets/bottom_navigation/bottom_navigation_item.dart
#	lib/widgets/data_display/medical/LabResult/FlowChartPage.dart
#	lib/widgets/data_display/medical/LabResult/laboratory_result_widget.dart
#	lib/widgets/data_display/medical/doctor_card.dart
#	lib/widgets/data_display/medical/medical_profile_item.dart
#	pubspec.yaml
2 years ago
haroon amjad d5dd8757e9 Privileges added for QR & NFC CheckIn options 2 years ago
haroon amjad 772992e3ff updates 2 years ago
devamirsaleemahmad 3f1ba19c64 changes & Null to Dynamic 2 years ago
haroon amjad 41cd55e02b paymentRequestID added in the request 2 years ago
haroon amjad 13b2db47b5 HMC color change applied in my appointments 2 years ago
haroon amjad 6bd6572e7e Lab, Rad & prescription disabled in my appointments screen in case of ER appointment (Clinic ID 10) & project is Vida Plus. 2 years ago
haroon amjad ee5fb615db updates & fixes 2 years ago
haroon amjad 185f54d26d updates & fixes 2 years ago
haroon amjad 0a478e077a QR Code checkin implemented 2 years ago
haroon amjad 542501f5c5 updates 2 years ago
haroon amjad a5e0de08ce updates for ancillary 2 years ago
devamirsaleemahmad 8544b3ce3d changes & Deletion 2 years ago
devamirsaleemahmad 720c0ac6e9 changes & Deletion 2 years ago
haroon amjad 55f1e4166e updates 2 years ago
Sultan khan 4d52f639aa Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/pages/livecare/live_care_payment_page.dart
#	lib/pages/medical/smart_watch_health_data/steps/stepsTracker.dart
#	lib/pages/medical/vital_sign/vital_sign_details_screen.dart
#	lib/pages/medical/vital_sign/vital_sign_item_details_screen.dart
#	lib/pages/medical/vital_sign/vital_sing_chart_and_detials.dart
#	lib/pages/medical/vital_sign/vital_sing_chart_blood_pressure.dart
2 years ago
Sultan khan 0c534cffae code update in progress 2 years ago
devamirsaleemahmad 2c9e51aef0 changes 2 years ago
devamirsaleemahmad 1c34843bc5 Merge remote-tracking branch 'origin/dev_v3.13.6' into dev_v3.13.6 2 years ago
Sultan khan 6a8de14d5d code update in progress 2 years ago
devamirsaleemahmad 519f396e76 changes 2 years ago
Sultan khan 40656a65d8 update in progress 2 years ago
devamirsaleemahmad 49d3df8c87 changes 2 years ago
devamirsaleemahmad 47801ecb36 changes 2 years ago
devamirsaleemahmad d8836d5e89 Merge branch 'dev_v3.13.6_automigrate' into dev_v3.13.6
# Conflicts:
#	lib/main.dart
#	lib/uitl/CalendarUtils.dart
#	lib/uitl/app_shared_preferences.dart
2 years ago
devamirsaleemahmad c1fd6313b1 changes 2 years ago
Sultan khan c63a1fadf5 code updated in-progress 2 years ago
Sultan khan 6a6ac76973 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
Sultan khan 8a42bf8b2f Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6
# Conflicts:
#	lib/widgets/buttons/custom_text_button.dart
2 years ago
devamirsaleemahmad dfc6e86442 models updates -> 3.13.6 2 years ago
Sultan khan aa605a2e47 file updated 2 years ago
devamirsaleemahmad 1c19b36d2d models updates -> 3.13.6 2 years ago
devamirsaleemahmad b26f535749 models updates -> 3.13.6 2 years ago
devamirsaleemahmad 9c2948db29 models updates -> 3.13.6 2 years ago
devamirsaleemahmad 50816d452e Merge remote-tracking branch 'origin/dev_v3.13.6' into dev_v3.13.6 2 years ago
devamirsaleemahmad b3587688b8 models updates -> 3.13.6 2 years ago
Sultan khan 391331f508 code update in progress 2 years ago
devamirsaleemahmad 971bab465c models updates -> 3.13.6 2 years ago
devamirsaleemahmad 03d550936e models updates -> 3.13.6 2 years ago
devamirsaleemahmad cb56750e6b models updates -> 3.13.6 2 years ago
Sultan khan 04244675e1 code updated. 2 years ago
Sultan khan 6f8be66f42 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
devamirsaleemahmad 511c9788da models updates -> 3.13.6 2 years ago
devamirsaleemahmad 2a4059fd66 models updates -> 3.13.6 2 years ago
Sultan khan 1eb38b1dc4 Merge branch 'dev_v3.13.6' of http://34.17.52.79/Haroon6138/diplomatic-quarter into dev_v3.13.6 2 years ago
devamirsaleemahmad 3523daa9fa updates -> 3.13.6 2 years ago
Faiz Hashmi 1492efdedb changes to build app 2 years ago
Sultan khan f9d3602e9a updated code 2 years ago
devamirsaleemahmad 6ff864c4cd updates -> 3.13.6 2 years ago
Sultan khan 8bf5479f56 code updated. 2 years ago
devamirsaleemahmad e8e7a726f5 updates -> 3.13.6 2 years ago
Sultan khan b45cbbcf29 updates 3 years ago
haroon amjad 7c804f77fb updates & fixes 3 years ago
haroon amjad dac842f50c fixes for inpatient advance 3 years ago
haroon amjad d11b12ac9a no message 3 years ago
haroon amjad c5e88ac7ba fixes 3 years ago
haroon amjad 645e266af8 Vida plus updates sent to stores 3 years ago
haroon amjad f0a4bd6925 Commented the CRs code 3 years ago
haroon amjad 3f6c05825d updates 3 years ago
haroon amjad 4e962bda07 Merge branch 'development_v3.3' into PatientApp_VIDA_Plus_3.3
# Conflicts:
#	lib/config/config.dart
#	lib/core/model/labs/request_send_lab_report_email.dart
#	lib/core/service/medical/ask_doctor_services.dart
#	lib/core/service/medical/labs_service.dart
#	lib/core/viewModels/medical/labs_view_model.dart
#	lib/pages/conference/web_rtc/call_home_page_.dart
#	lib/pages/medical/labs/laboratory_result_page.dart
#	lib/pages/medical/patient_sick_leave_page.dart
#	lib/pages/webRTC/call_page.dart
#	lib/pages/webRTC/signaling.dart
#	lib/services/appointment_services/GetDoctorsList.dart
#	lib/uitl/LocalNotification.dart
#	lib/uitl/SignalRUtil.dart
#	lib/uitl/utils.dart
#	lib/widgets/others/floating_button_search.dart
3 years ago
haroon amjad 0f4f98f31c fixes 3 years ago
haroon amjad f2bf57f8cc updates 3 years ago
haroon amjad e780df90e1 updates 3 years ago
haroon amjad d8e9f36844 updates 3 years ago
haroon amjad c0595a8dc6 updates 3 years ago
Sultan khan abcf82346e Excluded change 3 years ago
haroon amjad 31144c7c27 updates 3 years ago
haroon amjad 2048747a62 ancillary updates 3 years ago
haroon amjad a58e4452b8 ancillary changes 3 years ago
haroon amjad 6f20f1b871 InPatient Discharge Medications 3 years ago
haroon amjad 72ee34f9a7 Merge branch 'development_v3.3' into Dev_3.3_InPatient_CR
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/core/service/client/base_app_client.dart
#	lib/pages/insurance/AttachInsuranceCardImageDialog.dart
#	lib/uitl/translations_delegate_base.dart
3 years ago
haroon amjad 652c19cdf8 updates 3 years ago
haroon amjad 3642ca6a47 InPatient advance payment updates 3 years ago
haroon amjad 1300dadce1 Inpatient advance payment 3 years ago
haroon amjad 4a7ca9cd46 InPatient advance payment history implemented 3 years ago
haroon amjad 5c5ed35df8 Clinic & Doctor ID added 3 years ago
haroon amjad 3e63d80655 Ancillary order updates 3 years ago
haroon amjad ae0fca865d InPatient Advance payment API implemented 3 years ago
haroon amjad a9ae44ca89 Implemented checks for InPatient CR 3 years ago
haroon amjad dd79b1dfca InPatient pending advance payment done 3 years ago
haroon amjad 4afdf5545e Translations added 3 years ago
haroon amjad d251ca0e1c Inpatient medical instructions implemented 3 years ago
haroon amjad 786dd76f57 updates 3 years ago
haroon amjad 3353c93de9 fixes 3 years ago
haroon amjad da0a164b0e updates 3 years ago
haroon amjad d261557cd7 Admitted patient API changed 3 years ago
haroon amjad ff23f3a8cb fixes 3 years ago
haroon amjad b2ec6c76bf ancillary fix 3 years ago
haroon amjad f624c70cee Merge branch 'development_v3.3' into Dev_3.3_InPatient_CR
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/uitl/translations_delegate_base.dart
3 years ago
haroon amjad fe606b7823 InPatient Advance Payment 3 years ago
haroon amjad 20572f463a meal plan dev completed 3 years ago
haroon amjad 0e054429ef Meal Plan implementation completed 3 years ago
haroon amjad bc27121c4e meal plan updates 3 years ago
haroon amjad 96f948a8c8 updates 3 years ago
haroon amjad 94296cec0d meal plan continued 3 years ago
haroon amjad 38648df897 Meal Plan development continued 3 years ago
haroon amjad d073eb9d5f MealPlan implementation continued 3 years ago
haroon amjad 77ab9373f8 Meal Plan APIs implementation continued 3 years ago
haroon amjad b337343df3 Project ID fix in ancillary orders 3 years ago
haroon amjad 710e6274db mealplan updates 3 years ago
haroon amjad 31d8443f87 insert call info updates 3 years ago
haroon amjad 9f44b25353 Meal Plan API integration in progress 3 years ago
haroon amjad 7bc105c6c7 updates 3 years ago
haroon amjad 12af8bb8a9 updates 3 years ago
haroon amjad 792b3ea249 no message 3 years ago
haroon amjad e4fe4baa27 nearest appo crash fixed 3 years ago
haroon amjad 83ca5e8e4c ask doctor date param added 3 years ago
haroon amjad 58e598843b sickleave 3 years ago
haroon amjad f28fcbd006 AdvanceNumber_VP added 3 years ago
haroon amjad 17acae0a95 updates 3 years ago
haroon amjad 101f2dcab8 updates 3 years ago
haroon amjad 60d5ba4a9e Birth Notification implemented 3 years ago
haroon amjad 078482c21d updates 3 years ago
haroon amjad cf30762eec updates 3 years ago
haroon amjad 2437d2da9c Updates 3 years ago
haroon amjad 01ee9a2710 Merge branch 'development_v3.3' into Dev_3.3_InPatient_CR
# Conflicts:
#	lib/config/config.dart
#	lib/config/localized_values.dart
#	lib/uitl/translations_delegate_base.dart
3 years ago
haroon amjad 77f3d0a238 radiology API fixes 3 years ago
haroon amjad e098705374 localized strings 3 years ago
haroon amjad 7280e2a1d7 Birth Notification UI Implemented 3 years ago
haroon amjad 17e7886907 VidaPlus Project changes 3 years ago
haroon amjad b64ba9211e Inpatient services in dev 3 years ago
haroon amjad 906fd5fd6a Inpatient services in dev 3 years ago
haroon amjad 2fea4b2b07 Merge branch 'development_v3.3' into Dev_3.3_InPatient_CR
# Conflicts:
#	lib/config/config.dart
#	lib/pages/landing/fragments/home_page_fragment2.dart
#	lib/pages/landing/widgets/services_view.dart
3 years ago
haroon amjad 3675d05911 config changes 3 years ago
Sultan khan 0514fecae2 lab report email change 3 years ago
Sultan khan 83c15196c8 VIDA PLUS CHANGE 3 years ago
Sultan khan ddcd0bb73c Merge branch 'development_v3.3' of https://gitlab.com/Cloud_Solution/diplomatic-quarter into PatientApp_VIDA_Plus_3.3
# Conflicts:
#	lib/config/config.dart
#	lib/core/service/client/base_app_client.dart
#	lib/core/viewModels/pharmacyModule/PharmacyAddressesViewModel.dart
#	lib/pages/ErService/rapid-response-team/rrt-pickup-address-page.dart
#	lib/pages/feedback/send_feedback_page.dart
#	lib/uitl/LocalNotification.dart
#	lib/uitl/push-notification-handler.dart
#	lib/widgets/others/bottom_bar.dart
#	lib/widgets/others/floating_button_search.dart
#	pubspec.yaml
3 years ago
haroon amjad 9d2df00d87 Get General instructions implemented 3 years ago
haroon amjad 0e4e285954 InPatient CR dev 3 years ago
haroon amjad e79454973c InPatient API 3 years ago
haroon amjad 9a7d0af6ea InPatient API implemented 3 years ago
haroon amjad 128bd2ec54 Inpatient services implementation 3 years ago
haroon amjad 8e14084467 updates 3 years ago
haroon amjad 98abc5a069 updates 3 years ago
haroon amjad e50a67ea12 Vida Plus changes 3 years ago

1
.gitignore vendored

@ -31,6 +31,7 @@ pubspec.lock
.pub-cache/
.pub/
/build/
/ios/Frameworks/
# Web related
lib/generated_plugin_registrant.dart

@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICajCCAVICAQAwJTEjMCEGCSqGSIb3DQEJARYUSGFyb29uNjEzOEBnbWFpbC5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4E8y9zluekbsXX6+i
HLa0GrZE+r8rJsmcNyhiONDkpCTQuuidRb4PH+DWPpxwtndKpgzPemCXavaAPY8I
vSf5/aLTzClLvuX4OqNsb9Y8v8jlt7uYud6hPYK+VKZmIyynqeHldur0+RQScVY7
Z4MbgxWYAXd0K49o1Vj8KcYP1G37XIaUwOf+Ib3az4abnrsou7w9PSHnKREPU1A8
syBR56/Zcm3I9e+4nLyk2kjhkp6zR8KKW3s0teqHkW+V2nqd6eU+ZwOOmP3FVuwl
X+kfVabTc42Nb7toDaIvxEI+LlrNCUTCptE5uvY+vId0bwjcL88Ti9zshPETgLd8
F7mHAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAMTsBtXA79BL7aJoe87iHwCaR
lyOoeG5vUVJhQxhkb7pXD6TT00H3DEn43MCD+Nu9KNq3ZAARTsbnoB1MzYQ+Qs0w
uIx3K+sKKqzo3tKY78cjpKYW68qSY8QHPH8z0PJ/a18Mz1VGjhV9sanRc57fkf8Y
SfzG+jKB+y9AeC4R5PAVkv/EScZKVyb8+hFNZRMBOfnME7QRWm51MlnzfgavB/Sr
SSb9KrKzA65UKM9fv0JhNftiFVwsMDA42RuwSE7rVqzoejb47sFNnEBprt4Jel+5
FJt/C//NKspMlW2cdRbPek7adaBuZCvEO+b0TDnvMQXnJTO5K0LCzGb5MRuGUg==
-----END CERTIFICATE REQUEST-----

@ -0,0 +1,8 @@
-----BEGIN CERTIFICATE REQUEST-----
MIH6MIGfAgEAMD0xIzAhBgkqhkiG9w0BCQEWFEhhcm9vbjYxMzhAZ21haWwuY29t
MQkwBwYDVQQDDAAxCzAJBgNVBAYTAkFFMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
QgAEiHGgNfm6LyD0k41YUNxGibQT5t2T9+QTVb6v5YrfCYslJIurcpeia8pzl/HJ
p1f4qxCR04cEYE3tcunyzkJd26AAMAwGCCqGSM49BAMCBQADSAAwRQIhAJWZqbmD
e9jyqPHW578V6xsf5Axgf64GBBFMpZ8+ZukDAiAYu0BbgeiU4RwCrezA71iH95yZ
ge9MoPuNHejpDKGeQQ==
-----END CERTIFICATE REQUEST-----

@ -0,0 +1,8 @@
{\rtf1\ansi\ansicpg1252\cocoartf2758
\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
{\*\expandedcolortbl;;}
\paperw11900\paperh16840\margl1440\margr1440\vieww11520\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural\partightenfactor0
\f0\fs24 \cf0 HMG@54321}

@ -0,0 +1,74 @@
MIIQaQYJKoZIhvcNAQcCoIIQWjCCEFYCAQExCzAJBgUrDgMCGgUAMHgGCSqGSIb3DQEHAaBrBGl7
InRlYW1JZCI6IjNBMzU5RTg2WkYiLCJkb21haW4iOiJ1YXQuaG1nd2Vic2VydmljZXMuY29tIiwi
ZGF0ZUNyZWF0ZWQiOiIyMDI1LTA0LTA5LDA4OjUzOjAzIiwidmVyc2lvbiI6MX2ggg0_MIIENDCC
AxygAwIBAgIIPVn4N-rR2J8wDQYJKoZIhvcNAQELBQAwczEtMCsGA1UEAwwkQXBwbGUgaVBob25l
IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwHhcNMjQxMjE2MTkyMTAxWhcNMjkx
MjExMTgxMzU5WjBZMTUwMwYDVQQDDCxBcHBsZSBpUGhvbmUgT1MgUHJvdmlzaW9uaW5nIFByb2Zp
bGUgU2lnbmluZzETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQDQkzGr-FMe360eL2T3yU3Xlr5fSz15ZFxD7inDQNL6LxygtrwR
c-_wIrDf3vn5zlXj9UIBtSNlQRI793xGfYkTRZVE7JaVYmaXkAMA2eCuxdmxnCAtluCF7W9r01LT
gzzUASMl6eXG1BHYeaoIwt0VWPXvipNLDUvuDbaHk3UREFXLDHgH2zdwRjuX-sTreCng9Ox442Ha
QFeAB7uInKXHSW3IJtOVH00hoo1oc4Me5llahZZVVLCVLiXcdw1hh4GNiaQDezwAdyyJalnTZETZ
dKVbirFSYV9uBDDU8-IQNAyVjEvhe9YrhYPyJzmNcAgj4hSI_5P0LW1MJuKLN4YtAgMBAAGjgeUw
geIwDAYDVR0TAQH_BAIwADAfBgNVHSMEGDAWgBRv8ZUYYlzgyPHF7WwYyeDTZFKYIDBABggrBgEF
BQcBAQQ0MDIwMAYIKwYBBQUHMAGGJGh0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDMtYWlwY2Ew
NzAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8vY3JsLmFwcGxlLmNvbS9haXBjYS5jcmwwHQYDVR0O
BBYEFLy1xem9_MvQntyUsB74IZRc_wkuMA4GA1UdDwEB_wQEAwIHgDAPBgkqhkiG92NkBjoEAgUA
MA0GCSqGSIb3DQEBCwUAA4IBAQAyNMLpd6pf4MbKovN3WeeKZ7jxUfP7sPaXv7ERo-GhPLsjkukS
k6JxHbzxmnFvpDxvNpK24EeCopPj57iPu98lRGICz8289_uNiglweGXCGU0ly3JiIeSpaPkQmi56
Dyi-pgMG0VVhH698-JTUcQ7i0yVUi86t1WgHW70te8diRXm5qYdM-Bg7gK4QS3HYeCvmCq-a59lN
zOpbt6OXVWvsDaB4x8Cwz8vcEEwwkhNxlNav4OzJ6cmbziUy7hENIRcki_GVLiJiRkV_4NvXFlTB
uT7T2oq5Zfa0tCN_eF3ZcnZkY6cIVcfZt5TbI7_zk6fUBERDDcriVrIrlCikPXKHMIIERDCCAyyg
AwIBAgIIXGPK5Eo3U8kwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCVVMxEzARBgNVBAoTCkFw
cGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYwFAYDVQQD
Ew1BcHBsZSBSb290IENBMB4XDTE3MDUxMDIxMjczMFoXDTMwMTIzMTAwMDAwMFowczEtMCsGA1UE
AwwkQXBwbGUgaVBob25lIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZp
Y2F0aW9uIEF1dGhvcml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJRWoBDz6DBIbH_L_cXvAege4XMHNjJi7ePXokzZM-
TzlHunW-88DS8Vmiqx_-CoY82S2aB_IOa7kpkRpfIgqL8XJYBa5MS0TFeaeAPLCI4IwMJ4RdGeWH
GTbL48V2t7D0QXJR9AVcg0uibaZRuPEm33terWUMxrKYUYy7fRtMwU7ICMfS7WQLtN0bjU9AfRuP
SJaSW_PQmH7ZvKQZDplhu0FdAcxbd3p9JNDc01P_w9zFlCy2Wk2OGCM5vdnGUj7R8vQliqEqh_3Y
DEYpUf_tF2yJJWuHv4ppFJ93n8MVt2iziEW9hOYGAkFkD60qKLgVyeCsp4q6cgQ0sniM-LKFAgMB
AAGjgewwgekwDwYDVR0TAQH_BAUwAwEB_zAfBgNVHSMEGDAWgBQr0GlHlHYJ_vRrjS5ApvdHTX8I
XjBEBggrBgEFBQcBAQQ4MDYwNAYIKwYBBQUHMAGGKGh0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3Nw
MDMtYXBwbGVyb290Y2EwLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDovL2NybC5hcHBsZS5jb20vcm9v
dC5jcmwwHQYDVR0OBBYEFG_xlRhiXODI8cXtbBjJ4NNkUpggMA4GA1UdDwEB_wQEAwIBBjAQBgoq
hkiG92NkBgISBAIFADANBgkqhkiG9w0BAQsFAAOCAQEAOs-smI2-kiAhCa2V87FcIfo2LVcgRHRz
ZJIIs5as922X-ls0OCfPEkbTPBHwB8mZkLHR6BEJpeOla2xjCD-eJfrVmZxM5uXOjrJNaOyLq6Oi
T4oRFT7cFCscxkS2b2fFW0-VKS2HXD_cgx53T-3aVKct5xOBwWPEVAsbSwpqKCII1DeSfH9nKF-v
PT-3rFkdODRkWu4zShlCRCnEyhhr4cFTLS30TcIV9jMyGHjxJm-KTeuUTKPo_w-zA4tl2usu2GVQ
n9yfit8xqIRU3FJSQdKyEx0xRkeIXz7uw_KMIwSV66yKPoJsBp8u44tDmmJbNA30mc8s7rpyhhkj
pfyOtTCCBLswggOjoAMCAQICAQIwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxEzARBgNV
BAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRYw
FAYDVQQDEw1BcHBsZSBSb290IENBMB4XDTA2MDQyNTIxNDAzNloXDTM1MDIwOTIxNDAzNlowYjEL
MAkGA1UEBhMCVVMxEzARBgNVBAoTCkFwcGxlIEluYy4xJjAkBgNVBAsTHUFwcGxlIENlcnRpZmlj
YXRpb24gQXV0aG9yaXR5MRYwFAYDVQQDEw1BcHBsZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEF
AAOCAQ8AMIIBCgKCAQEA5JGpCR-R2x5HUOsF7V55hC3rNqJXTFXsixmJ3vlLbPUHqyIwAugYPvhQ
CdN_QaiY-dHKZpwkaxHQo7vkGyrDH5WeegykR4tb1BY3M8vED03OFGnRyRly9V0O1X9fm_IlA7pV
j01dDfFkNSMVSxVZHbOU9_acns9QusFYUGePCLQg98usLCBvcLY_ATCMt0PPD5098ytJKBrI_s61
uQ7ZXhzWyz21Oq30Dw4AkguxIRYudNU8DdtiFqujcZJHU1XBry9Bs_j743DN5qNMRX4fTGtQlkGJ
xHRiCxCDQYczioGxMFjsWgQyjGizjx3eZXP_Z15lvEnYdp8zFGWhd5TJLQIDAQABo4IBejCCAXYw
DgYDVR0PAQH_BAQDAgEGMA8GA1UdEwEB_wQFMAMBAf8wHQYDVR0OBBYEFCvQaUeUdgn-9GuNLkCm
90dNfwheMB8GA1UdIwQYMBaAFCvQaUeUdgn-9GuNLkCm90dNfwheMIIBEQYDVR0gBIIBCDCCAQQw
ggEABgkqhkiG92NkBQEwgfIwKgYIKwYBBQUHAgEWHmh0dHBzOi8vd3d3LmFwcGxlLmNvbS9hcHBs
ZWNhLzCBwwYIKwYBBQUHAgIwgbYagbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFu
eSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2Vy
dGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjANBgkqhkiG9w0BAQUFAAOCAQEAXDaZTC14
t-2Mm9zzd5vydtJ3ME_BH4WDhRuZPUc38qmbQI4s1LGQEti-9HOb7tJkD8t5TzTYoj75eP9ryAfs
fTmDi1Mg0zjEsb-aTwpr_yv8WacFCXwXQFYRHnTTt4sjO0ej1W8k4uvRt3DfD0XhJ8rxbXjt57UX
F6jcfiI1yiXV2Q_Wa9SiJCMR96Gsj3OBYMYbWwkvkrL4REjwYDieFfU9JmcgijNq9w2Cz97roy_5
U2pbZMBjM3f3OgcsVuvaDyEO2rpzGU-12TZ_wYdV2aeZuTJC-9jVcZ5-oVK3G72TQiQSKscPHbZN
nF5jyEuAF1CqitXa5PzQCQc3sHV1ITGCAoUwggKBAgEBMH8wczEtMCsGA1UEAwwkQXBwbGUgaVBo
b25lIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQLDBdDZXJ0aWZpY2F0aW9uIEF1dGhv
cml0eTETMBEGA1UECgwKQXBwbGUgSW5jLjELMAkGA1UEBhMCVVMCCD1Z-Dfq0difMAkGBSsOAwIa
BQCggdwwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjUwNDA5MDg1
MzAzWjAjBgkqhkiG9w0BCQQxFgQUAFaGI1aIk0pvFl6XU5VvRpeio9QwKQYJKoZIhvcNAQk0MRww
GjAJBgUrDgMCGgUAoQ0GCSqGSIb3DQEBAQUAMFIGCSqGSIb3DQEJDzFFMEMwCgYIKoZIhvcNAwcw
DgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEoMA0G
CSqGSIb3DQEBAQUABIIBAHdhBvowTL1e7Q-KFo3GAoa_c3I5iQH79ks6sZ9U4zu3xhpjrReRlA5d
ORAcMvUnUT0sjDj2ISsLKzUnDXNlcPE8fqfkMI_7LYlWvnNalVtrJmL6CUheBuTKMQ_Z_lZLLI4o
J46YUzCU9M4vpcgO6EpOQTNrqLx2sOs-V_my1p-Hig7UqdHNviX4gL4xjg7yUXNoevZ9ixPLXI4C
aPmg5q2NCECPxS7g36hJ_gHtRC6awR8qvK3-mSZPPfMzh0sHih76h2RWcv13UHSNygn3SF0MLhsS
5m9tf6r1sJOCAr2_ri-65d2GN1vhGXfoXQ0KFy9N2Cao3IsRs5unBb6pk5c

Binary file not shown.

@ -0,0 +1,16 @@
-----BEGIN CERTIFICATE REQUEST-----
MIICgjCCAWoCAQAwPTEjMCEGCSqGSIb3DQEJARYUSGFyb29uNjEzOEBnbWFpbC5j
b20xCTAHBgNVBAMMADELMAkGA1UEBhMCQUUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDHadAER62mSf+wOxPu9rF1EvifDxbAEv6znZIHvwimgShdPLLS
rkFdN4VpSHMzrASqpHnlSL3wxO6eym9pATH3WfLvKIQxnn9OkO5fScjQi0RkFbe0
JqTqN2LaFxrSFrhqQ/1p/izr690HqjrfquRI8t8evatyTku67/xcCj6uSIVLfJoS
8YCDVn0Y+w9n2Vw/+kHiNY6P96qp/CfXZgMLFpUu0mqcmZl97htfmB9AH2tC45yh
mKxDJiKEnk69zVCh/bkc9tFE1tUDkkKblJTCEyWfdDUUYM4ET3t3fBqWB78F4J3m
XglByGZmHgY2+7nsSQBiq7k9tFN2c7FZ9BD3AgMBAAGgADANBgkqhkiG9w0BAQsF
AAOCAQEAJxqoyfEJ7V83ffCAqkYNNEcCQMIRi1Y4cTTm/5KZGA/UPeDeX48/bm4K
XIf2zbv88OGASInBrvMDp0x0zs13Dx2yXxofGN+iQSBwN6jPV/upmm0DjgTmgUGh
BJste70LaU228ADzWDw8UJm/GKjK8WvE0XOGpPKYq9cuVW3M+6QRoRHXy0eJc2PX
VgopsuhHUyA5trxM7k4yc6GgYVx+fAwMaplovTwn5U8XK6bDEIvCjImfat/u4Wp8
R31p0BQzQaeyWfpp9Ucn/fvQSeB+wtjhHuA1ukcyWY1kBYOyCMIHymFrJLaTpUj7
aQFYZDV28HYv0yWhWIAD9Pu+aDHWpA==
-----END CERTIFICATE REQUEST-----

@ -0,0 +1,74 @@
Bag Attributes
friendlyName: VoIP Services: com.HMG.HMG-Smartphone
localKeyID: 70 4A 99 03 F8 D7 92 FA F7 2F DD 3B D8 BF 2C F0 BD CE 21 C8
subject=/UID=com.HMG.HMG-Smartphone.voip/CN=VoIP Services: com.HMG.HMG-Smartphone/OU=3A359E86ZF/O=Dr Sulaiman Al Habib Medical Center/C=SA
issuer=/CN=Apple Worldwide Developer Relations Certification Authority/OU=G4/O=Apple Inc./C=US
-----BEGIN CERTIFICATE-----
MIIGkTCCBXmgAwIBAgIQFB+/PYFlrZ6SCzSX9cqOBDANBgkqhkiG9w0BAQsFADB1
MUQwQgYDVQQDDDtBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9ucyBD
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTELMAkGA1UECwwCRzQxEzARBgNVBAoMCkFw
cGxlIEluYy4xCzAJBgNVBAYTAlVTMB4XDTI0MDYwOTEyMDc1MVoXDTI1MDcwOTEy
MDc1MFowga0xKzApBgoJkiaJk/IsZAEBDBtjb20uSE1HLkhNRy1TbWFydHBob25l
LnZvaXAxLjAsBgNVBAMMJVZvSVAgU2VydmljZXM6IGNvbS5ITUcuSE1HLVNtYXJ0
cGhvbmUxEzARBgNVBAsMCjNBMzU5RTg2WkYxLDAqBgNVBAoMI0RyIFN1bGFpbWFu
IEFsIEhhYmliIE1lZGljYWwgQ2VudGVyMQswCQYDVQQGEwJTQTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAMdp0ARHraZJ/7A7E+72sXUS+J8PFsAS/rOd
kge/CKaBKF08stKuQV03hWlIczOsBKqkeeVIvfDE7p7Kb2kBMfdZ8u8ohDGef06Q
7l9JyNCLRGQVt7QmpOo3YtoXGtIWuGpD/Wn+LOvr3QeqOt+q5Ejy3x69q3JOS7rv
/FwKPq5IhUt8mhLxgINWfRj7D2fZXD/6QeI1jo/3qqn8J9dmAwsWlS7SapyZmX3u
G1+YH0Afa0LjnKGYrEMmIoSeTr3NUKH9uRz20UTW1QOSQpuUlMITJZ90NRRgzgRP
e3d8GpYHvwXgneZeCUHIZmYeBjb7uexJAGKruT20U3ZzsVn0EPcCAwEAAaOCAuIw
ggLeMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUW9n6HeeaGgujmXYiUIY+kchb
d6gwcAYIKwYBBQUHAQEEZDBiMC0GCCsGAQUFBzAChiFodHRwOi8vY2VydHMuYXBw
bGUuY29tL3d3ZHJnNC5kZXIwMQYIKwYBBQUHMAGGJWh0dHA6Ly9vY3NwLmFwcGxl
LmNvbS9vY3NwMDMtd3dkcmc0MDUwggEeBgNVHSAEggEVMIIBETCCAQ0GCSqGSIb3
Y2QFATCB/zCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRp
ZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRo
ZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1
c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGlj
ZSBzdGF0ZW1lbnRzLjA3BggrBgEFBQcCARYraHR0cHM6Ly93d3cuYXBwbGUuY29t
L2NlcnRpZmljYXRlYXV0aG9yaXR5LzATBgNVHSUEDDAKBggrBgEFBQcDAjAyBgNV
HR8EKzApMCegJaAjhiFodHRwOi8vY3JsLmFwcGxlLmNvbS93d2RyZzQtNi5jcmww
HQYDVR0OBBYEFHBKmQP415L69y/dO9i/LPC9ziHIMA4GA1UdDwEB/wQEAwIHgDAQ
BgoqhkiG92NkBgMBBAIFADAQBgoqhkiG92NkBgMCBAIFADBDBgoqhkiG92NkBgME
BDUMM2NvbS5ITUcuSE1HLVNtYXJ0cGhvbmUsIGNvbS5ITUcuSE1HLVNtYXJ0cGhv
bmUudm9pcDAQBgoqhkiG92NkBgMFBAIFADAmBgoqhkiG92NkBgMDBBgMFmNvbS5I
TUcuSE1HLVNtYXJ0cGhvbmUwDQYJKoZIhvcNAQELBQADggEBAJAcIzSskk8/GbxQ
7nGUPPEWFswL66xTt3GusHmeXkKDXG3ac+4jLk8yU7gunos77CNDm+9TkShdJ2Rg
tTRopK4ockqwoPrCeEVrooHR4e42YvmkB6AfYKJRnQZQVJIpW0OES7vrtoWVGoNj
ktHOV+wFIuAQPI9P4z0RFyRw85MHr+jFqxeLU/1500PwCxIiNHkIcUtzZgrnr22R
7rgkxav+RrjLjXVQvC4VJispKCU7yR69Xv1rsC5zc7OTCuCkbQ9FvnfsiUz5ZDzp
3D0gGojU9wmJ1yVk9HiZsuiVwmg/LbDHI3pSYbxz3n1UHB6Pu0jX3c3Uxkx674HD
/0uvHzg=
-----END CERTIFICATE-----
Bag Attributes
localKeyID: 70 4A 99 03 F8 D7 92 FA F7 2F DD 3B D8 BF 2C F0 BD CE 21 C8
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHadAER62mSf+w
OxPu9rF1EvifDxbAEv6znZIHvwimgShdPLLSrkFdN4VpSHMzrASqpHnlSL3wxO6e
ym9pATH3WfLvKIQxnn9OkO5fScjQi0RkFbe0JqTqN2LaFxrSFrhqQ/1p/izr690H
qjrfquRI8t8evatyTku67/xcCj6uSIVLfJoS8YCDVn0Y+w9n2Vw/+kHiNY6P96qp
/CfXZgMLFpUu0mqcmZl97htfmB9AH2tC45yhmKxDJiKEnk69zVCh/bkc9tFE1tUD
kkKblJTCEyWfdDUUYM4ET3t3fBqWB78F4J3mXglByGZmHgY2+7nsSQBiq7k9tFN2
c7FZ9BD3AgMBAAECggEBALTXH58SBcd86hS+rsgSDkJ2ruNIQsBzOWpYJjtCIi0l
ih5r0lu/TWWk2SbuXhLpF95MhILLIf18Ck4UlU5rmA2SE/6RBrkc3KS6SII/no6J
Db+Z9lu4g+wnyEyxkVAe7KTp/aGmsMROxMaTuQpnptkE8BSnuxhRKtpfksNBQzC2
19OkEy4JAO7xWbm9w/ASiCtYf0Vj26DQo982Fe44cpG08iB2v1uUJINQkGzmg+85
vvn5A1ECpSpgd/eOa68ojxeNSU7iFGZPbpjuincLPBFlC5zp9KD1Bt6p2KwIizBl
GPYTp6a1DnWly6n0PuLN0fl/nRmI6ar48Ja1Qzk8NvECgYEA5iQo9lnjNOHjT6bk
hj5QXMz3MDMCPdJo6jQyADtmsC/F4RjufujfXPhMv2v8JLAjQjNMgfhTSF68zYHf
i1qW8e/CgWu7mGQEIhWtxiTkLou8zW3VjxwpgfeUsGI5L+PxoN53ZUVcetLz4Y58
8ATEhlxh02uGmG2k3HbvFu9NBT8CgYEA3dHJfFX2xv53ZD1E2IE1rM3j7a32s7VB
k/YX8ODrAJxwNmy/vm4gd5h6ofqVS1/IV4NHFbmQ5c1tzB44YGOEZH5Ta9hhHgHU
xoa3q6t+kjR9KrQvxjTSe9mW5x/jAgU0Wp/XrAfMZxc2eukb4/sJAGKG0kyFeX5O
5abVixWj7kkCgYAafd8ZPI+i7r2z1YpIybOGezGZIsYHR8k77HY1AKF5doZYuv35
LeVIVmy/PDbyIjRs0mrkKymrEvy4y1JoQC1P/EFvlG8rw5eWNNikDmsV0JATNal3
p84/X7iF9UiP8rVFx1YHGkzi9pWMSVKobmQQ82FvbNk5gqWPm0E6aqF7EQKBgQDB
mE0PlT9SIdk1xTuG8g5UiUV6tS/xXCql5kyy0LqJx/8voO4gV6FCf/PX1wnhxPDn
YA30agaKaiZ/1YhCp9hulMpd/3WTaOm5cu5uh7hqBiGP2b8wb/2cViWcBnpr0vsE
dSkYXZ4KA3pq/3R2HyyWB2e/t0Vu6cwWJuuM/hAa8QKBgGNRStNVSMPvzx2X7mB6
EqdlWqVbfSTHJiZKyNPWHlSuZgdQ14BRwq7KZ0ysZy+kOX4rh1rIfqzrKc62xEXB
E+fmIpu+DUOM5ojEPCf9Om87r3fMJ54SjM7z1dtVc+Muy4TnFZ4UQcN9txWbnkAo
++H5gC9DBedOEXkwoCYjoeuM
-----END PRIVATE KEY-----

Binary file not shown.

@ -34,15 +34,33 @@ apply plugin: 'com.google.gms.google-services'
//apply plugin: 'com.google.firebase.crashlytics'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
configurations.all {
resolutionStrategy {
force 'androidx.core:core-ktx:1.6.0'
}
c ->
c.resolutionStrategy.eachDependency {
DependencyResolveDetails dependency ->
println dependency.requested.group
if (dependency.requested.group == 'org.bouncycastle') {
dependency.useTarget 'org.bouncycastle:bcprov-jdk15to18:1.68'
}
}
}
//configurations.all {
// resolutionStrategy {
// force 'androidx.core:core-ktx:1.6.0'
// }
//}
android {
compileSdkVersion 33
buildToolsVersion "31.0.0"
compileSdkVersion 34
// ndkVersion "24.0.8215888"
buildFeatures {
viewBinding true
dataBinding true
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
@ -56,13 +74,18 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.ejada.hmg"
minSdkVersion 21
targetSdkVersion 33
minSdkVersion 26
targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true
}
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
jni.srcDirs = [] //disable automatic ndk-build call
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
@ -76,6 +99,11 @@ android {
debug {
debuggable true
signingConfig signingConfigs.debug
minifyEnabled false
shrinkResources false
// ndk {
// abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86_64'
// }
}
release {
debuggable false
@ -96,16 +124,21 @@ android {
packagingOptions {
exclude 'META-INF/proguard/androidx-annotations.pro'
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst '**/*.so'
}
compileOptions {
// coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
repositories {
flatDir {
dirs 'libs'
}
kotlinOptions {
jvmTarget = '1.8'
}
}
@ -114,13 +147,15 @@ flutter {
}
dependencies {
// coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "com.google.firebase:firebase-messaging:21.0.0"
// implementation ('com.google.firebase:firebase-inappmessaging-display:19.1.2',{
// exclude group: 'com.google.protobuf',module: 'protobuf-javalite'
// exclude group: 'com.google.protobuf',module: 'protobuf-lite'
// })
implementation 'pub.devrel:easypermissions:0.4.0'
implementation 'pub.devrel:easypermissions:3.0.0'
// implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'
// implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'
implementation 'com.google.guava:guava:27.0.1-android'
@ -129,13 +164,53 @@ dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
// Dependency on a remote binary
// implementation 'com.example.android:app-magic:12.3'
// implementation 'com.example.android:app-magic:12.3'
implementation "us.zoom.videosdk:zoomvideosdk-core:1.10.1"
implementation "us.zoom.videosdk:zoomvideosdk-annotation:1.10.1"
implementation "us.zoom.videosdk:zoomvideosdk-videoeffects:1.10.1"
// Native Dependency
implementation "org.jetbrains.anko:anko-commons:0.10.4"
// implementation "us.zoom.videosdk:ZoomVideoSDK:1.10.11"
// implementation group: 'us.zoom.videosdk', name: 'zoomvideosdk-core', version: '1.10.11'
// implementation "us.zoom.videosdk:zoomvideosdk-core:1.10.1"
// implementation "us.zoom.videosdk:zoomvideosdk-annotation:1.10.1"
// implementation "us.zoom.videosdk:zoomvideosdk-videoeffects:1.10.1"
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.3'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:adapter-java8:2.4.0'
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'com.google.android.gms:play-services-location:21.3.0'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'androidx.test.ext:junit:1.1.5'
implementation 'com.android.volley:volley:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.2.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.8.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.8.5'
implementation 'androidx.activity:activity:1.9.3'
def room_version = "2.4.0-alpha04"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
implementation 'net.zetetic:android-database-sqlcipher:4.5.2'
implementation 'com.intuit.ssp:ssp-android:1.1.0'
implementation 'com.intuit.sdp:sdp-android:1.1.0'
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
// implementation "com.mapbox.maps:android:10.16.6"
implementation 'com.mapbox.maps:android:11.3.1'
implementation files('libs/PenNavUI.aar')
implementation files('libs/Penguin.aar')
implementation files('libs/PenguinRenderer.aar')
// implementation "org.jetbrains.anko:anko-commons:0.10.4"
implementation 'com.github.kittinunf.fuel:fuel:2.3.0' //for JVM
implementation project(':blesdk_2301')
implementation 'com.github.kittinunf.fuel:fuel-android:2.3.0'
implementation 'com.google.android.gms:play-services-location:17.1.0'//for Android
implementation 'com.google.android.gms:play-services-basement:17.5.0'
@ -144,23 +219,13 @@ dependencies {
implementation 'com.facebook.stetho:stetho-urlconnection:1.5.1'
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
implementation 'androidx.work:work-runtime:2.7.0-alpha05'
implementation 'com.google.android.material:material:1.9.0'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.22'
androidTestImplementation "androidx.test:core:1.4.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2"
implementation 'com.android.support:appcompat-v7:27.1.1'
testImplementation 'junit:junit:4.12'
implementation project(':blesdk_2301')
// compile "com.jstyle:1770sdk:1.0.2"
implementation 'io.reactivex.rxjava3:rxjava:3.1.3'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
// implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2'
// Lepu Libraries
implementation 'no.nordicsemi.android:ble:2.2.4'
implementation(name: 'lepu-blepro-1.0.1', ext: 'aar')
implementation 'io.github.jeremyliao:live-event-bus-x:1.8.0'
implementation 'com.guolindev.permissionx:permissionx:1.7.1'
implementation 'org.apache.commons:commons-io:1.3.2' // for FileUtills in ER1 device configuration
// implementation 'com.airbnb.android:lottie:5.2.0'
// implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.22'
implementation 'com.whatsapp.otp:whatsapp-otp-android-sdk:0.1.0'
implementation 'com.whatsapp.otp:whatsapp-otp-android-sdk:0.1.0'
}

@ -21,7 +21,7 @@
],
"api_key": [
{
"current_key": "AIzaSyDUfg6AKM1-00WyzpvLImUBC46wFrq9-qw"
"current_key": "AIzaSyDZDeWcBlRE3YfJWYt_DCiToVnANfaj8qg"
}
],
"services": {

Binary file not shown.

Binary file not shown.

@ -37,7 +37,36 @@
-keep class com.opentok.otc.** { *; }
-keep class org.otwebrtc.** { *; }
##Flutter Zoom
-keep class us.zoom**{
*;
}
-keep interface us.zoom**{
*;
}
-keep class org.webrtc**{
*;
}
-keep class com.zipow**{
*;
}
-dontwarn com.opentok.android.**
-dontwarn com.opentok.otc.**
-keep class com.boskokg.flutter_blue_plus.* { *; }
-dontwarn penguin.com.pennav.Model.Navigation.NearLandmark
-keep,includedescriptorclasses class net.sqlcipher.** { *; }
-keep,includedescriptorclasses interface net.sqlcipher.** { *; }
-keep class retrofit2.** { *; }
-keep class okhttp3.** { *; }
-dontwarn retrofit2.**
-keep class com.google.gson.** { *; }
-dontwarn com.google.gson.**
# Penguin classes
-keep class com.peng.pennavmap.models.** { *; }
-keep class com.peng.pennavmap.db.** { *; }

@ -1,148 +1,247 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.ejada.hmg">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
<!--
io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
FlutterApplication and put your custom class here.
-->
<uses-permission
android:name="android.permission.ACTIVITY_RECOGNITION"
tools:node="remove" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
tools:node="remove" /> <!-- <uses-permission android:name="android.permission.BLUETOOTH" tools:node="remove"/> -->
<!-- <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" tools:node="remove"/> -->
<!-- <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" tools:node="remove"/> -->
<!-- <uses-permission android:name="android.permission.BLUETOOTH_SCAN" tools:node="remove"/> -->
<uses-permission
android:name="android.permission.BROADCAST_STICKY"
tools:node="remove" />
<uses-permission
android:name="com.google.android.gms.permission.AD_ID"
tools:node="remove" /> <!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> -->
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE"
tools:node="remove" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE"
tools:node="remove" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL"
tools:node="remove" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION"
tools:node="remove" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"
tools:node="remove" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"
tools:node="remove" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_BACKGROUND_LOCATION"
tools:node="remove" /> <!-- <uses-permission android:name="android.permission.INTERNET" /> -->
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
<uses-feature
android:name="android.hardware.sensor.stepcounter"
android:required="false"
tools:node="replace" />
<uses-feature
android:name="android.hardware.sensor.stepdetector"
android:required="false"
tools:node="replace" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-feature android:name="android.hardware.camera" android:required="true"/>
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-feature android:name="android.hardware.location.network" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-permission android:name="com.huawei.appmarket.service.commondata.permission.GET_COMMON_DATA"/>
<!-- Wifi Permissions-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!-- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>-->
<!-- Detect Reboot Permission -->
<!-- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>-->
<!-- Tell Google Play Store that your app uses Bluetooth LE
Set android:required="true" if bluetooth is necessary -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
<!-- New Bluetooth permissions in Android 12
https://developer.android.com/about/versions/12/features/bluetooth-permissions -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- legacy for Android 11 or lower -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<!-- legacy for Android 9 or lower -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="28" />
<uses-feature
android:name="android.hardware.location.network"
android:required="false" />
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
<uses-permission android:name="com.huawei.appmarket.service.commondata.permission.GET_COMMON_DATA" /> <!-- <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" /> -->
<!-- Wifi Permissions -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> -->
<!-- Detect Reboot Permission -->
<!-- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> -->
<queries>
<intent>
<action android:name="android.speech.RecognitionService" />
</intent>
<package android:name="com.whatsapp" />
<package android:name="com.whatsapp.w4b" />
</queries>
<application
android:name=".Application"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true"
android:showOnLockScreen="true"
android:screenOrientation="sensorPortrait"
android:allowBackup="false"
android:label="Dr. Alhabib">
android:extractNativeLibs="true"
android:icon="@mipmap/ic_launcher_local"
android:label="Dr. Alhabib"
android:screenOrientation="sensorPortrait"
android:showOnLockScreen="true"
android:usesCleartextTraffic="true"
tools:replace="android:extractNativeLibs,android:label">
<activity
android:name="com.cloud.diplomaticquarterapp.whatsapp.WhatsAppCodeActivity"
android:exported="true"
android:enabled="true"
android:launchMode="standard"
>
<intent-filter>
<action android:name="com.whatsapp.otp.OTP_RETRIEVED" />
</intent-filter>
</activity>
<meta-data
android:name="push_kit_auto_init_enabled"
android:value="true" />
<meta-data android:name="push_kit_auto_init_enabled" android:value="true" />
<activity
android:name="com.cloud.diplomaticquarterapp.MainActivity"
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:enabled="true"
android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:showOnLockScreen="true"
android:theme="@style/LaunchTheme"
android:exported="true"
tools:node="merge"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
android:windowSoftInputMode="adjustResize"
tools:node="merge">
<meta-data
android:name="flutter_deeplinking_enabled"
android:value="true" />
<!--
Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
to determine the Window background behind the Flutter UI.
-->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<!-- Displays an Android View that continues showing the launch screen
<!--
Displays an Android View that continues showing the launch screen
Drawable until Flutter paints its first frame, then this splash
screen fades out. A splash screen is useful to avoid any visual
gap between the end of Android's launch screen and the painting of
Flutter's first frame. -->
Flutter's first frame.
-->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- <intent-filter android:autoVerify="true">-->
<!-- <action android:name="android.intent.action.VIEW" />-->
<!-- <category android:name="android.intent.category.DEFAULT" />-->
<!-- <category android:name="android.intent.category.BROWSABLE" />-->
<!-- <data-->
<!-- android:host="hmg.com"-->
<!-- android:scheme="http" />-->
<!-- <data-->
<!-- android:host="www.hmg.com"-->
<!-- android:scheme="http" />-->
<!-- <data android:scheme="https" />-->
<!-- </intent-filter>-->
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver" android:exported="true">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.BOOT_COMPLETED"/>-->
<!-- <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>-->
<!-- </intent-filter>-->
<!-- </receiver>-->
</activity> <!-- <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver" android:exported="true"> -->
<!-- <intent-filter> -->
<!-- <action android:name="android.intent.action.BOOT_COMPLETED"/> -->
<!-- <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/> -->
<!-- </intent-filter> -->
<!-- </receiver> -->
<!-- Geofencing -->
<service
android:name=".geofence.intent_receivers.GeofenceTransitionsJobIntentService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
<service android:name="com.cloud.diplomaticquarterapp.smart_ring_2301.BleService"/>
<!-- Geofencing -->
<service android:name=".geofence.intent_receivers.GeofenceTransitionsJobIntentService" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" />
<receiver android:name=".geofence.intent_receivers.GeofenceBroadcastReceiver" android:enabled="true" android:exported="false" />
<receiver android:name=".geofence.intent_receivers.GeofencingRebootBroadcastReceiver" android:enabled="true" android:exported="false">
<receiver
android:name=".geofence.intent_receivers.GeofenceBroadcastReceiver"
android:enabled="true"
android:exported="false" />
<receiver
android:name=".geofence.intent_receivers.GeofencingRebootBroadcastReceiver"
android:enabled="true"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
<receiver android:name=".geofence.intent_receivers.LocationProviderChangeReceiver" android:exported="false">
<receiver
android:name=".geofence.intent_receivers.LocationProviderChangeReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.location.PROVIDERS_CHANGED"/>
<action android:name="android.location.PROVIDERS_CHANGED" />
</intent-filter>
</receiver>
<service android:name=".geofence.intent_receivers.ReregisterGeofenceJobService" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" />
<!-- Geofencing -->
<service
android:name=".geofence.intent_receivers.ReregisterGeofenceJobService"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" /> <!-- Geofencing -->
<!--
Huawei Push Notifications
Set push kit auto enable to true (for obtaining the token on initialize)
-->
<!-- <meta-data-->
<!-- android:name="push_kit_auto_init_enabled"-->
<!-- android:value="true" />-->
<!-- <meta-data -->
<!-- android:name="push_kit_auto_init_enabled" -->
<!-- android:value="true" /> -->
<!-- These receivers are for sending scheduled local notifications -->
<receiver android:name="com.huawei.hms.flutter.push.receiver.local.HmsLocalNotificationBootEventReceiver" android:exported="false">
<receiver
android:name="com.huawei.hms.flutter.push.receiver.local.HmsLocalNotificationBootEventReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
@ -158,26 +257,17 @@
<intent-filter>
<action android:name="com.huawei.hms.flutter.push.receiver.BACKGROUND_REMOTE_MESSAGE" />
</intent-filter>
</receiver>
<!-- Huawei Push Notifications -->
<meta-data android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyCyDbWUM9d_sBUGIE8PcuShzPaqO08NSC8"/>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
</receiver> <!-- Huawei Push Notifications -->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyCyDbWUM9d_sBUGIE8PcuShzPaqO08NSC8" />
<!--
Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java
-->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- <uses-permission android:name="android.permission.INTERNET" />-->
<!-- <uses-permission android:name="android.permission.USE_FINGERPRINT" />-->
<!-- <uses-permission android:name="android.permission.READ_CALENDAR" />-->
<!-- <uses-permission android:name="android.permission.WRITE_CALENDAR" />-->
</manifest>
</manifest>

@ -1,34 +1,35 @@
package com.cloud.diplomaticquarterapp
package com.ejada.hmg
import android.app.PendingIntent
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.util.Log
import android.view.WindowManager
import com.cloud.diplomaticquarterapp.check_me_pro.ble.manager.BleScanManager
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.PenguinInPlatformBridge
import com.cloud.diplomaticquarterapp.whatsapp.AppSignatureRetriever
import com.ejada.hmg.utils.*
import com.ejada.hmg.*
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import com.cloud.diplomaticquarterapp.ble.BleBridge
import com.cloud.diplomaticquarterapp.smart_ring_2301.BleManager
@Suppress("DEPRECATION")
class MainActivity : FlutterFragmentActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
import com.cloud.diplomaticquarterapp.whatsapp.WhatsApp
import com.cloud.diplomaticquarterapp.whatsapp.WhatsAppOtpPlatformBridge
class MainActivity: FlutterFragmentActivity() {
@RequiresApi(Build.VERSION_CODES.O)
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
// Create Flutter Platform Bridge
this.window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON or WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON)
PlatformBridge(flutterEngine, this).create()
OpenTokPlatformBridge(flutterEngine, this).create()
BleManager.init(this)
BleBridge(flutterEngine, this).createBleBridge(BleScanManager()) { name, bluetoothDevice ->
// Handle the scan result here
Log.d("MainActivity", "Received scan result: $name, $bluetoothDevice")
}
}
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
PenguinInPlatformBridge(flutterEngine, this).create()
WhatsAppOtpPlatformBridge(flutterEngine, this).invoke()
AppSignatureRetriever().logSignatures(this)
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {x
// val mChannel = NotificationChannel("video_call_noti", "video call", NotificationManager.IMPORTANCE_HIGH)
// val soundUri = Uri.parse("android.resource://" + getApplicationContext()
// .getPackageName() + "/" + R.raw.alert)
@ -47,12 +48,28 @@ class MainActivity : FlutterFragmentActivity() {
// val time = timeToMillis("04:00:00", "HH:mm:ss")
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
val granted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
val intent = Intent("PERMISSION_RESULT_ACTION").apply {
putExtra("PERMISSION_GRANTED", granted)
}
sendBroadcast(intent)
// Log the request code and permission results
Log.d("PermissionsResult", "Request Code: $requestCode")
Log.d("PermissionsResult", "Permissions: ${permissions.joinToString()}")
Log.d("PermissionsResult", "Grant Results: ${grantResults.joinToString()}")
// override fun onBleStateChanged(model: Int, state: Int) {
// println("onBleStateChanged")
// println("model $model, state: $state")
//
// }
}
override fun onResume() {
super.onResume()
}
}

@ -0,0 +1,53 @@
package com.cloud.diplomaticquarterapp
import com.ejada.hmg.MainActivity
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.penguin.PenguinView
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
class PenguinInPlatformBridge(
private var flutterEngine: FlutterEngine,
private var mainActivity: MainActivity
) {
private lateinit var channel: MethodChannel
companion object {
private const val CHANNEL = "launch_penguin_ui"
}
@RequiresApi(Build.VERSION_CODES.O)
fun create() {
// openTok = OpenTok(mainActivity, flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
channel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
when (call.method) {
"launchPenguin" -> {
print("the platform channel is being called")
val args = call.arguments as Map<String, Any>?
Log.d("TAG", "configureFlutterEngine: $args")
println("args")
args?.let {
PenguinView(
mainActivity,
100,
args,
flutterEngine.dartExecutor.binaryMessenger,
activity = mainActivity,
channel
)
}
}
else -> {
result.notImplemented()
}
}
}
}
}

@ -0,0 +1,28 @@
package com.cloud.diplomaticquarterapp.PermissionManager
import android.Manifest
import android.os.Build
object PermissionHelper {
fun getRequiredPermissions(): Array<String> {
val permissions = mutableListOf(
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
// Manifest.permission.ACTIVITY_RECOGNITION
)
// For Android 12 (API level 31) and above, add specific permissions
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12 (API 31) and above
permissions.add(Manifest.permission.BLUETOOTH_SCAN)
permissions.add(Manifest.permission.BLUETOOTH_CONNECT)
permissions.add(Manifest.permission.HIGH_SAMPLING_RATE_SENSORS)
}
return permissions.toTypedArray()
}
}

@ -0,0 +1,50 @@
package com.cloud.diplomaticquarterapp.PermissionManager
import android.app.Activity
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
class PermissionManager(
private val context: Context,
val listener: PermissionListener,
private val requestCode: Int,
vararg permissions: String
) {
private val permissionsArray = permissions
interface PermissionListener {
fun onPermissionGranted()
fun onPermissionDenied()
}
fun arePermissionsGranted(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
permissionsArray.all {
ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}
} else {
true
}
}
fun requestPermissions(activity: Activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ActivityCompat.requestPermissions(activity, permissionsArray, requestCode)
}
}
fun handlePermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
if (this.requestCode == requestCode) {
val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
if (allGranted) {
listener.onPermissionGranted()
} else {
listener.onPermissionDenied()
}
}
}
}

@ -0,0 +1,15 @@
package com.cloud.diplomaticquarterapp.PermissionManager
// PermissionResultReceiver.kt
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
class PermissionResultReceiver(
private val callback: (Boolean) -> Unit
) : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val granted = intent?.getBooleanExtra("PERMISSION_GRANTED", false) ?: false
callback(granted)
}
}

@ -1,17 +0,0 @@
package com.cloud.diplomaticquarterapp.ble;
public class BPModelMeasuring {
public int pressure;
public int pr;
public boolean deflate;
public boolean pulse;
public BPModelMeasuring(int pressure, int pr, boolean deflate, boolean pulse) {
this.pressure = pressure;
this.pr = pr;
this.deflate = deflate;
this.pulse = pulse;
}
}

@ -1,23 +0,0 @@
package com.cloud.diplomaticquarterapp.ble;
public class BPModelResult {
public boolean deflate;
public int dia;
public int mean;
public int pr;
public int pressure;
public int result;
public int sys;
public BPModelResult(boolean deflate, int dia, int mean, int pr, int pressure, int result, int sys) {
this.deflate = deflate;
this.dia = dia;
this.mean = mean;
this.pr = pr;
this.pressure = pressure;
this.result = result;
this.sys = sys;
}
}

@ -1,22 +0,0 @@
package com.cloud.diplomaticquarterapp.ble;
public class OxymeterModel {
public int spo2;
public int pr;
public float pi;
public boolean isProbeOff;
public boolean isPulseSearching;
public boolean isCheckProbe;
public int battery;
public OxymeterModel(int spo2, int pr, float pi, boolean isProbeOff, boolean isPulseSearching, boolean isCheckProbe, int battery) {
this.spo2 = spo2;
this.pr = pr;
this.pi = pi;
this.isProbeOff = isProbeOff;
this.isPulseSearching = isPulseSearching;
this.isCheckProbe = isCheckProbe;
this.battery = battery;
}
}

@ -1,12 +0,0 @@
package com.cloud.diplomaticquarterapp.ble.utils;
public class AlgorithmUtil {
public static native double[] filter(double var0, boolean var2);
public static native short[] shortFilter(short[] var0);
static {
System.loadLibrary("online-lib");
System.loadLibrary("offline-lib");
}
}

@ -1,57 +0,0 @@
package com.cloud.diplomaticquarterapp.ble.utils;
import java.util.Arrays;
public class EcgData {
private long startTime; // 时间戳s
private int duration;
private String fileName;
private byte[] data;
private short[] shortData;
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public int getDuration() {
return duration;
}
public void setDuration(int duration) {
this.duration = duration;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public byte[] getData() {
return data;
}
public void setData(byte[] data) {
this.data = data;
}
public short[] getShortData() {
return shortData;
}
public void setShortData(short[] shortData) {
this.shortData = shortData;
}
@Override
public String toString() {
return "{" + "startTime:" + startTime + ", duration:" + duration + ", fileName:'" + fileName + '\'' + ", data:" + Arrays.toString(data) + ", shortData:" + Arrays.toString(shortData) + '}';
}
}

@ -1,49 +0,0 @@
//package com.cloud.diplomaticquarterapp.ble.utils;
//
////
//// Source code recreated from a .class file by IntelliJ IDEA
//// (powered by FernFlower decompiler)
////
//
//
//import doac.doba;
//import doac.dobn;
//import doac.docn;
//
//public class FilterUtil {
// public FilterUtil() {
// }
//
// public static short[] getEcgFileFilterData(int var0, byte[] var1) {
// if (var0 != 7 && var0 != 8) {
// if (var0 == 19) {
// return AlgorithmUtil.shortFilter((new doba(var1)).doan());
// }
//
// if (var0 == 52) {
// return AlgorithmUtil.shortFilter((new docn("", var1, "")).doah());
// }
//
// if (var0 != 77 && var0 != 127) {
// if (var0 == 32) {
// return AlgorithmUtil.shortFilter((new doba(var1)).doan());
// }
//
// if (var0 != 33 && var0 != 74 && var0 != 75) {
// switch (var0) {
// case 145:
// case 146:
// case 147:
// case 148:
// case 149:
// break;
// default:
// return new short[0];
// }
// }
// }
// }
//
// return AlgorithmUtil.shortFilter(DecompressUtil.er1Decompress((new dobn(var1)).doad()));
// }
//}

@ -1,50 +0,0 @@
package com.cloud.diplomaticquarterapp.ble.utils;
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
public class HexString {
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
private HexString() {
}
public static String bytesToHex(byte[] var0) {
char[] var1 = new char[var0.length * 2];
for(int var2 = 0; var2 < var0.length; ++var2) {
int var3 = var0[var2] & 255;
int var4 = var2 * 2;
char[] var5;
char[] var10001 = var5 = HEX_ARRAY;
int var10002 = var3;
var1[var4] = var5[var3 >>> 4];
var3 = var4 + 1;
var1[var3] = var10001[var10002 & 15];
}
return new String(var1);
}
public static byte[] hexToBytes(String var0) {
if (var0.length() % 2 == 1) {
throw new IllegalArgumentException("hexToBytes requires an even-length String parameter");
} else {
int var1;
byte[] var2 = new byte[(var1 = var0.length()) / 2];
for(int var3 = 0; var3 < var1; var3 += 2) {
int var4 = var3 / 2;
var2[var4] = (byte)((Character.digit(var0.charAt(var3), 16) << 4) + Character.digit(var0.charAt(var3 + 1), 16));
}
return var2;
}
}
public static String trimStr(String var0) {
return var0.trim();
}
}

@ -1,7 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro
import kotlinx.coroutines.channels.Channel
//object UiChannel {
// val progressChannel = Channel<Int>(Channel.CONFLATED)
//}

@ -1,5 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import android.bluetooth.BluetoothDevice
data class BleBean(var name: String, var bluetoothDevice: BluetoothDevice)

@ -1,11 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import java.util.*
data class BpBean(
var date: Date = Date(),
var timeString: String = "",
var sys: Int = 0,
var dia: Int=0,
var pr: Int = 0
)

@ -1,17 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import java.util.*
data class DlcBean(
var date: Date = Date(),
var timeString: String = "",
var hr: Int = 0,
var eface: Int = 0,
var oxy: Int = 0,
var pi: Int = 0,
var oface: Int = 0,
var prFlag: Int = 0,
var pr: Int = 0,
var bpiFace: Int = 0,
var voice: Int = 0
)

@ -1,11 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import java.util.*
data class EcgBean(
var date: Date = Date(),
var timeString: String = "",
var way: Int = 0,
var face: Int = 0,
var voice: Int = 0
)

@ -1,10 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import java.util.*
data class GluBean(
var date: Date = Date(),
var timeString: String = "",
var glu:Float=0f,
var note:String=""
)

@ -1,13 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import java.util.*
data class OxyBean(
var date: Date = Date(),
var timeString: String = "",
var way: Int = 0,
var oxy: Int = 0,
var pr: Int = 0,
var pi: Int = 0,
var face: Int = 0
)

@ -1,52 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import android.os.Parcel
import android.os.Parcelable
import java.util.*
data class PedBean(
var date: Date = Date(),
var timeString: String? = "",
var step: Int = 0,
var dis: Float = 0f,
var speed: Float = 0f,
var cal: Float = 0f,
var fat: Float = 0f,
var time: Int = 0
) : Parcelable {
constructor(parcel: Parcel) : this(
TODO("date"),
parcel.readString(),
parcel.readInt(),
parcel.readFloat(),
parcel.readFloat(),
parcel.readFloat(),
parcel.readFloat(),
parcel.readInt()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(timeString)
parcel.writeInt(step)
parcel.writeFloat(dis)
parcel.writeFloat(speed)
parcel.writeFloat(cal)
parcel.writeFloat(fat)
parcel.writeInt(time)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<PedBean> {
override fun createFromParcel(parcel: Parcel): PedBean {
return PedBean(parcel)
}
override fun newArray(size: Int): Array<PedBean?> {
return arrayOfNulls(size)
}
}
}

@ -1,15 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import java.util.*
data class SlpBean(
var date: Date = Date(),
var timeString: String = "",
var time: Int = 0,
var lowTime: Int = 0,
var lowCount: Int = 0,
var minO2: Int = 0,
var meanO2: Int = 0,
var face: Int = 0
)

@ -1,11 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import java.util.*
data class TmpBean(
var date: Date = Date(),
var timeString: String = "",
var way: Int = 0,
var tmp: Float = 0f,
var face: Int = 0
)

@ -1,19 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import com.google.gson.Gson
import java.util.*
data class UserBean(
var id: String = "",
var name: String = "",
var ico: Int = 0,
var sex: Int = 0,
var birthday: Date = Date(),
var weight: Int = 0,
var height: Int = 0,
var color: Int = 0
)
fun UserBean.toJson(): String {
return Gson().toJson(this)
}

@ -1,40 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.constant;
public class BTConstant {
// Bluetooth Command length
public final static int WRITE_CONTENT_PKG_DATA_LENGTH = 1024;
public final static int READ_CONTENT_ACK_DATA_LENGTH = 1024;
public final static int COMMON_PKG_LENGTH = 8;
public final static int COMMON_ACK_PKG_LENGTH = 12;
public final static int READ_CONTENT_ACK_PKG_FRONT_LENGTH = 8;
public final static int GET_INFO_ACK_PKG_LENGTH = 8 + 256;
public final static byte ACK_CMD_OK = 0;
public final static byte ACK_CMD_BAD = 1;
// Bluetooth Max file name length
public final static byte BT_WRITE_FILE_NAME_MAX_LENGTH = 30;
public final static byte BT_READ_FILE_NAME_MAX_LENGTH = 30;
// Bluetooth Command word
public final static byte CMD_WORD_START_WRITE = 0x00;
public final static byte CMD_WORD_WRITE_CONTENT = 0x01;
public final static byte CMD_WORD_END_WRITE = 0x02;
public final static byte CMD_WORD_START_READ = 0x03;
public final static byte CMD_WORD_READ_CONTENT = 0x04;
public final static byte CMD_WORD_END_READ = 0x05;
public final static byte CMD_WORD_DEL_FILE = 0x06;
public final static byte CMD_WORD_LIST_START = 0x07;
public final static byte CMD_WORD_LIST_DATA = 0x08;
public final static byte CMD_WORD_LIST_END = 0x09;
public final static byte CMD_WORD_LANG_UPDATE_START = 0x0A;
public final static byte CMD_WORD_LANG_UPDATE_DATA = 0x0B;
public final static byte CMD_WORD_LANG_UPDATE_END = 0x0C;
public final static byte CMD_WORD_APP_UPDATE_START = 0x0D;
public final static byte CMD_WORD_APP_UPDATE_DATA = 0x0E;
public final static byte CMD_WORD_APP_UPDATE_END = 0x0F;
public final static byte CMD_WORD_GET_INFO = 0x14;
public final static byte CMD_WORD_PING = 0x15;
public final static byte CMD_WORD_PARA_SYNC = 0x16;
}

@ -1,58 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.check_me_pro.bean.BpBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import java.util.*
class BpInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size/11
var Bp: ArrayList<BpBean> = arrayListOf<BpBean>()
init {
var start: Int
for (k in 0 until size) {
start = k * 11
val year: Int = toUInt(setRange(start, 2))
val month: Int = toUInt(setRange(start + 2, 1)) - 1
val date: Int = toUInt(setRange(start + 3, 1))
val hour: Int = toUInt(setRange(start + 4, 1))
val minute: Int = toUInt(setRange(start + 5, 1))
val second: Int = toUInt(setRange(start + 6, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DATE] = date
calendar[Calendar.HOUR] = hour
calendar[Calendar.MINUTE] = minute
calendar[Calendar.SECOND] = second
Bp.add(BpBean())
Bp[k].apply {
this.date = calendar.time
timeString = String.format(
"%04d%02d%02d%02d%02d%02d",
year,
month + 1,
date,
hour,
minute,
second
)
sys = toUInt(setRange(start + 7, 2))
dia = toUInt(setRange(start + 9, 1))
pr = toUInt(setRange(start + 10, 1))
}
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -1,14 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.utils.toUInt
import com.cloud.diplomaticquarterapp.utils.unsigned
class CheckMeResponse(var bytes: ByteArray) {
var cmd: Int = bytes[1].unsigned()
var pkgNo: Int = toUInt(bytes.copyOfRange(3, 5))
var len: Int = toUInt(bytes.copyOfRange(5, 7))
var content: ByteArray = bytes.copyOfRange(7, 7 + len)
}

@ -1,20 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import android.util.Log
import com.cloud.diplomaticquarterapp.utils.toUInt
import org.json.JSONObject
class DeviceInfo(buf: ByteArray) {
var len: Int = toUInt(buf.copyOfRange(5, 7))
var content: ByteArray = buf.copyOfRange(7, 7 + len)
var deviceStr: String = String(content)
var json: JSONObject
init {
Log.i("byteSize", buf.decodeToString())
Log.i("len::", len.toString())
deviceStr = deviceStr.substring(0, deviceStr.indexOf("}") + 1)
json = JSONObject(deviceStr)
}
}

@ -1,69 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.check_me_pro.bean.DlcBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import java.util.*
class DlcInfo(var bytes: ByteArray) {
var size: Int = bytes.size / 17
var dlc: ArrayList<DlcBean> = arrayListOf<DlcBean>()
init {
var start: Int
for (k in 0 until size) {
start = k * 17
val year: Int = toUInt(setRange(start, 2))
val month: Int = toUInt(setRange(start + 2, 1))
val date: Int = toUInt(setRange(start + 3, 1))
val hour: Int = toUInt(setRange(start + 4, 1))
val minute: Int = toUInt(setRange(start + 5, 1))
val second: Int = toUInt(setRange(start + 6, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month - 1
calendar[Calendar.DATE] = date
calendar[Calendar.HOUR] = hour
calendar[Calendar.MINUTE] = minute
calendar[Calendar.SECOND] = second
dlc.add(DlcBean())
dlc[k].apply {
this.date = calendar.time
timeString = String.format(
"%04d%02d%02d%02d%02d%02d",
year,
month,
date,
hour,
minute,
second
)
hr = toUInt(setRange(start + 7, 2))
eface = toUInt(setRange(start + 9, 1))
if (eface > 2) eface = 2
oxy = toUInt(setRange(start + 10, 1))
pi = toUInt(setRange(start + 11, 1))
oface = toUInt(setRange(start + 12, 1))
if (oface > 2) oface = 2
prFlag = toUInt(setRange(start + 13, 1))
pr = toUInt(setRange(start + 14, 1))
bpiFace = toUInt(setRange(start + 15, 1))
if (bpiFace > 2) bpiFace = 2
voice = toUInt(setRange(start + 16, 1))
}
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -1,60 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.check_me_pro.bean.EcgBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import java.util.*
class EcgInfo(var bytes: ByteArray) {
var size: Int = bytes.size / 10
var ecg: ArrayList<EcgBean> = arrayListOf<EcgBean>()
init {
var start: Int
for (k in 0 until size) {
start = k * 10
val year: Int = toUInt(setRange(start, 2))
val month: Int = toUInt(setRange(start + 2, 1)) - 1
val date: Int = toUInt(setRange(start + 3, 1))
val hour: Int = toUInt(setRange(start + 4, 1))
val minute: Int = toUInt(setRange(start + 5, 1))
val second: Int = toUInt(setRange(start + 6, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DATE] = date
calendar[Calendar.HOUR] = hour
calendar[Calendar.MINUTE] = minute
calendar[Calendar.SECOND] = second
ecg.add(EcgBean())
ecg[k].apply {
this.date = calendar.time
timeString = String.format(
"%04d%02d%02d%02d%02d%02d",
year,
month + 1,
date,
hour,
minute,
second
)
way = toUInt(setRange(start + 7, 1))
face = toUInt(setRange(start + 8, 1))
if (face > 2) face = 2
voice = toUInt(setRange(start + 9, 1))
}
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -1,64 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.utils.toUInt
class EcgWaveInfo constructor(var bytes: ByteArray) {
var hrSize: Int = toUInt(bytes.copyOfRange(0, 2))
var waveSize: Int = toUInt(bytes.copyOfRange(2, 6)) - 4
var hr: Int = toUInt(bytes.copyOfRange(6, 8))
var st: Int = toUInt(bytes.copyOfRange(8, 10))
var qrs: Int = toUInt(bytes.copyOfRange(10, 12))
var pvcs: Int = toUInt(bytes.copyOfRange(12, 14))
var qtc: Int = toUInt(bytes.copyOfRange(14, 16))
var result: Int = toUInt(bytes.copyOfRange(16, 17))
var qt: Int = toUInt(bytes.copyOfRange(19, 21))
var hrList: IntArray = IntArray(hrSize / 2)
var waveList: IntArray = IntArray(waveSize / 2)
var waveIntSize = waveSize / 2
val total = 2500
var waveViewSize = waveIntSize / total
init {
for (index in 0 until hrSize / 2) {
hrList[index] = toUInt(setRange(index * 2 + 22, 2))
}
// for (index in 0 until waveSize / 2) {
// waveList[index] =
// bytes[23 + index * 2 + hrSize].toInt() * 256 + bytes[22 + index * 2 + hrSize].toInt()
// }
// waveList= ECGInnerItem(bytes).ecgData
waveIntSize=waveList.size
waveViewSize=waveIntSize/total
if (waveViewSize * total < waveIntSize) {
waveViewSize++
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
fun getWave(index: Int): IntArray {
val result = IntArray(total)
for (k in 0 until total) {
result[k] = if (k + index * total < waveList.size) {
waveList[k + index * total]
} else {
1000000
}
}
return result
}
}

@ -1,57 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.check_me_pro.bean.GluBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import java.util.*
class GluInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size / 32
var Glu: ArrayList<GluBean> = arrayListOf<GluBean>()
init {
var start: Int
for (k in 0 until size) {
start = k * 32
val year: Int = toUInt(setRange(start, 2))
val month: Int = toUInt(setRange(start + 2, 1)) - 1
val date: Int = toUInt(setRange(start + 3, 1))
val hour: Int = toUInt(setRange(start + 4, 1))
val minute: Int = toUInt(setRange(start + 5, 1))
val second: Int = toUInt(setRange(start + 6, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DATE] = date
calendar[Calendar.HOUR] = hour
calendar[Calendar.MINUTE] = minute
calendar[Calendar.SECOND] = second
Glu.add(GluBean())
Glu[k].apply {
this.date = calendar.time
timeString = String.format(
"%04d%02d%02d%02d%02d%02d",
year,
month + 1,
date,
hour,
minute,
second
)
glu= toUInt(setRange(start+7,2)).toFloat()/10f
note=String(setRange(start+12,20))
}
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -1,56 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.check_me_pro.bean.OxyBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import java.util.*
class OxyInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size / 12
var Oxy: ArrayList<OxyBean> = arrayListOf()
init {
var start: Int
for (k in 0 until size) {
start = k * 12
val year: Int = toUInt(setRange(start, 2))
val month: Int = toUInt(setRange(start + 2, 1)) - 1
val date: Int = toUInt(setRange(start + 3, 1))
val hour: Int = toUInt(setRange(start + 4, 1))
val minute: Int = toUInt(setRange(start + 5, 1))
val second: Int = toUInt(setRange(start + 6, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DATE] = date
calendar[Calendar.HOUR] = hour
calendar[Calendar.MINUTE] = minute
calendar[Calendar.SECOND] = second
Oxy.add(OxyBean())
Oxy[k].apply {
this.date = calendar.time
timeString = String.format(
"%04d%02d%02d%02d%02d%02d",
year,
month + 1,
date,
hour,
minute,
second
)
way = toUInt(setRange(start + 7, 1))
if (way > 2) way = 2
oxy = toUInt(setRange(start + 8, 1))
pr = toUInt(setRange(start + 9, 1))
pi = toUInt(setRange(start + 10, 1))
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)
}
}

@ -1,28 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.utils.toUInt
import com.cloud.diplomaticquarterapp.utils.unsigned
class OxyWaveInfo constructor(var bytes: ByteArray) {
val size1: Int = toUInt(bytes.copyOfRange(0, 2))
val size2: Int = toUInt(bytes.copyOfRange(2, 6))
val o2Array = IntArray(size1 / 3)
val pulseArray = IntArray(size1 / 3)
val waveArray = IntArray(size2)
init {
for (k in 0 until size1 / 3) {
o2Array[k] = bytes[k * 3 + 6].unsigned()
pulseArray[k] =
bytes[k * 3 + 7].unsigned() + bytes[k * 3 + 8].unsigned() * 256
}
for (k in 0 until size2) {
waveArray[k] = bytes[k + 6 + size1].unsigned()
}
}
}

@ -1,63 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import android.util.Log
import com.cloud.diplomaticquarterapp.check_me_pro.bean.PedBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import java.util.*
class PedInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size / 29
var Ped: ArrayList<PedBean> = arrayListOf<PedBean>()
init {
Log.i("pedoSize",bytes.size.toString())
var start: Int
for (k in 0 until size) {
start = k * 29
val year: Int = toUInt(setRange(start, 2))
val month: Int = toUInt(setRange(start + 2, 1)) - 1
val date: Int = toUInt(setRange(start + 3, 1))
val hour: Int = toUInt(setRange(start + 4, 1))
val minute: Int = toUInt(setRange(start + 5, 1))
val second: Int = toUInt(setRange(start + 6, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DATE] = date
calendar[Calendar.HOUR] = hour
calendar[Calendar.MINUTE] = minute
calendar[Calendar.SECOND] = second
Ped.add(PedBean())
Ped[k].apply {
this.date = calendar.time
timeString = String.format(
"%04d%02d%02d%02d%02d%02d",
year,
month + 1,
date,
hour,
minute,
second
)
step = toUInt(setRange(start + 7, 4))
dis = toUInt(setRange(start + 11, 4)).toFloat() / 100f
speed = toUInt(setRange(start + 15, 4)).toFloat() / 10f
cal = toUInt(setRange(start + 19, 4)).toFloat() / 100f
fat = toUInt(setRange(start + 23, 2)).toFloat() / 100f
time = toUInt(setRange(start + 25, 2))
}
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -1,71 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import android.util.Log
import com.cloud.diplomaticquarterapp.check_me_pro.bean.SlpBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import java.util.*
class SlpInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size / 18
var Slp: ArrayList<SlpBean> = arrayListOf<SlpBean>()
fun byteArray2String(byteArray: ByteArray): String {
var fuc = ""
for (b in byteArray) {
val st = String.format("%02X", b)
fuc += ("$st ");
}
return fuc
}
init {
Log.e("sleepSIze",byteArray2String(bytes))
var start: Int
for (k in 0 until size) {
start = k *18
val year: Int = toUInt(setRange(start, 2))
val month: Int = toUInt(setRange(start + 2, 1)) - 1
val date: Int = toUInt(setRange(start + 3, 1))
val hour: Int = toUInt(setRange(start + 4, 1))
val minute: Int = toUInt(setRange(start + 5, 1))
val second: Int = toUInt(setRange(start + 6, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DATE] = date
calendar[Calendar.HOUR] = hour
calendar[Calendar.MINUTE] = minute
calendar[Calendar.SECOND] = second
Slp.add(SlpBean())
Slp[k].apply {
this.date = calendar.time
timeString = String.format(
"%04d%02d%02d%02d%02d%02d",
year,
month + 1,
date,
hour,
minute,
second
)
time = toUInt(setRange(start + 7, 4))
lowTime = toUInt(setRange(start + 11, 2))
lowCount = toUInt(setRange(start + 13, 2))
minO2 = toUInt(setRange(start + 15, 1))
meanO2 = toUInt(setRange(start + 16, 1))
face = toUInt(setRange(start + 17, 1))
if (face > 2) face = 2
}
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -1,59 +0,0 @@
import com.cloud.diplomaticquarterapp.check_me_pro.bean.TmpBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import java.util.*
class TmpInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size / 11
var Tmp: ArrayList<TmpBean> = arrayListOf<TmpBean>()
init {
var start: Int
for (k in 0 until size) {
start = k * 11
val year: Int = toUInt(setRange(start, 2))
val month: Int = toUInt(setRange(start + 2, 1)) - 1
val date: Int = toUInt(setRange(start + 3, 1))
val hour: Int = toUInt(setRange(start + 4, 1))
val minute: Int = toUInt(setRange(start + 5, 1))
val second: Int = toUInt(setRange(start + 6, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DATE] = date
calendar[Calendar.HOUR] = hour
calendar[Calendar.MINUTE] = minute
calendar[Calendar.SECOND] = second
Tmp.add(TmpBean())
Tmp[k].apply {
this.date = calendar.time
timeString = String.format(
"%04d%02d%02d%02d%02d%02d",
year,
month + 1,
date,
hour,
minute,
second
)
way = toUInt(setRange(start + 7, 1))
if (way > 2) way = 2
tmp = toUInt(setRange(start + 8, 2)).toFloat() / 10f
face = toUInt(setRange(start + 10, 1))
if (face > 2) face = 2
}
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -1,46 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.format
import com.cloud.diplomaticquarterapp.check_me_pro.bean.UserBean
import com.cloud.diplomaticquarterapp.utils.toUInt
import com.cloud.diplomaticquarterapp.utils.unsigned
import java.util.*
class UserInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size / 27
var user: Array<UserBean> = Array(size) {
UserBean()
}
init {
var start: Int
for (k in 0 until size) {
start = k * 27
user[k].id = bytes[start].unsigned().toString()
user[k].name = String(setRange(start + 1, 16))
user[k].ico = bytes[start + 17].unsigned()
user[k].sex = bytes[start + 18].unsigned()
val year: Int = toUInt(setRange(start + 19, 2))
val month: Int = toUInt(setRange(start + 21, 1)) - 1
val date: Int = toUInt(setRange(start + 22, 1))
val calendar = Calendar.getInstance()
calendar[Calendar.YEAR] = year
calendar[Calendar.MONTH] = month
calendar[Calendar.DATE] = date
user[k].birthday = calendar.time
user[k].weight = toUInt(setRange(start + 23, 2)) /10
user[k].height = toUInt(setRange(start + 25, 2))
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -1,111 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.manager;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.content.Context;
import android.util.Log;
import java.util.Arrays;
import java.util.UUID;
import no.nordicsemi.android.ble.BleManager;
import no.nordicsemi.android.ble.data.Data;
public class BleDataManager extends BleManager {
private BluetoothGattCharacteristic write_char;
private BluetoothGattCharacteristic notify_char;
private OnNotifyListener listener;
public BleDataManager(Context context) {
super(context);
}
public void setNotifyListener(OnNotifyListener listener) {
this.listener = listener;
}
@Override
protected BleManagerGattCallback getGattCallback() {
return new MyManagerGattCallback();
}
public void sendCmd(byte[] bytes) {
// Log.i("----- Current Write Command -----", "");
writeCharacteristic(write_char, bytes)
.split()
.done(device -> {
})
.enqueue();
}
public interface OnNotifyListener {
void onNotify(BluetoothDevice device, Data data);
}
private class MyManagerGattCallback extends BleManagerGattCallback {
@Override
public boolean isRequiredServiceSupported(BluetoothGatt gatt) {
final BluetoothGattService service = gatt.getService(service_uuid);
if (service != null) {
write_char = service.getCharacteristic(write_uuid);
notify_char = service.getCharacteristic(notify_uuid);
}
boolean notify = false;
if (notify_char != null) {
final int properties = notify_char.getProperties();
notify = (properties & BluetoothGattCharacteristic.PROPERTY_NOTIFY) != 0;
}
boolean writeRequest = false;
if (write_char != null) {
final int properties = write_char.getProperties();
int writeType = BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT;
if ((properties & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) != 0) {
writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE;
}
write_char.setWriteType(writeType);
writeRequest = (properties & BluetoothGattCharacteristic.PROPERTY_WRITE) != 0 || (properties & BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) != 0;
/// LepuBleLog.d(TAG, "writeChar writeRequest == " + writeRequest);
}
// Return true if all required services have been found
return write_char != null && notify_char != null
&& notify && writeRequest;
}
@Override
public boolean isOptionalServiceSupported(BluetoothGatt gatt) {
return super.isOptionalServiceSupported(gatt);
}
@Override
protected void initialize() {
beginAtomicRequestQueue()
.add(requestMtu(23) // Remember, GATT needs 3 bytes extra. This will allow packet size of 244 bytes.
.with((device, mtu) -> Log.d("TAG", "MTU set to " + mtu))
.fail((device, status) -> log(Log.WARN, "Requested MTU not supported: " + status)))
.add(enableNotifications(notify_char))
.done(device -> Log.d("TAG", "Target initialized"))
.enqueue();
setNotificationCallback(notify_char)
.with((device, data) -> {
listener.onNotify(device, data);
});
}
@Override
public void onDeviceDisconnected() {
write_char = null;
notify_char = null;
}
}
public static final UUID service_uuid = UUID.fromString("14839ac4-7d7e-415c-9a42-167340cf2339");
public static final UUID write_uuid = UUID.fromString("8B00ACE7-EB0B-49B0-BBE9-9AEE0A26E1A3");
public static final UUID notify_uuid = UUID.fromString("0734594A-A8E7-4B1A-A6B1-CD5243059A57");
}

@ -1,64 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.manager
import android.annotation.SuppressLint
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothManager
import android.bluetooth.le.BluetoothLeScanner
import android.bluetooth.le.ScanCallback
import android.bluetooth.le.ScanResult
import android.bluetooth.le.ScanSettings
import android.content.Context
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.utils.Constant
class BleScanManager {
interface Scan {
fun scanReturn(name: String, bluetoothDevice: BluetoothDevice)
}
private var bluetoothAdapter: BluetoothAdapter? = null
private lateinit var leScanner: BluetoothLeScanner
private var scan: Scan? = null
private val leScanCallback: ScanCallback = object : ScanCallback() {
@SuppressLint("MissingPermission")
override fun onScanResult(
callbackType: Int, result: ScanResult
) {
super.onScanResult(callbackType, result)
val device = result.device
if (device?.name == null) return;
scan?.apply {
scanReturn(device.name, device)
}
Log.i("scanned ble", " ${device.name}")
}
override fun onBatchScanResults(results: List<ScanResult>) {}
override fun onScanFailed(errorCode: Int) {}
}
fun setCallBack(scan: Scan) {
this.scan = scan
}
@SuppressLint("MissingPermission")
@RequiresApi(Build.VERSION_CODES.M)
fun initScan(context: Context) {
context.apply {
val settings: ScanSettings = ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).build()
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
bluetoothAdapter = bluetoothManager.adapter
leScanner = bluetoothAdapter!!.bluetoothLeScanner
leScanner.startScan(null, settings, leScanCallback)
}
}
@SuppressLint("MissingPermission")
fun stopScan() {
leScanner.stopScan(leScanCallback)
}
}

@ -1,21 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg
import com.cloud.diplomaticquarterapp.check_me_pro.ble.constant.BTConstant
import com.cloud.diplomaticquarterapp.utils.CRCUtils
import kotlin.experimental.inv
class EndReadPkg {
var buf: ByteArray = ByteArray(BTConstant.COMMON_PKG_LENGTH)
init {
// TODO Auto-generated constructor stub
buf[0] = 0xAA.toByte()
buf[1] = BTConstant.CMD_WORD_END_READ
buf[2] = BTConstant.CMD_WORD_END_READ.inv()
buf[3] = 0 //Package number, the default is 0
buf[4] = 0
buf[5] = 0 //data chunk size, the default is 0
buf[6] = 0
buf[buf.size - 1] = CRCUtils.calCRC8(buf)
}
}

@ -1,21 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg
import com.cloud.diplomaticquarterapp.check_me_pro.ble.constant.BTConstant
import com.cloud.diplomaticquarterapp.utils.CRCUtils
import kotlin.experimental.inv
class GetDeviceInfoPkg() {
val buf: ByteArray = ByteArray(BTConstant.COMMON_PKG_LENGTH)
init {
buf[0] = 0xAA.toByte()
buf[1] = BTConstant.CMD_WORD_GET_INFO
buf[2] = BTConstant.CMD_WORD_GET_INFO.inv()
buf[3] = 0.toByte() //Package number
buf[4] = 0.toByte()
buf[5] = 0.toByte()
buf[6] = 0.toByte()
buf[buf.size - 1] = CRCUtils.calCRC8(buf)
}
}

@ -1,19 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg
import com.cloud.diplomaticquarterapp.check_me_pro.ble.constant.BTConstant
import com.cloud.diplomaticquarterapp.utils.CRCUtils
import kotlin.experimental.inv
class ReadContentPkg(pkgNum: Int) {
val buf: ByteArray = ByteArray(BTConstant.COMMON_PKG_LENGTH)
init {
buf[0] = 0xAA.toByte()
buf[1] = BTConstant.CMD_WORD_READ_CONTENT
buf[2] = BTConstant.CMD_WORD_READ_CONTENT.inv()
buf[3] = pkgNum.toByte() //Package number
buf[4] = (pkgNum shr 8).toByte()
buf[5] = 0 //data chunk size, the default is 0
buf[6] = 0
buf[buf.size - 1] = CRCUtils.calCRC8(buf)
}
}

@ -1,23 +0,0 @@
package com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg
import com.cloud.diplomaticquarterapp.check_me_pro.ble.constant.BTConstant
import com.cloud.diplomaticquarterapp.utils.CRCUtils
import kotlin.experimental.inv
class StartReadPkg(fileName: String?) {
val buf: ByteArray = ByteArray(BTConstant.COMMON_PKG_LENGTH + fileName!!.length + 1)
init {
buf[0] = (0xAA).toByte()
buf[1] = BTConstant.CMD_WORD_START_READ
buf[2] = BTConstant.CMD_WORD_START_READ.inv()
buf[3] = 0 //Package number, the default is 0
buf[4] = 0
buf[5] = (buf.size - BTConstant.COMMON_PKG_LENGTH).toByte() //data chunk size
buf[6] = (buf.size - BTConstant.COMMON_PKG_LENGTH shr 8).toByte()
val tempFileName = fileName!!.toCharArray()
for (i in tempFileName.indices) {
buf[i + 7] = tempFileName[i].toByte()
}
buf[buf.size - 1] = CRCUtils.calCRC8(buf)
}
}

@ -1,224 +0,0 @@
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
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.ReadContentPkg
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.StartReadPkg
import com.cloud.diplomaticquarterapp.utils.CRCUtils
import com.cloud.diplomaticquarterapp.utils.Constant
import com.cloud.diplomaticquarterapp.utils.add
import com.cloud.diplomaticquarterapp.utils.toUInt
import com.google.gson.Gson
import io.flutter.plugin.common.EventChannel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import no.nordicsemi.android.ble.data.Data
import java.io.File
import kotlin.experimental.inv
class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
private var pool: ByteArray? = null
private val deviceChannel = Channel<DeviceInfo>(Channel.CONFLATED)
private val fileChannel = Channel<Int>(Channel.CONFLATED)
private val connectChannel = Channel<String>(Channel.CONFLATED)
private var myBleDataManager: BleDataManager? = null
private val dataScope = CoroutineScope(Dispatchers.IO)
private val mutex = Mutex()
private var cmdState = 0;
var pkgTotal = 0;
var currentPkg = 0;
var fileData: ByteArray? = null
var currentFileName = ""
var result = 1;
var currentFileSize = 0
companion object {
val fileProgressChannel = Channel<FileProgress>(Channel.CONFLATED)
}
data class FileProgress(
var name: String = "", var progress: Int = 0, var success: Boolean = false
)
private val comeData = object : BleDataManager.OnNotifyListener {
override fun onNotify(device: BluetoothDevice?, data: Data?) {
data?.value?.apply {
pool = add(pool, this)
}
pool?.apply {
pool = handleDataPool(pool)
}
}
}
val gson = Gson()
private fun handleDataPool(bytes: ByteArray?): ByteArray? {
val bytesLeft: ByteArray? = bytes
if (bytes == null || bytes.size < 8) {
return bytes
}
loop@ for (i in 0 until bytes.size - 7) {
if (bytes[i] != 0x55.toByte() || bytes[i + 1] != bytes[i + 2].inv()) {
continue@loop
}
// need content length
val len = toUInt(bytes.copyOfRange(i + 5, i + 7))
if (i + 8 + len > bytes.size) {
continue@loop
}
val temp: ByteArray = bytes.copyOfRange(i, i + 8 + len)
if (temp.last() == CRCUtils.calCRC8(temp)) {
if (cmdState in 1..3) {
val bleResponse = CheckMeResponse(temp)
if (cmdState == 1) {
currentFileSize = toUInt(bleResponse.content)
pkgTotal = currentFileSize / 512
if (bleResponse.cmd == 1) {
result = 1
val pkg = EndReadPkg()
sendCmd(pkg.buf)
cmdState = 3
} else if (bleResponse.cmd == 0) {
val pkg = ReadContentPkg(currentPkg)
sendCmd(pkg.buf)
currentPkg++
cmdState = 2;
}
} else if (cmdState == 2) {
bleResponse.content.apply {
fileData = add(fileData, this)
fileData?.let {
dataScope.launch {
fileProgressChannel.send(
FileProgress(
currentFileName, it.size * 100 / currentFileSize, true
)
)
}
}
}
if (currentPkg > pkgTotal) {
fileData?.apply {
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)
currentPkg++
}
} else if (cmdState == 3) {
fileData = null
currentPkg = 0
cmdState = 0
dataScope.launch {
fileProgressChannel.send(
FileProgress(
currentFileName, 100, result == 0
)
)
fileChannel.send(result)
}
}
} else if (cmdState == 4) {
val deviceInfo = DeviceInfo(temp)
val json = deviceInfo.json
var s: String = ""
for (k in json.keys()) {
s += "$k: "
s += "${json.get(k)} "
}
val returnData = mapOf("type" to "infoDataCheckMe", "data" to gson.toJson(json))
updateEventSink(returnData)
}
val tempBytes: ByteArray? = if (i + 8 + len == bytes.size) null else bytes.copyOfRange(
i + 8 + len, bytes.size
)
return handleDataPool(tempBytes)
}
}
return bytesLeft
}
private fun sendCmd(bs: ByteArray) {
myBleDataManager?.sendCmd(bs)
}
fun initWorker(context: Context, bluetoothDevice: BluetoothDevice?) {
myBleDataManager = BleDataManager(context)
myBleDataManager?.setNotifyListener(comeData)
bluetoothDevice?.let {
myBleDataManager?.connect(it)?.useAutoConnect(false)?.retry(150, 100)?.done {
dataScope.launch {
connectChannel.send("yes")
}
}?.enqueue()
}
}
suspend fun waitConnect() {
connectChannel.receive()
}
suspend fun getFile(name: String): Int {
mutex.withLock {
this.currentFileName = name
cmdState = 1
val pkg = StartReadPkg(name)
Log.i("----- Current PKG -----", pkg.buf.toString());
sendCmd(pkg.buf)
return fileChannel.receive()
}
}
private fun getDeviceInfo() {
cmdState = 4
val pkg = GetDeviceInfoPkg()
sendCmd(pkg.buf)
}
fun disconnect() {
myBleDataManager?.disconnect()?.enqueue()
}
}

@ -6,10 +6,11 @@ import android.content.Intent
import android.net.*
import android.net.wifi.*
import android.os.Build
import android.os.PatternMatcher
import android.provider.Settings
import android.util.Log
import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.MainActivity
import com.ejada.hmg.MainActivity
import com.ejada.hmg.utils.HMGUtils

@ -2,7 +2,7 @@ package com.ejada.hmg.hmgwifi
import android.annotation.SuppressLint
import com.ejada.hmg.utils.API
import com.cloud.diplomaticquarterapp.MainActivity
import com.ejada.hmg.MainActivity
import com.github.kittinunf.fuel.core.extensions.jsonBody
import com.github.kittinunf.fuel.httpGet
import com.github.kittinunf.fuel.httpPost

@ -7,7 +7,7 @@ import android.net.wifi.*
import android.net.wifi.SupplicantState.ASSOCIATED
import android.net.wifi.SupplicantState.COMPLETED
import android.util.Log
import com.cloud.diplomaticquarterapp.MainActivity
import com.ejada.hmg.MainActivity
import com.ejada.hmg.utils.HMGUtils
class WPA(mainActivity: MainActivity, SSID:String) {

@ -12,8 +12,9 @@ import android.net.wifi.SupplicantState.COMPLETED
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.MainActivity
import com.ejada.hmg.MainActivity
import com.ejada.hmg.utils.HMGUtils
import java.security.cert.X509Certificate
class WpaEnterprise(private val mainActivity: MainActivity, private var SSID: String) {
private var TAG = "WpaEnterprise"

@ -0,0 +1,13 @@
package com.cloud.diplomaticquarterapp.penguin
enum class PenguinMethod {
// initializePenguin("initializePenguin"),
// configurePenguin("configurePenguin"),
// showPenguinUI("showPenguinUI"),
// onPenNavUIDismiss("onPenNavUIDismiss"),
// onReportIssue("onReportIssue"),
// onPenNavSuccess("onPenNavSuccess"),
onPenNavInitializationError // onLocationOffCampus("onLocationOffCampus"),
// navigateToPOI("navigateToPOI"),
// openSharedLocation("openSharedLocation");
}

@ -0,0 +1,97 @@
package com.cloud.diplomaticquarterapp.penguin
import android.content.Context
import com.google.gson.Gson
import com.peng.pennavmap.PlugAndPlaySDK
import com.peng.pennavmap.connections.ApiController
import com.peng.pennavmap.interfaces.RefIdDelegate
import com.peng.pennavmap.models.TokenModel
import com.peng.pennavmap.models.postmodels.PostToken
import com.peng.pennavmap.utils.AppSharedData
import okhttp3.ResponseBody
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import android.util.Log
class PenguinNavigator() {
fun navigateTo(mContext: Context, refID: String, delegate: RefIdDelegate,clientID : String,clientKey : String ) {
val postToken = PostToken(clientID, clientKey)
getToken(mContext, postToken, object : RefIdDelegate {
override fun onRefByIDSuccess(PoiId: String?) {
Log.e("navigateTo", "PoiId is+++++++ $PoiId")
PlugAndPlaySDK.navigateTo(mContext, refID, object : RefIdDelegate {
override fun onRefByIDSuccess(PoiId: String?) {
Log.e("navigateTo", "PoiId 2is+++++++ $PoiId")
delegate.onRefByIDSuccess(refID)
}
override fun onGetByRefIDError(error: String?) {
delegate.onRefByIDSuccess(error)
}
})
}
override fun onGetByRefIDError(error: String?) {
delegate.onRefByIDSuccess(error)
}
})
}
fun getToken(mContext: Context, postToken: PostToken?, apiTokenCallBack: RefIdDelegate) {
try {
// Create the API call
val purposesCall: Call<ResponseBody> = ApiController.getInstance(mContext)
.apiMethods
.getToken(postToken)
// Enqueue the call for asynchronous execution
purposesCall.enqueue(object : Callback<ResponseBody?> {
override fun onResponse(
call: Call<ResponseBody?>,
response: Response<ResponseBody?>
) {
if (response.isSuccessful() && response.body() != null) {
try {
response.body()?.use { responseBody ->
val responseBodyString: String = responseBody.string() // Use `string()` to get the actual response content
if (responseBodyString.isNotEmpty()) {
val tokenModel = Gson().fromJson(responseBodyString, TokenModel::class.java)
if (tokenModel != null && tokenModel.token != null) {
AppSharedData.apiToken = tokenModel.token
apiTokenCallBack.onRefByIDSuccess(tokenModel.token)
} else {
apiTokenCallBack.onGetByRefIDError("Failed to parse token model")
}
} else {
apiTokenCallBack.onGetByRefIDError("Response body is empty")
}
}
} catch (e: Exception) {
apiTokenCallBack.onGetByRefIDError("An error occurred: ${e.message}")
}
} else {
apiTokenCallBack.onGetByRefIDError("Unsuccessful response: " + response.code())
}
}
override fun onFailure(call: Call<ResponseBody?>, t: Throwable) {
apiTokenCallBack.onGetByRefIDError(t.message)
}
})
} catch (error: Exception) {
apiTokenCallBack.onGetByRefIDError("Exception during API call: $error")
}
}
}

@ -0,0 +1,321 @@
package com.cloud.diplomaticquarterapp.penguin
import android.app.Activity
import android.content.Context
import android.content.Context.RECEIVER_EXPORTED
import android.content.IntentFilter
import android.graphics.Color
import android.os.Build
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.RelativeLayout
import android.widget.Toast
import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.PermissionManager.PermissionHelper
import com.cloud.diplomaticquarterapp.PermissionManager.PermissionManager
import com.cloud.diplomaticquarterapp.PermissionManager.PermissionResultReceiver
import com.ejada.hmg.MainActivity
import com.peng.pennavmap.PlugAndPlayConfiguration
import com.peng.pennavmap.PlugAndPlaySDK
import com.peng.pennavmap.enums.InitializationErrorType
import com.peng.pennavmap.interfaces.PenNavUIDelegate
import com.peng.pennavmap.utils.Languages
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.platform.PlatformView
import com.cloud.diplomaticquarterapp.penguin.PenguinNavigator
import com.peng.pennavmap.interfaces.PIEventsDelegate
import com.peng.pennavmap.interfaces.PILocationDelegate
import com.peng.pennavmap.interfaces.RefIdDelegate
import com.peng.pennavmap.models.PIReportIssue
/**
* Custom PlatformView for displaying Penguin UI components within a Flutter app.
* Implements `PlatformView` for rendering the view, `MethodChannel.MethodCallHandler` for handling method calls,
* and `PenNavUIDelegate` for handling SDK events.
*/
@RequiresApi(Build.VERSION_CODES.O)
internal class PenguinView(
context: Context,
id: Int,
val creationParams: Map<String, Any>,
messenger: BinaryMessenger,
activity: MainActivity,
val channel: MethodChannel
) : PlatformView, MethodChannel.MethodCallHandler, PenNavUIDelegate {
// The layout for displaying the Penguin UI
private val mapLayout: RelativeLayout = RelativeLayout(context)
private val _context: Context = context
private val permissionResultReceiver: PermissionResultReceiver
private val permissionIntentFilter = IntentFilter("PERMISSION_RESULT_ACTION")
private companion object {
const val PERMISSIONS_REQUEST_CODE = 1
}
private lateinit var permissionManager: PermissionManager
// Reference to the main activity
private var _activity: Activity = activity
private lateinit var mContext: Context
lateinit var navigator: PenguinNavigator
init {
// Set layout parameters for the mapLayout
mapLayout.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
)
mContext = context
permissionResultReceiver = PermissionResultReceiver { granted ->
if (granted) {
onPermissionsGranted()
} else {
onPermissionsDenied()
}
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
mContext.registerReceiver(
permissionResultReceiver,
permissionIntentFilter,
RECEIVER_EXPORTED
)
} else {
mContext.registerReceiver(
permissionResultReceiver,
permissionIntentFilter,
)
}
// Set the background color of the layout
mapLayout.setBackgroundColor(Color.RED)
permissionManager = PermissionManager(
context = mContext,
listener = object : PermissionManager.PermissionListener {
override fun onPermissionGranted() {
// Handle permissions granted
onPermissionsGranted()
}
override fun onPermissionDenied() {
// Handle permissions denied
onPermissionsDenied()
}
},
requestCode = PERMISSIONS_REQUEST_CODE,
*PermissionHelper.getRequiredPermissions()
)
if (!permissionManager.arePermissionsGranted()) {
permissionManager.requestPermissions(_activity)
} else {
// Permissions already granted
permissionManager.listener.onPermissionGranted()
}
}
private fun onPermissionsGranted() {
// Handle the actions when permissions are granted
Log.d("PermissionsResult", "onPermissionsGranted")
// Register the platform view factory for creating custom views
// Initialize the Penguin SDK
initPenguin()
}
private fun onPermissionsDenied() {
// Handle the actions when permissions are denied
Log.d("PermissionsResult", "onPermissionsDenied")
}
/**
* Returns the view associated with this PlatformView.
*
* @return The main view for this PlatformView.
*/
override fun getView(): View {
return mapLayout
}
/**
* Cleans up resources associated with this PlatformView.
*/
override fun dispose() {
// Cleanup code if needed
}
/**
* Handles method calls from Dart code.
*
* @param call The method call from Dart.
* @param result The result callback to send responses back to Dart.
*/
override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
// Handle method calls from Dart code here
}
/**
* Initializes the Penguin SDK with custom configuration and delegates.
*/
private fun initPenguin() {
navigator = PenguinNavigator()
// Configure the PlugAndPlaySDK
val language = when (creationParams["languageCode"] as String) {
"ar" -> Languages.ar
"en" -> Languages.en
else -> {
Languages.en
}
}
Log.d(
"TAG",
"initPenguin: ${Languages.getLanguageEnum(creationParams["languageCode"] as String)}"
)
PlugAndPlaySDK.configuration = PlugAndPlayConfiguration.Builder()
.setBaseUrl(
creationParams["dataURL"] as String,
creationParams["positionURL"] as String
)
.setServiceName(
creationParams["dataServiceName"] as String,
creationParams["positionServiceName"] as String
)
.setClientData(
creationParams["clientID"] as String,
creationParams["clientKey"] as String
)
.setUserName(creationParams["username"] as String)
// .setLanguageID(Languages.en)
.setLanguageID(language)
.setSimulationModeEnabled(creationParams["isSimulationModeEnabled"] as Boolean)
.setEnableBackButton(true)
// .setDeepLinkData("deeplink")
.setCustomizeColor("#2CA0AF")
.setDeepLinkSchema("")
.setIsEnableReportIssue(true)
.build()
// Set location delegate to handle location updates
// PlugAndPlaySDK.setPiLocationDelegate {
// Example code to handle location updates
// Uncomment and modify as needed
// if (location.size() > 0)
// Toast.makeText(_context, "Location Info Latitude: ${location[0]}, Longitude: ${location[1]}", Toast.LENGTH_SHORT).show()
// }
// Set events delegate for reporting issues
// PlugAndPlaySDK.setPiEventsDelegate(new PIEventsDelegate() {
// @Override
// public void onReportIssue(PIReportIssue issue) {
// Log.e("Issue Reported: ", issue.getReportType());
// }
// // Implement issue reporting logic here }
// @Override
// public void onSharedLocation(String link) {
// // Implement Shared location logic here
// }
// })
// Start the Penguin SDK
PlugAndPlaySDK.start(mContext, this)
}
/**
* Navigates to the specified reference ID.
*
* @param refID The reference ID to navigate to.
*/
fun navigateTo(refID: String) {
try {
if (refID.isBlank()) {
Log.e("navigateTo", "Invalid refID: The reference ID is blank.")
}
// referenceId = refID
navigator.navigateTo(mContext, refID,object : RefIdDelegate {
override fun onRefByIDSuccess(PoiId: String?) {
Log.e("navigateTo", "PoiId is penguin view+++++++ $PoiId")
// channelFlutter.invokeMethod(
// PenguinMethod.navigateToPOI.name,
// "navigateTo Success"
// )
}
override fun onGetByRefIDError(error: String?) {
Log.e("navigateTo", "error is penguin view+++++++ $error")
// channelFlutter.invokeMethod(
// PenguinMethod.navigateToPOI.name,
// "navigateTo Failed: Invalid refID"
// )
}
} , creationParams["clientID"] as String, creationParams["clientKey"] as String )
} catch (e: Exception) {
Log.e("navigateTo", "Exception occurred during navigation: ${e.message}", e)
// channelFlutter.invokeMethod(
// PenguinMethod.navigateToPOI.name,
// "Failed: Exception - ${e.message}"
// )
}
}
/**
* Called when Penguin UI setup is successful.
*
* @param warningCode Optional warning code received from the SDK.
*/
override fun onPenNavSuccess(warningCode: String?) {
val clinicId = creationParams["clinicID"] as String
if(clinicId.isEmpty()) return
navigateTo(clinicId)
}
/**
* Called when there is an initialization error with Penguin UI.
*
* @param description Description of the error.
* @param errorType Type of initialization error.
*/
override fun onPenNavInitializationError(
description: String?,
errorType: InitializationErrorType?
) {
val arguments: Map<String, Any?> = mapOf(
"description" to description,
"type" to errorType?.name
)
channel.invokeMethod(PenguinMethod.onPenNavInitializationError.name, arguments)
Toast.makeText(mContext, "Navigation Error: $description", Toast.LENGTH_SHORT).show()
}
/**
* Called when Penguin UI is dismissed.
*/
override fun onPenNavUIDismiss() {
// Handle UI dismissal if needed
try {
mContext.unregisterReceiver(permissionResultReceiver)
dispose();
} catch (e: IllegalArgumentException) {
Log.e("PenguinView", "Receiver not registered: $e")
}
}
}

@ -1,106 +0,0 @@
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.cloud.diplomaticquarterapp.smart_ring_2301.BleManager
import com.cloud.diplomaticquarterapp.smart_ring_2301.BleService
import com.cloud.diplomaticquarterapp.smart_ring_2301.Util.BleData
import com.cloud.diplomaticquarterapp.smart_ring_2301.Util.RxBus
import com.jstyle.blesdk2301.Util.BleSDK.DataParsingWithData
import com.jstyle.blesdk2301.callback.DataListener2301
import com.jstyle.blesdk2301.constant.DeviceKey
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import javax.annotation.Nullable
open class BaseActivity : AppCompatActivity(), DataListener2301 {
private var subscription: Disposable? = null
public override fun onCreate(@Nullable savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// subscribeForSmartRingEvents()
}
protected open fun subscribeForSmartRingEvents() {
subscription = RxBus.instance.toObservable(BleData::class.java).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe { bleData ->
val action = bleData.action
if (action == BleService.ACTION_DATA_AVAILABLE) {
val value = bleData.value
if (value != null) {
DataParsingWithData(value, this@BaseActivity)
}
}
}
}
protected fun unSubscribe(disposable: Disposable?) {
if (disposable != null && !disposable.isDisposed) {
disposable.dispose()
}
}
protected override fun onDestroy() {
super.onDestroy()
unSubscribe(subscription)
}
protected fun Baseunsubscribe() {
unSubscribe(subscription)
}
protected fun Gateaus(count: Int) {}
override fun dataCallback(maps: Map<String?, Any?>?) {
Log.e("info", maps.toString())
}
override fun dataCallback(value: ByteArray?) {
}
/**
* 当蓝牙设备是连接的状态发送指令给设备
* When the Bluetooth device is connected, send instructions to the device
* @param value
*/
protected fun sendValue(value: ByteArray?) {
if (value == null) return
BleManager.instance?.writeValue(value)
}
protected fun showToast(text: String?) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}
protected fun getEnd(maps: Map<String?, Any?>): Boolean {
return maps[DeviceKey.End] as Boolean
}
protected fun offerData(value: ByteArray?) {
BleManager.instance?.offerValue(value)
}
protected fun offerData() {
BleManager.instance?.writeValue()
}
companion object {
@JvmStatic
protected fun getDataType(maps: Map<String?, Any?>?): String? {
return if (null == maps) {
""
} else maps[DeviceKey.DataType] as String?
}
@JvmStatic
protected fun getData(maps: Map<String?, Any?>): Map<String, String>? {
return maps[DeviceKey.Data] as Map<String, String>?
}
}
}

@ -1,235 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301
import android.annotation.SuppressLint
import android.annotation.TargetApi
import android.app.Service
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.bluetooth.le.ScanCallback
import android.bluetooth.le.ScanResult
import android.bluetooth.le.ScanSettings
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.Build
import android.os.IBinder
import android.text.TextUtils
import com.jstyle.blesdk2301.callback.BleConnectionListener
import com.jstyle.blesdk2301.callback.OnScanResults
import com.jstyle.blesdk2301.model.Device
import java.util.Locale
/**
* 蓝牙管理类 Bluetooth management class
*/
@SuppressLint("MissingPermission")
class BleManager private constructor(var context: Context) {
private var address: String? = null
private var bleService: BleService? = null
private val serviceConnection: ServiceConnection = object : ServiceConnection {
override fun onServiceDisconnected(name: ComponentName) { // TODO Auto-generated method stub
bleService = null
}
override fun onServiceConnected(name: ComponentName, service: IBinder) {
bleService = (service as BleService.LocalBinder).service
if (!TextUtils.isEmpty(address)) {
bleService!!.initBluetoothDevice(address, context, NeedReconnect1, bleConnectionListener1)
}
}
}
private var serviceIntent: Intent? = null
var bluetoothAdapter: BluetoothAdapter?
val isBleEnable: Boolean
get() = bluetoothAdapter!!.enable()
/**
* 连接蓝牙设备
* Connect Bluetooth device
*
* @param address
*/
protected var NeedReconnect1 = true
protected var bleConnectionListener1: BleConnectionListener? = null
fun connectDevice(address: String?, NeedReconnect: Boolean, bleConnectionListener: BleConnectionListener?) {
NeedReconnect1 = NeedReconnect
bleConnectionListener1 = bleConnectionListener
if (!bluetoothAdapter!!.isEnabled || TextUtils.isEmpty(address) || isConnected) return
if (bleService == null) {
this.address = address
} else {
bleService!!.initBluetoothDevice(address, context, NeedReconnect, bleConnectionListener)
}
}
/**
* 关闭蓝牙服务通知
* Turn off Bluetooth service notification
*/
fun enableNotifaction() {
if (bleService == null) return
bleService!!.setCharacteristicNotification(true)
}
/**
* 写入指令到蓝牙设备
* Write command to Bluetooth device
*/
fun writeValue(value: ByteArray?) {
if (bleService == null || instance == null) return
bleService!!.writeValue(value)
}
/**
* 多条指令同时添加后发送到设备
* Multiple instructions are added at the same time and sent to the device
*
* @param data
*/
fun offerValue(data: ByteArray?) {
if (bleService == null) return
if (data != null) {
bleService!!.offerValue(data)
}
}
/**
* 写入指令到蓝牙设备
* Write command to Bluetooth device
*/
fun writeValue() {
if (bleService == null) return
bleService!!.nextQueue()
}
/**
* 断开设备 Disconnect the device
*/
fun disconnectDevice() {
if (bleService == null) return
bleService!!.disconnect()
}
val isConnected: Boolean
/**
* 查询设备是否已经连接
* Query whether the device is connected
*
* @return
*/
get() = if (bleService == null) false else bleService!!.isConnected
/**
* 取消扫描设备
* Cancel scanning device
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
fun StopDeviceScan() {
isinScan = false
if (null != bluetoothAdapter && null != bluetoothAdapter!!.bluetoothLeScanner) {
bluetoothAdapter!!.bluetoothLeScanner.stopScan(scanCallback)
}
}
/**
* 扫描蓝牙设备,用于开始绑定设备
* Scan Bluetooth device to start binding device
*/
private var DevicesName: Array<String>? = null
private var onScanResult: OnScanResults? = null
private var isinScan = false
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
fun DeviceScanResults(Devicesname: Array<String>, onScanResults: OnScanResults) {
if (!isinScan && instance!!.isBleEnable) { //如果蓝牙开关是开启的就进行扫描
isinScan = true
DevicesName = Devicesname
onScanResult = onScanResults
//返回已配对设备
//获得已配对的远程蓝牙设备的集合
val devices = bluetoothAdapter!!.bondedDevices
if (devices.size > 0) {
for (bluetoothDevice in devices) {
if (Canctians(bluetoothDevice.name.lowercase(Locale.getDefault()))) {
val device = Device()
device.bluetoothDevice = bluetoothDevice
device.isIsconted = false
device.isPaired = true
device.isIsdfu = bluetoothDevice.name.lowercase(Locale.getDefault()).contains("dfu")
device.name = bluetoothDevice.name
device.mac = bluetoothDevice.address
onScanResult!!.Success(device)
}
}
}
bluetoothAdapter!!.bluetoothLeScanner.startScan(null, ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build(), scanCallback)
}
}
private val scanCallback: ScanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
super.onScanResult(callbackType, result)
val deviceName = result.device.name
if (isinScan && !TextUtils.isEmpty(deviceName) && Canctians(deviceName.lowercase(Locale.getDefault()).trim { it <= ' ' })) {
val device = Device()
device.bluetoothDevice = result.device
device.isIsconted = false
device.isPaired = false
device.isIsdfu = deviceName.lowercase(Locale.getDefault()).contains("dfu")
device.name = result.device.name
device.mac = result.device.address
device.riss = result.rssi
onScanResult!!.Success(device)
}
}
override fun onBatchScanResults(results: List<ScanResult>) {
super.onBatchScanResults(results)
}
override fun onScanFailed(errorCode: Int) {
super.onScanFailed(errorCode)
onScanResult!!.Fail(errorCode)
}
}
init {
if (serviceIntent == null) {
serviceIntent = Intent(context, BleService::class.java)
context.bindService(serviceIntent, serviceConnection, Service.BIND_AUTO_CREATE)
}
val bluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
bluetoothAdapter = bluetoothManager.adapter
}
private fun Canctians(name: String): Boolean {
var catian = false
if (null == DevicesName || DevicesName!!.size == 0) {
return false
} else {
for (devicesname in DevicesName!!) {
if (name.lowercase(Locale.getDefault()).contains(devicesname.lowercase(Locale.getDefault()))) {
catian = true
break
}
}
}
return catian
}
companion object {
var instance: BleManager? = null
private set
fun init(context: Context) {
if (instance != null) {
return
}
synchronized(BleManager::class.java) {
if (instance == null) {
instance = BleManager(context)
}
}
}
}
}

@ -1,11 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
/**
* Created by Administrator on 2017/4/11.
*/
class BleData {
var value: ByteArray? = null
var action: String? = null
var data: String? = null
}

@ -1,137 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
import android.os.Handler
import android.os.Looper
import java.util.concurrent.Executors
import java.util.concurrent.ScheduledExecutorService
import java.util.concurrent.TimeUnit
/**
* 计时器
*/
class CustomCountDownTimer(
//Millis since epoch when alarm should stop.
private var millisInFuture: Long, countDownInterval: Long,
tickListener: TimerTickListener
) {
//thread on which the callbacks will be called
private val mainThreadHandler = Handler(Looper.getMainLooper())
//listener interface which is to be implemented by the users of the count down timer
interface TimerTickListener {
/**
* Callback on each tick
*
* @param millisLeft time left in millisec for the timer to shutdown
*/
fun onTick(millisLeft: Long)
/**
* Callback to be invokded when timer's time finishes
*/
fun onFinish()
/**
* Callback to be invokded when timer is canceled
*/
fun onCancel()
}
/**
* Inner class which delegates the events to callbacks provided in the TimerTickListener
*/
private inner class TimerRunnable : Runnable {
override fun run() {
if (isCancelled) {
scheduler.shutdown()
mainThreadHandler.post { tickListener.onCancel() }
} else if (isPaused) {
} else {
stopTimeInFuture = stopTimeInFuture - countdownInterval
mainThreadHandler.post(object : Runnable {
val millisLeft = stopTimeInFuture
override fun run() {
if (millisLeft <= 0) {
tickListener.onFinish()
scheduler.shutdown()
} else {
tickListener.onTick(millisLeft)
}
}
})
}
}
}
//The interval in millis that the user receives callbacks
private val countdownInterval: Long
//the time at which timer is to stop
private var stopTimeInFuture: Long
//boolean representing if the timer was cancelled
var isCancelled = false
//boolean representing if the timer was paused
private var isPaused = false
//listener which listens to the timer events
private val tickListener: TimerTickListener
//scheduler which provides the thread to create timer
private val scheduler: ScheduledExecutorService
/**
* Constructor
*
* @param millisInFuture time in millisec for which timer is to run
* @param countDownInterval interval frequency in millisec at which the callback will be invoked
* @param tickListener implementation of TimerTickListener which provides callbacks code
*/
init {
stopTimeInFuture = millisInFuture
countdownInterval = countDownInterval
this.tickListener = tickListener
scheduler = Executors.newSingleThreadScheduledExecutor()
}
/**
* Start the countdown.
*/
@Synchronized
fun start() {
isCancelled = false
isPaused = false
scheduler.scheduleWithFixedDelay(
TimerRunnable(), countdownInterval, countdownInterval,
TimeUnit.MILLISECONDS
)
}
/**
* Cancels the countdown timer
*/
@Synchronized
fun cancel() {
isCancelled = true
}
@Synchronized
fun pause() {
isPaused = true
}
@Synchronized
fun resume() {
isPaused = false
}
fun extendTime(delta: Long) {
stopTimeInFuture = stopTimeInFuture + delta
millisInFuture = millisInFuture + delta
}
companion object {
const val TAG = "CustomCountDownTimer"
}
}

@ -1,504 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
import android.content.Context
import java.text.NumberFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
/**
* Created by Administrator on 2017/3/24.
*/
object DateUtil {
const val oneDayMillis = 24 * 60 * 60 * 1000L
private const val oneMinMillis = 60 * 1000L
const val Default_FormatString = "yy.MM.dd"
const val SHOW_FormatString = "MM-dd,yyyy"
val format = SimpleDateFormat("yy.MM.dd HH:mm:ss")
var defaultFormat = SimpleDateFormat(Default_FormatString)
const val DATA_MONTH_FormatString = "yy.MM"
const val DATA_Year_FormatString = "yyyy.M" //数据年日期
const val last_month = -1
const val this_month = 0
const val next_month = 1
const val nextWeek = 326
const val lastWeek = 396
/**
* 明天的日期
*/
fun getTomorrowDateString(today: String?): String {
val c = Calendar.getInstance()
c.timeInMillis = getDateLong(today) + oneDayMillis
return getDefaultFormatTime(c.time)
}
fun getDateString(today: String?, days: Int): String {
val c = Calendar.getInstance()
c.timeInMillis = getDateLong(today) - oneDayMillis * days
return getDefaultFormatTime(c.time)
}
/**
* 昨天的日期
*/
@Synchronized
fun getYesterdayDateString(today: String?): String {
val c = Calendar.getInstance()
c.timeInMillis = getDateLong(today) - oneDayMillis
return getDefaultFormatTime(c.time)
}
/**
* 获取指定格式的日期字符串
*
* @param time
* @param formatString
* @return
*/
@Synchronized
fun getFormatTimeString(time: Long, formatString: String?): String {
val format = SimpleDateFormat(formatString)
return format.format(Date(time))
}
@Synchronized
fun getFormatTimeString(time: Long): String {
return format.format(Date(time))
}
@Synchronized
fun getEcgFormatTimeString(time: Long): String {
val simpleDateFormat = SimpleDateFormat("yyyy.MM.dd HH:mm:ss")
return simpleDateFormat.format(Date(time))
}
@Synchronized
fun getEcgFormatTodayString(time: Long): String {
val simpleDateFormat = SimpleDateFormat("yyyy.MM.dd")
return simpleDateFormat.format(Date(time))
}
/**
* 获取默认格式日期字符串
*
* @return
*/
@Synchronized
fun getDefaultFormatTime(date: Date): String {
return getFormatTimeString(date.time, Default_FormatString)
}
/**字符串代表日期的毫秒数
* @param date
* @return
*/
@Synchronized
fun getDateLong(date: String?): Long {
var time: Long = 0
try {
val dates = defaultFormat.parse(date)
time = dates.time
} catch (e: Exception) {
// TODO: handle exception
}
return time
}
@Synchronized
fun getGpsDateLong(date: String?): Long {
var time: Long = 0
try {
val dates = format.parse(date)
time = dates.time
} catch (e: Exception) {
// TODO: handle exception
}
return time
}
/**字符串转date
* @param dateString
* @return
*/
fun String2Date(dateString: String?, formatString: String?): Date? {
val format = SimpleDateFormat(formatString)
var date: Date? = null
try {
date = format.parse(dateString)
} catch (e: ParseException) {
e.printStackTrace()
}
return date
}
fun getMonthString(thisMonth: String?, monthType: Int): String {
val calendar = Calendar.getInstance()
if (monthType != this_month) calendar.time = String2Date(thisMonth, DATA_MONTH_FormatString)
calendar.add(Calendar.MONTH, monthType)
return getFormatTimeString(calendar.timeInMillis, DATA_MONTH_FormatString)
}
fun getTodayWeek(time: Long): Array<String?> {
val format = SimpleDateFormat(Default_FormatString)
val week = arrayOfNulls<String>(7)
val calendar = Calendar.getInstance()
if (time != 0L) {
calendar.timeInMillis = time
}
setToFirstDay(calendar)
for (i in 0..6) {
week[i] = format.format(calendar.time)
calendar.add(Calendar.DATE, 1)
}
return week
}
private fun setToFirstDay(calendar: Calendar) {
while (calendar[Calendar.DAY_OF_WEEK] != Calendar.MONDAY) {
calendar.add(Calendar.DATE, -1)
}
}
fun getWeekString(time: String?, type: Int): Array<String?> {
val format = SimpleDateFormat(Default_FormatString)
var date: Date? = null
try {
date = format.parse(time)
} catch (e: Exception) {
// TODO: handle exception
}
val nowL = if (type == lastWeek) date!!.time - oneDayMillis else date!!.time + oneDayMillis
return getTodayWeek(nowL)
}
/**时间段在一天中的时间节点一分钟一点)
* @param time
* @param defaultTime
* @return
*/
fun get1MIndex(time: String?, defaultTime: String?): Int {
val format = SimpleDateFormat("yy.MM.dd HH:mm:ss")
var count = 0
try {
val date = format.parse(time)
val dateBase = format.parse(defaultTime)
val min = date.time - dateBase.time
count = (min / oneMinMillis).toInt()
} catch (e: Exception) {
// TODO: handle exception
}
return count
}
fun get1SIndex(time: String?, defaultTime: String?): Int {
val format = SimpleDateFormat("yy.MM.dd HH:mm:ss")
var count = 0
try {
val date = format.parse(time)
val dateBase = format.parse(defaultTime)
val min = date.time - dateBase.time
count = (min / 1000L).toInt()
} catch (e: Exception) {
// TODO: handle exception
}
return count
}
fun get5MIndex(time: String?, defaultTime: String?): Int {
val format = SimpleDateFormat("yy.MM.dd HH:mm:ss")
var count = 0
try {
val date = format.parse(time)
val dateBase = format.parse(defaultTime)
val min = date.time - dateBase.time
count = (min / (oneMinMillis * 5)).toInt()
} catch (e: Exception) {
// TODO: handle exception
}
return count
}
fun getMIndex(time: String?, defaultTime: String?, countMIN: Int): Int {
val format = SimpleDateFormat("yy.MM.dd HH:mm:ss")
var count = 0
try {
val date = format.parse(time)
val dateBase = format.parse(defaultTime)
val min = date.time - dateBase.time
count = (min / (oneMinMillis * countMIN)).toInt()
} catch (e: Exception) {
// TODO: handle exception
}
return count
}
@Synchronized
fun getHistoryTime(time: Long): String {
val defaultTime = getDateLong("00.01.01")
return getFormatTimeString(time * 1000 * 5 + defaultTime)
}
private const val TAG = "DateUtil"
@Synchronized
fun getDefaultLongMi(defaultTime: String?): Long {
var date = Date()
// SimpleDateFormat format = new SimpleDateFormat("yy.MM.dd HH:mm:ss");
// Log.i(TAG, "getDefaultLongMi: "+defaultTime);
try {
date = format.parse(defaultTime)
} catch (e: Exception) {
// Log.i(TAG, "getDefaultLongMi: "+e.getMessage());
}
return date.time
}
fun getSleepTime(minute: Int): String {
val hour = minute / 60
val min = minute % 60
return String.format("%1$02dh%2$02dmin", hour, min)
}
fun getActivityShowTime(minute: Int): String {
val hour = minute / 60
val min = minute % 60
return String.format("%1$02d:%2$02d", hour, min)
}
fun getSportTime(seconds: Int): String {
var hour = 0
var min = seconds / 60
var second = seconds % 60
if (min >= 60) {
hour = min / 60
min = min % 60
second = seconds - hour * 3600 - min * 60
}
return String.format("%1$02d:%2$02d:%3$02d", hour, min, second)
}
fun getExerciseListTotalTime(seconds: Int): String {
var hour = 0
var min = seconds / 60
// int second=seconds%60;
if (min >= 60) {
hour = min / 60
min = min % 60
//second = seconds - hour * 3600 - min * 60;
}
return String.format("%1$02dh%2$02dmin", hour, min)
}
fun getSportAxieTime(seconds: Int): String {
var hour = 0
var min = seconds / 60
var second = seconds % 60
if (min >= 60) {
hour = min / 60
min = min % 60
second = seconds - hour * 3600 - min * 60
}
return if (hour == 0) String.format("%1$02d:%2$02d", min, second) else String.format("%1$02d:%2$02d:%3$02d", hour, min, second)
}
fun getPaceTime(seconds: Int): String {
val min = seconds / 60
val second = seconds % 60
// if(min>60){
// hour=min/60;
// min=min%60;
// second = seconds - hour * 3600 - min * 60;
// }
return String.format("%1$02d'%2$02d\"", min, second)
}
fun getActivityTime(seconds: Int): String {
var hour = 0
var min = seconds / 60
var second = seconds % 60
if (min > 60) {
hour = min / 60
min = min % 60
second = seconds - hour * 3600 - min * 60
}
return if (hour == 0) String.format("%1$02d:%2$02d", min, second) else String.format("%1$02d:%2$02d:%3$02d", hour, min, second)
}
fun getPointSleepTime(minute: Float): String {
val nf = NumberFormat.getInstance()
nf.minimumFractionDigits = 2
return nf.format((minute / 60f).toDouble()) + "h"
}
fun getSleepTimeFloat(minute: Int): Float {
val hour = minute / 60
val min = minute % 60
return hour + min / 60f
}
/**时间点换成时间段
* @param count
* @return
*/
fun getCountTime(count: Int, defaultTime: String?): String {
val format = SimpleDateFormat("yy.MM.dd HH:mm:ss")
// String base = "00:00:00";
var time: Long = 0
try {
time = format.parse(defaultTime).time + count * oneMinMillis
} catch (e: Exception) {
// TODO: handle exception
}
return format.format(Date(time))
}
fun getSleepCountTime(count: Int, defaultTime: String?): String {
val format = SimpleDateFormat("yy.MM.dd HH:mm:ss")
// String base = "00:00:00";
var time: Long = 0
try {
time = format.parse(defaultTime).time + 5 * count * oneMinMillis
} catch (e: Exception) {
// TODO: handle exception
}
return format.format(Date(time))
}
val thisMonth: Array<String?>
get() {
val format = SimpleDateFormat("yy.MM.dd")
// String[] month = new String[3];
val cal_1 = Calendar.getInstance() // 获取当前日期
val max = cal_1.getActualMaximum(Calendar.DAY_OF_MONTH)
val month = arrayOfNulls<String>(max)
for (i in 1 until max + 1) {
cal_1[Calendar.DAY_OF_MONTH] = i
month[i - 1] = format.format(cal_1.time)
}
return month
}
fun getNextMonth(date: String?): Array<String?> {
val format = SimpleDateFormat("yy.MM.dd")
var dates: Date? = Date()
try {
dates = format.parse(date)
} catch (e: Exception) {
// TODO: handle exception
}
val cal_1 = Calendar.getInstance() // 获取当前日期
cal_1.time = dates
var months = cal_1[Calendar.MONTH]
var year = cal_1[Calendar.YEAR]
if (months == Calendar.DECEMBER) {
year++
months = Calendar.JANUARY
} else {
months++
}
cal_1[Calendar.YEAR] = year
cal_1[Calendar.MONTH] = months
val max = cal_1.getActualMaximum(Calendar.DAY_OF_MONTH)
val month = arrayOfNulls<String>(max)
for (i in 1 until max + 1) {
cal_1[Calendar.DAY_OF_MONTH] = i
month[i - 1] = format.format(cal_1.time)
}
// cal_1.set(Calendar.DAY_OF_MONTH,
// cal_1.getActualMaximum(Calendar.DAY_OF_MONTH));// 设置为1号,当前日期既为本月第一天
// month[1] = format.format(cal_1.getTime());
// month[2]=cal_1.getActualMaximum(Calendar.DAY_OF_MONTH)+"";
return month
}
fun getMonth(year: Int, month: Int): Array<String?> {
val format = SimpleDateFormat("yy.MM.dd")
val cal_1 = Calendar.getInstance() // 获取当前日期
cal_1[Calendar.YEAR] = year
cal_1[Calendar.MONTH] = month
val max = cal_1.getActualMaximum(Calendar.DAY_OF_MONTH)
val months = arrayOfNulls<String>(max)
for (i in 1 until max + 1) {
cal_1[Calendar.DAY_OF_MONTH] = i
months[i - 1] = format.format(cal_1.time)
}
return months
}
fun getLastMonth(date: String?): Array<String?> {
val format = SimpleDateFormat("yy.MM.dd")
var dates: Date? = Date()
try {
dates = format.parse(date)
} catch (e: Exception) {
// TODO: handle exception
}
val cal_1 = Calendar.getInstance() // 获取当前日期
cal_1.time = dates
var months = cal_1[Calendar.MONTH]
var year = cal_1[Calendar.YEAR]
if (months == Calendar.JANUARY) {
year--
months = Calendar.DECEMBER
} else {
months--
}
cal_1[Calendar.YEAR] = year
cal_1[Calendar.MONTH] = months
val max = cal_1.getActualMaximum(Calendar.DAY_OF_MONTH)
val month = arrayOfNulls<String>(max)
for (i in 1 until max + 1) {
cal_1[Calendar.DAY_OF_MONTH] = i
month[i - 1] = format.format(cal_1.time)
}
// 设置为1号,当前日期既为本月第一天
// cal_1.set(Calendar.DAY_OF_MONTH,
// cal_1.getActualMaximum(Calendar.DAY_OF_MONTH));// 设置为1号,当前日期既为本月第一天
// month[1] = format.format(cal_1.getTime());
return month
}
fun beforeData(lastTime: String?, bleTime: String?): Boolean {
var isBefore = false
try {
val lastDate = format.parse(lastTime)
val bleDate = format.parse(bleTime)
isBefore = lastDate.before(bleDate)
} catch (e: ParseException) {
e.printStackTrace()
}
return isBefore
}
fun getCountTime(count: Int): String {
val format = SimpleDateFormat("HH:mm")
val base = "12:00"
var time: Long = 0
try {
time = format.parse(base).time + count * 5 * 60 * 1000L
} catch (e: Exception) {
// TODO: handle exception
}
return format.format(Date(time))
}
fun getShowDate(context: Context, monthString: String?): String {
val locale = context.resources.configuration.locale
val language = locale.language
val time = getDateLong(monthString)
var format = ""
// if (language.equals("zh")) {
format = "yyyy-MM"
// } else {
// format = "MM-yyyy";
// }
return getFormatTimeString(time, format)
}
private val timestamp: String
private get() = (System.currentTimeMillis() / 1000).toString() + ""
}

@ -1,203 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
import android.app.Activity
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.graphics.PorterDuff
import android.util.AttributeSet
import android.util.DisplayMetrics
import android.util.Log
import android.view.SurfaceHolder
import android.view.SurfaceView
/**
* 自定义心电图
*
* @author manhongjie
*/
// public class EcgGraphicView<AttributeSet> extends View {
class EcgGraphicView(context: Context, attrs: AttributeSet?) : SurfaceView(context, attrs), SurfaceHolder.Callback, Runnable {
private val mSurfaceHolder: SurfaceHolder
private val mPaint: Paint
private val blackPaint: Paint? = null
private val wangge_Paint: Paint? = null
private val pixPaint: Paint? = null
private var mPath = Path()
// 屏幕的长<E79A84>?
private var SCREEN_WIDTH = 480f
//
private val POINT_LEN = 3000
private val rulerStartX = 0
// public float[] x = new float[POINT_LEN];
// public float[] y = new float[POINT_LEN];
// 数组中有3000个点
var x = FloatArray(POINT_LEN)
var y = FloatArray(POINT_LEN)
var scale = 0f
var x0 = 240f
var y0 = 192f
private val context: Context
var distanceY = 0f
private var isDrawing = false
private var mCanvas: Canvas? = null
// @Override
// public void onDraw(Canvas canvas) {
//
// float width = SCREEN_WIDTH;
// scale = 1;
//
// // String ruleStr = new String(scale * 10 + "mm/100mv");
// // 移动后的坐标
// makeFollowPathOne();
//
// // rulerStartX = SCREEN_WIDTH - 60;
// // 每列的间隔是32
// // int colomn = (int) (width / 32);
//
// // 画网格线行和<E8A18C>?
//
// // for (int i = 0; i <= 13; i++) {
// // canvas.drawLine(0, i * 32, width, i * 32, wangge_Paint);
// // }
// // for (int i = 0; i <= colomn; i++) {
// // canvas.drawLine(i * 32, 0, i * 32, 12 * 32, wangge_Paint);
// // }
//
// // 画标<E794BB>?
//
// // canvas.drawLine(rulerStartX + 0, 192, rulerStartX + 8, 192,
// // pixPaint);
// // canvas.drawLine(rulerStartX + 24, 192, rulerStartX + 32, 192,
// // pixPaint);
// // canvas.drawLine(rulerStartX + 8, 128, rulerStartX + 24, 128,
// // pixPaint);
// // canvas.drawLine(rulerStartX + 8, 128, rulerStartX + 8, 192,
// // pixPaint);
// // canvas.drawLine(rulerStartX + 24, 128, rulerStartX + 24, 192,
// // pixPaint);
//
// // 文本<E69687>?25mm/s 10.0mm/100mv
// // canvas.drawText(ruleStr, rulerStartX - 120, 40, pixPaint);
// // canvas.drawText("25mm/s", rulerStartX - 200, 40, pixPaint);
//
// canvas.drawPath(mPath, mPaint);
// }
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
// TODO Auto-generated method stub
if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) {
SCREEN_WIDTH = MeasureSpec.getSize(widthMeasureSpec).toFloat()
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}
//
fun makeFollowPathOne(canvas: Canvas) {
val height = height.toFloat()
val size = ecgValues.size
if (size == 0) return
mPath.reset()
val width = SCREEN_WIDTH / maxSize
val heightI = height / 16000
mPath.moveTo(0f, (8000 - ecgValues[0]) * heightI)
for (i in 1 until size - 1) {
canvas.drawPoint(i * width, (8000 - ecgValues[i]) * heightI, mPaint)
// mPath.lineTo(i * width, (8000 - ecgValues.get(i)) * heightI);
}
}
var ecgValues: MutableList<Int> = ArrayList()
var maxSize = 1516f
fun setValue(value: Int) {
if (ecgValues.size > maxSize) ecgValues.removeAt(0)
ecgValues.add(value)
}
fun clearData() {
ecgValues.clear()
}
fun setYDistance(distance: Float) {
distanceY = distance
}
override fun surfaceCreated(holder: SurfaceHolder) {
isDrawing = true
Thread(this).start()
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {}
override fun surfaceDestroyed(holder: SurfaceHolder) {
isDrawing = false
}
override fun run() {
while (isDrawing) {
drawing()
}
}
init {
// TODO Auto-generated constructor stub
// 分辨率矩<E78E87>?
val dm = DisplayMetrics()
// 取得窗口属<E58FA3>??
if (context is Activity) {
context.windowManager.defaultDisplay.getMetrics(dm)
SCREEN_WIDTH = dm.widthPixels.toFloat()
Log.d("EcgGraphicView", "width: $SCREEN_WIDTH")
}
mPath = Path()
// 画心电图的画<E79A84>?
mPaint = Paint(Paint.ANTI_ALIAS_FLAG)
mPaint.style = Paint.Style.STROKE
mPaint.strokeWidth = ScreenUtils.Companion.dip2px(context, 1f).toFloat()
mPaint.textSize = 2f
mPaint.color = Color.WHITE
this.context = context
// blackPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
// blackPaint.setStyle(Paint.Style.STROKE);
// blackPaint.setStrokeWidth(2);
// blackPaint.setTextSize(2);
// blackPaint.setColor(Color.RED);
// 网格线画<E7BABF>?
// wangge_Paint = new Paint(Paint.ANTI_ALIAS_FLAG);
// wangge_Paint.setStyle(Paint.Style.STROKE);
// wangge_Paint.setStrokeWidth(1.0f);
// wangge_Paint.setTextSize(0.5f);
// wangge_Paint.setColor(Color.parseColor("#000000"));
// pixPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
// pixPaint.setStyle(Paint.Style.FILL);
// pixPaint.setStrokeWidth(2.0f);
// pixPaint.setTextSize(20.0f);
// pixPaint.setColor(Color.RED);
mSurfaceHolder = holder
mSurfaceHolder.addCallback(this)
}
private fun drawing() {
try {
mCanvas = mSurfaceHolder.lockCanvas()
if (mCanvas == null) return
mCanvas!!.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
makeFollowPathOne(mCanvas!!)
// mCanvas.drawPath(mPath, mPaint);
} finally {
if (mCanvas != null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas)
}
}
}
companion object {
private const val TAG = "EcgGraphicView"
}
}

@ -1,248 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
import android.annotation.SuppressLint
import android.bluetooth.BluetoothDevice
import android.content.ContentResolver
import android.content.ContentUris
import android.content.Context
import android.database.Cursor
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.DocumentsContract
import android.provider.MediaStore
import android.text.TextUtils
import android.util.Log
import java.io.UnsupportedEncodingException
/**
* Created by Administrator on 2017/4/6.
*/
object ResolveData {
private const val TAG = "ResolveData"
private const val SHORTENED_LOCAL_NAME = 0x08
private const val COMPLETE_LOCAL_NAME = 0x09
private const val oneMinMillis = 60 * 1000L
var startString = " 12:00:00"
fun getBcd(value: String): Int {
return value.toInt(16)
}
fun decodeDeviceName(data: ByteArray): String? {
var name: String? = null
var fieldLength: Int
var fieldName: Int
val packetLength = data.size
var index = 0
while (index < packetLength) {
fieldLength = data[index].toInt()
if (fieldLength <= 0) break
fieldName = data[++index].toInt()
if (fieldName == COMPLETE_LOCAL_NAME
|| fieldName == SHORTENED_LOCAL_NAME
) {
name = decodeLocalName(data, index + 1, fieldLength - 1)
break
}
index += fieldLength - 1
index++
}
return name
}
@SuppressLint("MissingPermission")
@JvmStatic
fun decodeDeviceName(bluetoothDevice: BluetoothDevice, data: ByteArray): String? {
var name = bluetoothDevice.name
if (!TextUtils.isEmpty(name)) return name
var fieldLength: Int
var fieldName: Int
val packetLength = data.size
var index = 0
while (index < packetLength) {
fieldLength = data[index].toInt()
if (fieldLength <= 0) break
fieldName = data[++index].toInt()
if (fieldName == COMPLETE_LOCAL_NAME
|| fieldName == SHORTENED_LOCAL_NAME
) {
name = decodeLocalName(data, index + 1, fieldLength - 1)
break
}
index += fieldLength - 1
index++
}
return name
}
/**
* Decodes the local name
*/
fun decodeLocalName(
data: ByteArray?, start: Int,
length: Int
): String? {
return try {
kotlin.String()
} catch (e: UnsupportedEncodingException) {
Log.e(
"scan", "Unable to convert the complete local name to UTF-8",
e
)
null
} catch (e: IndexOutOfBoundsException) {
Log.e("scan", "Error when reading complete local name", e)
null
}
}
/**
* 转十六进制字符串
*
* @param data
* @return
*/
@JvmStatic
fun byte2Hex(data: ByteArray?): String {
if (data != null && data.size > 0) {
val sb = StringBuilder(data.size)
for (tmp in data) {
sb.append(String.format("%02X ", tmp))
}
return sb.toString()
}
return "no data"
}
fun getRealFilePath(context: Context, uri: Uri?): String? {
if (null == uri) return null
val scheme = uri.scheme
var data: String? = null
if (scheme == null) data = uri.path else if (ContentResolver.SCHEME_FILE == scheme) {
data = uri.path
} else if (ContentResolver.SCHEME_CONTENT == scheme) {
val cursor = context.contentResolver.query(uri, arrayOf(MediaStore.Images.ImageColumns.DATA), null, null, null)
if (null != cursor) {
if (cursor.moveToFirst()) {
val index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA)
if (index > -1) {
data = cursor.getString(index)
}
}
cursor.close()
}
}
return data
}
/**
* 专为Android4.4设计的从Uri获取文件绝对路径
*/
fun getPath(context: Context, uri: Uri): String? {
// DocumentProvider
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
val docId = DocumentsContract.getDocumentId(uri)
val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
val type = split[0]
if ("primary".equals(type, ignoreCase = true)) {
return Environment.getExternalStorageDirectory().toString() + "/" + split[1]
}
// TODO handle non-primary volumes
} else if (isDownloadsDocument(uri)) {
val id = DocumentsContract.getDocumentId(uri)
val contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)
)
return getDataColumn(context, contentUri, null, null)
} else if (isMediaDocument(uri)) {
val docId = DocumentsContract.getDocumentId(uri)
val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
val type = split[0]
var contentUri: Uri? = null
if ("image" == type) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
} else if ("video" == type) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
} else if ("audio" == type) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
}
val selection = "_id=?"
val selectionArgs = arrayOf(split[1])
return getDataColumn(context, contentUri, selection, selectionArgs)
}
} else if ("content".equals(uri.scheme, ignoreCase = true)) {
return getDataColumn(context, uri, null, null)
} else if ("file".equals(uri.scheme, ignoreCase = true)) {
return uri.path
}
return null
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context
* The context.
* @param uri
* The Uri to query.
* @param selection
* (Optional) Filter used in the query.
* @param selectionArgs
* (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
fun getDataColumn(
context: Context, uri: Uri?, selection: String?,
selectionArgs: Array<String>?
): String? {
var cursor: Cursor? = null
val column = "_data"
val projection = arrayOf(column)
try {
cursor = context.contentResolver.query(
uri!!, projection, selection, selectionArgs,
null
)
if (cursor != null && cursor.moveToFirst()) {
val column_index = cursor.getColumnIndexOrThrow(column)
return cursor.getString(column_index)
}
} finally {
cursor?.close()
}
return null
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
fun isExternalStorageDocument(uri: Uri): Boolean {
return "com.android.externalstorage.documents" == uri.authority
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
fun isDownloadsDocument(uri: Uri): Boolean {
return "com.android.providers.downloads.documents" == uri.authority
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
fun isMediaDocument(uri: Uri): Boolean {
return "com.android.providers.media.documents" == uri.authority
}
}

@ -1,34 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.processors.FlowableProcessor
import io.reactivex.rxjava3.processors.PublishProcessor
import io.reactivex.rxjava3.subjects.PublishSubject
import io.reactivex.rxjava3.subjects.Subject
/**
* Created by zhuge on 2017/1/19 0019.
*/
class RxBus private constructor() {
private val bus: Subject<Any>
private val mBus: FlowableProcessor<Any>
init {
mBus = PublishProcessor.create<Any>().toSerialized()
bus = PublishSubject.create<Any>().toSerialized()
}
fun post(`object`: Any) {
bus.onNext(`object`)
}
fun <T : Any> toObservable(eventType: Class<T>): Observable<T> {
return bus.ofType(eventType)
}
companion object {
val instance = RxBus()
}
}

@ -1,17 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.ObservableTransformer
import io.reactivex.rxjava3.schedulers.Schedulers
/**
* Created by Administrator on 2017/4/26.
*/
object SchedulersTransformer {
private const val TAG = "SchedulersTransformer"
fun <T : Any> io2MainObservable(): ObservableTransformer<T, T> {
return ObservableTransformer { upstream -> upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) }
}
}

@ -1,120 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Paint
import android.util.DisplayMetrics
import android.view.WindowManager
/**
* 获得屏幕相关的辅助类
*
*
*
*/
class ScreenUtils private constructor() {
init {
/* cannot be instantiated */
throw UnsupportedOperationException("cannot be instantiated")
}
companion object {
/**
* 获得屏幕高度
*
* @param context
* @return
*/
fun getScreenWidth(context: Context): Int {
val wm = context
.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val outMetrics = DisplayMetrics()
wm.defaultDisplay.getMetrics(outMetrics)
return outMetrics.widthPixels
}
/**
* 获得屏幕宽度
*
* @param context
* @return
*/
fun getScreenHeight(context: Context): Int {
val wm = context
.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val outMetrics = DisplayMetrics()
wm.defaultDisplay.getMetrics(outMetrics)
return outMetrics.heightPixels
}
/**
* 获得状态栏的高度
*
* @param context
* @return
*/
fun getStatusHeight(context: Context): Int {
var statusHeight = -1
try {
val clazz = Class.forName("com.android.internal.R\$dimen")
val `object` = clazz.newInstance()
val height = clazz.getField("status_bar_height")[`object`].toString().toInt()
statusHeight = context.resources.getDimensionPixelSize(height)
} catch (e: Exception) {
e.printStackTrace()
}
return statusHeight
}
/**
* 获取当前屏幕截图包含状态栏
*
* @param activity
* @return
*/
fun snapShotWithStatusBar(activity: Activity): Bitmap? {
val view = activity.window.decorView
view.isDrawingCacheEnabled = true
view.buildDrawingCache()
val bmp = view.drawingCache
val width = getScreenWidth(activity)
val height = getScreenHeight(activity)
var bp: Bitmap? = null
bp = Bitmap.createBitmap(bmp, 0, 0, width, height)
view.destroyDrawingCache()
return bp
}
/**
* 获取当前屏幕截图不包含状态栏
*
* @param activity
* @return
*/
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
fun dip2px(context: Context, dpValue: Float): Int {
val scale = context.resources.displayMetrics.density
return (dpValue * scale + 0.5f).toInt()
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
fun px2dip(context: Context, pxValue: Float): Int {
val scale = context.resources.displayMetrics.density
return (pxValue / scale + 0.5f).toInt()
}
fun sp2px(context: Context, spValue: Float): Int {
val scale = context.resources.displayMetrics.density
return (scale * spValue).toInt()
}
fun getFontHeight(paint: Paint): Float {
val fm = paint.fontMetrics
return fm.descent - fm.ascent
}
}
}

@ -1,93 +0,0 @@
package com.cloud.diplomaticquarterapp.smart_ring_2301.Util
import android.app.Activity
import android.content.Context
import android.content.SharedPreferences
object SharedPreferenceUtils {
const val KEY_REMIND_PSD = "REMIND_PSD"
const val KEY_account_type = "KEY_account_type"
const val KEY_countryCode = "KEY_countryCode"
const val KEY_TimeZone = "KEY_TimeZone"
const val KEY_DFU_ADDRESS = "KEY_DFU_ADDRESS"
const val KEY_Exercise_Mode = "KEY_Exercise_Mode"
const val KEY_Enable_ActivityClock = "KEY_Enable_ActivityClock"
const val KEY_UNIT_WEIGHT = "KEY_UNIT_WEIGHT"
const val KEY_UNIT_HEIGHT = "KEY_UNIT_HEIGHT"
const val KEY_RES_FILEPATH = "KEY_RES_FILEPATH"
const val KEY_Is_First = "KEY_Is_First"
const val KEY_From_Login = "KEY_From_Login"
const val KEY_PHONE = "PHONE"
const val KEY_UID = "uid"
const val KEY_PSD = "PSD"
const val KEY_ADDRESS = "ADDRESS"
const val KEY_Language = "Language"
const val KEY_LOGIN = "lOGIN"
const val KEY_NICKNAME = "nickname"
private const val spName = "jstyle_sleep"
const val KEY_AUTH_USERID = "KEY_AUTH_USERID"
const val KEY_highHeart = "highHeart"
const val KEY_highBrEATH = "highBrEATH"
const val KEY_lowHeart = "lowHeart"
const val KEY_lowBreath = "lowBreath"
const val KEY_deviceName = "deviceName"
const val KEY_PLAN_ON = "PLAN_ON"
const val KEY_PLAN_first = "PLAN_first"
const val KEY_Sleep_goal = "KEY_Sleep_goal"
const val KEY_Step_goal = "KEY_Step_goal"
const val KEY_deviceType = "KEY_deviceType"
var sharedPreferences: SharedPreferences? = null
private set
const val DefaultCountryCode = "0086-"
fun init(context: Context) {
sharedPreferences = context.getSharedPreferences(spName, Activity.MODE_PRIVATE)
}
fun setSpBoolean(name: String?, bool: Boolean) {
sharedPreferences!!.edit().putBoolean(name, bool).commit()
}
fun getSpBoolean(name: String?): Boolean {
return sharedPreferences!!.getBoolean(name, false)
}
fun getBoolean(name: String?, defaultValue: Boolean): Boolean {
return sharedPreferences!!.getBoolean(name, defaultValue)
}
fun setSpString(name: String?, value: String?) {
sharedPreferences!!.edit().putString(name, value).commit()
}
fun getSpString(name: String?): String? {
return getString(name, null)
}
fun getString(name: String?, defaultValue: String?): String? {
return sharedPreferences!!.getString(name, defaultValue)
}
fun setSpInteger(name: String?, value: Int) {
sharedPreferences!!.edit().putInt(name, value).commit()
}
fun getInteger(name: String?, defaultValue: Int): Int {
return sharedPreferences!!.getInt(name, defaultValue)
}
fun getSpInteger(name: String?): Int {
return getInteger(name, -1)
}
fun setSpFloat(name: String?, value: Float) {
sharedPreferences!!.edit().putFloat(name, value).commit()
}
fun getSpFloat(name: String?): Float {
return getFloat(name, 0.0f)
}
fun getFloat(name: String?, defaultValue: Float): Float {
return sharedPreferences!!.getFloat(name, defaultValue)
}
}

@ -1,34 +0,0 @@
package com.cloud.diplomaticquarterapp.utils
fun add(ori: ByteArray?, add: ByteArray): ByteArray {
if (ori == null) {
return add
}
val new: ByteArray = ByteArray(ori.size + add.size)
for ((index, value) in ori.withIndex()) {
new[index] = value
}
for ((index, value) in add.withIndex()) {
new[index + ori.size] = value
}
return new
}
fun toUInt(bytes: ByteArray): Int {
var result = 0
for ((i, v) in bytes.withIndex()) {
result += v.unsigned().shl(i * 8)
}
return result
}
fun Byte.unsigned(): Int = when {
(toInt() < 0) -> 255 + toInt() + 1
else -> toInt()
}

@ -1,58 +0,0 @@
package com.cloud.diplomaticquarterapp.utils;
/**
* Tools used to generate CRC8 code
*
* @author zouhao
*/
public class CRCUtils {
/**
* CRC8 code table
*/
private static final char[] Table_CRC8 = {0x00, 0x07, 0x0E, 0x09, 0x1C,
0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46,
0x41, 0x54, 0x53, 0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB,
0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 0x90,
0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1,
0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5,
0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 0xB7, 0xB0,
0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93,
0x94, 0x9D, 0x9A, 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, 0x57, 0x50, 0x59,
0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74,
0x7D, 0x7A, 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1,
0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, 0xF9, 0xFE, 0xF7, 0xF0,
0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3,
0xD4, 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56,
0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10, 0x05,
0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78,
0x7F, 0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25,
0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 0xAE,
0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F,
0x8A, 0x8D, 0x84, 0x83, 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC,
0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3};
/**
* Generate CRC8 code
*
* @param buf Data buffer
* @return CRC8 code, return 0 when the parameter is error
*/
public static byte calCRC8(byte[] buf) {
if (buf == null || buf.length == 0) {
return 0;
}
byte crc = 0;
for (int i = 0; i < buf.length - 1; i++) {
crc = (byte) Table_CRC8[0x00ff & (crc ^ (buf[i]))];
}
return crc;
}
}

@ -1,23 +0,0 @@
package com.cloud.diplomaticquarterapp.utils;
import android.content.Context;
import java.io.File;
public class Constant {
public final static String[] EcgWay = {"Hand-Hand", "Hand-Chest", "1-Lead", "2-Lead"};
public final static String[] OxyWay = {"Internal", "External", ""};
public final static String[] TmpWay = {"Body", "Thing", ""};
public static String filePath;
public static String getPathX(String s) {
return filePath + s;
}
public static void initVar(Context context) {
File[] fs = context.getExternalFilesDirs(null);
if (fs != null && fs.length >= 1) {
filePath = fs[0].getAbsolutePath() + "/";
}
}
}

@ -1,6 +1,7 @@
package com.ejada.hmg.utils
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.Result
class FlutterText{

@ -1,6 +1,5 @@
package com.ejada.hmg.utils
import android.annotation.SuppressLint
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
@ -14,38 +13,38 @@ import android.widget.Toast
import androidx.annotation.Nullable
import androidx.core.app.NotificationCompat
import androidx.core.app.TaskStackBuilder
import com.cloud.diplomaticquarterapp.MainActivity
import com.ejada.hmg.BuildConfig
import com.ejada.hmg.MainActivity
import com.ejada.hmg.R
import com.ejada.hmg.geofence.GeoZoneModel
import com.github.kittinunf.fuel.core.extensions.jsonBody
import com.github.kittinunf.fuel.httpPost
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import io.flutter.plugin.common.MethodChannel
import org.jetbrains.anko.doAsyncResult
//import org.jetbrains.anko.doAsyncResult
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
import java.text.SimpleDateFormat
import java.util.*
import kotlin.concurrent.timerTask
import com.ejada.hmg.BuildConfig
class HMGUtils {
companion object {
companion object{
private lateinit var platformChannel: MethodChannel
fun getPlatformChannel(): MethodChannel {
fun getPlatformChannel():MethodChannel{
return platformChannel
}
fun setPlatformChannel(channel: MethodChannel) {
fun setPlatformChannel(channel: MethodChannel){
platformChannel = channel
}
fun timer(delay: Long, repeat: Boolean, tick: (Timer) -> Unit): Timer {
fun timer(delay: Long, repeat: Boolean, tick: (Timer) -> Unit) : Timer{
val timer = Timer()
if (repeat)
if(repeat)
timer.schedule(timerTask {
tick(timer)
}, delay, delay)
@ -57,44 +56,42 @@ class HMGUtils {
return timer
}
fun popMessage(context: MainActivity, message: String) {
fun popMessage(context: MainActivity, message: String){
context.runOnUiThread {
Toast.makeText(context, message, Toast.LENGTH_LONG).show()
}
}
fun popFlutterText(context: MainActivity, key: String) {
fun popFlutterText(context: MainActivity, key: String){
context.runOnUiThread {
FlutterText.with(key) {
FlutterText.with(key){
Toast.makeText(context, it, Toast.LENGTH_LONG).show()
}
}
}
fun getLanguageCode(context: Context): Int {
fun getLanguageCode(context: Context) : Int {
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
val lang = pref.getString(PREF_KEY_LANGUAGE, "ar")
return if (lang == "ar") 2 else 1
}
fun defaultHTTPParams(context: Context): Map<String, Any?> {
fun defaultHTTPParams(context: Context) : Map<String, Any?>{
return mapOf(
"ZipCode" to "966",
"VersionID" to 5.8,
"Channel" to 3,
"LanguageID" to getLanguageCode(context),
"IPAdress" to "10.20.10.20",
"generalid" to "Cs2020@2016$2958",
"PatientOutSA" to 0,
"SessionID" to null,
"isDentalAllowedBackend" to false,
"DeviceTypeID" to 2
)
"ZipCode" to "966",
"VersionID" to 5.8,
"Channel" to 3,
"LanguageID" to getLanguageCode(context),
"IPAdress" to "10.20.10.20",
"generalid" to "Cs2020@2016$2958",
"PatientOutSA" to 0,
"SessionID" to null,
"isDentalAllowedBackend" to false,
"DeviceTypeID" to 2)
}
@SuppressLint("MissingPermission")
fun <T> scheduleJob(context: Context, pendingIntentClassType: Class<T>, jobId: Int, intervalDuration: String, deadlineMillis: Long = (30 * 1000)) { // default deadline: 30 Seconds
fun <T>scheduleJob(context: Context, pendingIntentClassType:Class<T>, jobId:Int, intervalDuration:String, deadlineMillis:Long = (30 * 1000)) { // default deadline: 30 Seconds
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
val jobScheduler: JobScheduler = context.getSystemService(JobScheduler::class.java)
@ -103,22 +100,17 @@ class HMGUtils {
builder.setPersisted(true)
builder.setBackoffCriteria(30000, JobInfo.BACKOFF_POLICY_LINEAR)
val intervalMillis = timeToMillis(intervalDuration, "HH:mm:ss")
val intervalMillis = timeToMillis(intervalDuration,"HH:mm:ss")
builder.setMinimumLatency(intervalMillis) // wait at least
builder.setOverrideDeadline((intervalMillis + deadlineMillis)) // maximum delay
if (jobScheduler.schedule(builder.build()) == JobScheduler.RESULT_SUCCESS) {
Logs.save(
context,
"ScheduleJob",
"${pendingIntentClassType.simpleName}: Job scheduled to trigger after duration $intervalDuration >> HH:mm:ss --('MinimumLatency:$intervalMillis Deadline:${(intervalMillis + deadlineMillis)}')--",
Logs.STATUS.SUCCESS
)
} else {
Logs.save(context, "ScheduleJob", "${pendingIntentClassType.simpleName}: Failed to scheduled Job", Logs.STATUS.ERROR)
if (jobScheduler.schedule(builder.build()) == JobScheduler.RESULT_SUCCESS){
Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Job scheduled to trigger after duration $intervalDuration >> HH:mm:ss --('MinimumLatency:$intervalMillis Deadline:${(intervalMillis + deadlineMillis)}')--",Logs.STATUS.SUCCESS)
}else{
Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Failed to scheduled Job",Logs.STATUS.ERROR)
}
} else {
Logs.save(context, "ScheduleJob", "${pendingIntentClassType.simpleName}: Failed to scheduled Job on VERSION.SDK_INT < ${android.os.Build.VERSION_CODES.M}", Logs.STATUS.ERROR)
Logs.save(context,"ScheduleJob", "${pendingIntentClassType.simpleName}: Failed to scheduled Job on VERSION.SDK_INT < ${android.os.Build.VERSION_CODES.M}",Logs.STATUS.ERROR)
}
}
@ -130,7 +122,7 @@ class HMGUtils {
private const val NOTIFICATION_CHANNEL_ID = BuildConfig.APPLICATION_ID + ".channel"
fun timeToMillis(time: String, format: String): Long {
fun timeToMillis(time:String, format:String):Long{
val sdf = SimpleDateFormat(format, Locale.US)
val millis = sdf.parse(time).time + TimeZone.getDefault().rawOffset
return millis
@ -140,14 +132,11 @@ fun sendNotification(context: Context, title: String, @Nullable subtitle: String
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
&& notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) == null
) {
&& notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) == null) {
val name = context.getString(R.string.app_name)
val channel = NotificationChannel(
NOTIFICATION_CHANNEL_ID,
name,
NotificationManager.IMPORTANCE_DEFAULT
)
val channel = NotificationChannel(NOTIFICATION_CHANNEL_ID,
name,
NotificationManager.IMPORTANCE_DEFAULT)
notificationManager.createNotificationChannel(channel)
}
@ -155,15 +144,15 @@ fun sendNotification(context: Context, title: String, @Nullable subtitle: String
val intent = Intent(context, MainActivity::class.java)
val stackBuilder = TaskStackBuilder.create(context)
.addParentStack(MainActivity::class.java)
.addNextIntent(intent)
.addParentStack(MainActivity::class.java)
.addNextIntent(intent)
val notificationPendingIntent = stackBuilder.getPendingIntent(getUniqueId(), PendingIntent.FLAG_UPDATE_CURRENT)
val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(notificationPendingIntent)
.setAutoCancel(true)
.setContentTitle(title)
.setSmallIcon(R.mipmap.ic_launcher_local)
.setContentIntent(notificationPendingIntent)
.setAutoCancel(true)
.setContentTitle(title)
subtitle.let { notification.setContentText(it) }
message.let { notification.setSubText(it) }
@ -178,63 +167,58 @@ fun getUniqueId() = ((System.currentTimeMillis() % 10000).toInt())
object DateUtils {
@JvmStatic
fun dateTimeNow(): String {
fun dateTimeNow() : String {
val format = SimpleDateFormat("dd-MMM-yyy hh:mm:ss")
return format.format(Date())
}
}
fun isJSONValid(jsonString: String?): Boolean {
try {
JSONObject(jsonString)
} catch (ex: JSONException) {
try {
JSONArray(jsonString)
} catch (ex1: JSONException) {
try { JSONObject(jsonString) } catch (ex: JSONException) {
try { JSONArray(jsonString) } catch (ex1: JSONException) {
return false
}
}
return true
}
fun saveLog(context: Context, tag: String, message: String) {
fun saveLog(context: Context, tag: String, message: String){
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
var logs = pref.getString("LOGS", "")
logs += "$tag -> $message \n"
pref.edit().putString("LOGS", logs).apply();
}
fun getLogs(context: Context): String? {
fun getLogs(context: Context) : String?{
val pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
return pref.getString("LOGS", "")
}
class HTTPResponse<T>(data: T) {
final var data: T = data
class HTTPResponse<T>(data: T){
final var data:T = data
}
fun <T> httpPost(url: String, body: Map<String, Any?>, onSuccess: (response: HTTPResponse<T>) -> Unit, onError: (error: Exception) -> Unit) {
fun <T>httpPost(url: String, body: Map<String, Any?>, onSuccess: (response: HTTPResponse<T>) -> Unit, onError: (error: Exception) -> Unit){
val gson = Gson()
val type = object : TypeToken<T>() {}.type
val type = object : TypeToken<T>() {}.type
val jsonBody = gson.toJson(body)
url.httpPost()
.jsonBody(jsonBody, Charsets.UTF_8)
.timeout(10000)
.header("Content-Type", "application/json")
.header("Allow", "*/*")
.response { request, response, result ->
result.doAsyncResult { }
result.fold({ data ->
val dataString = String(data)
if (isJSONValid(dataString)) {
val responseData = gson.fromJson<T>(dataString, type)
onSuccess(HTTPResponse(responseData))
} else {
onError(Exception("Invalid response from server (Not a valid JSON)"))
}
}, {
onError(it)
})
.jsonBody(jsonBody, Charsets.UTF_8)
.timeout(10000)
.header("Content-Type", "application/json")
.header("Allow", "*/*")
.response { request, response, result ->
result.fold({ data ->
val dataString = String(data)
if (isJSONValid(dataString)) {
val responseData = gson.fromJson<T>(dataString, type)
onSuccess(HTTPResponse(responseData))
} else {
onError(Exception("Invalid response from server (Not a valid JSON)"))
}
}, {
onError(it)
})
}
}
}

@ -2,128 +2,128 @@ package com.ejada.hmg.utils
import android.content.Context
import android.content.SharedPreferences
import android.os.Build
import com.ejada.hmg.BuildConfig
import com.google.gson.Gson
class Logs {
enum class STATUS {
enum class STATUS{
SUCCESS,
ERROR;
}
class GeofenceEvent {
companion object {
fun save(context: Context, tag: String, message: String, status: Logs.STATUS = STATUS.SUCCESS) {
Logs.Common.save(context, "GeofenceEvent", tag, message, status)
class GeofenceEvent{
companion object{
fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
Logs.Common.save(context,"GeofenceEvent", tag, message, status)
}
fun list(context: Context, tag: String? = null, status: Logs.STATUS? = null): List<LogModel> {
return Logs.Common.list(context, "GeofenceEvent", tag, status)
fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
return Logs.Common.list(context,"GeofenceEvent", tag, status)
}
fun raw(context: Context): String {
return Logs.Common.raw(context, "GeofenceEvent")
fun raw(context: Context):String{
return Logs.Common.raw(context,"GeofenceEvent")
}
}
}
class RegisterGeofence {
companion object {
fun save(context: Context, tag: String, message: String, status: Logs.STATUS = STATUS.SUCCESS) {
Logs.Common.save(context, "RegisterGeofence", tag, message, status)
class RegisterGeofence{
companion object{
fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
Logs.Common.save(context,"RegisterGeofence", tag, message, status)
}
fun list(context: Context, tag: String? = null, status: Logs.STATUS? = null): List<LogModel> {
return Logs.Common.list(context, "RegisterGeofence", tag, status)
fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
return Logs.Common.list(context,"RegisterGeofence", tag, status)
}
fun raw(context: Context): String {
return Logs.Common.raw(context, "RegisterGeofence");
fun raw(context: Context):String{
return Logs.Common.raw(context,"RegisterGeofence");
}
}
}
companion object {
private var pref: SharedPreferences? = null
fun save(context: Context, tag: String, message: String, status: Logs.STATUS = STATUS.SUCCESS) {
Logs.Common.save(context, "Logs", tag, message, status)
companion object{
private var pref:SharedPreferences? = null
fun save(context: Context, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
Logs.Common.save(context,"Logs", tag, message, status)
}
fun list(context: Context, tag: String? = null, status: Logs.STATUS? = null): List<LogModel> {
return Logs.Common.list(context, "Logs", tag, status)
fun list(context: Context, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
return Logs.Common.list(context,"Logs", tag, status)
}
fun raw(context: Context): String {
return Logs.Common.raw(context, "Logs");
fun raw(context: Context):String{
return Logs.Common.raw(context,"Logs");
}
private fun storage(context: Context): SharedPreferences {
if (pref == null) {
private fun storage(context: Context):SharedPreferences{
if(pref == null) {
pref = context.getSharedPreferences(PREFS_STORAGE, Context.MODE_PRIVATE)
}
return pref!!
}
}
private class Common {
companion object {
private class Common{
companion object{
private val gson = Gson()
fun save(context: Context, key: String, tag: String, message: String, status: Logs.STATUS = STATUS.SUCCESS) {
if (!BuildConfig.DEBUG)
fun save(context: Context, key:String, tag:String, message:String, status:Logs.STATUS = STATUS.SUCCESS){
if(!BuildConfig.DEBUG)
return
val pref = Logs.storage(context)
val string = pref.getString(key, "{}")
val json = gson.fromJson<LogsContainerModel>(string, LogsContainerModel::class.java)
val string = pref.getString(key,"{}")
val json = gson.fromJson<LogsContainerModel>(string,LogsContainerModel::class.java)
json.add(
LogModel().apply {
this.TAG = tag
this.MESSAGE = message
this.STATUS = status.name
this.DATE = DateUtils.dateTimeNow()
}
LogModel().apply {
this.TAG = tag
this.MESSAGE = message
this.STATUS = status.name
this.DATE = DateUtils.dateTimeNow()
}
)
pref.edit().putString(key, gson.toJson(json)).apply()
pref.edit().putString(key,gson.toJson(json)).apply()
}
fun list(context: Context, key: String, tag: String? = null, status: Logs.STATUS? = null): List<LogModel> {
fun list(context: Context, key:String, tag:String? = null, status:Logs.STATUS? = null):List<LogModel>{
val pref = Logs.storage(context)
val string = pref.getString(key, "{}")
val json = gson.fromJson<LogsContainerModel>(string, LogsContainerModel::class.java)
if (tag == null && status == null) {
val string = pref.getString(key,"{}")
val json = gson.fromJson<LogsContainerModel>(string,LogsContainerModel::class.java)
if(tag == null && status == null) {
return json.LOGS
} else if (tag != null && status != null) {
}else if(tag != null && status != null){
return json.LOGS.filter { (it.TAG == tag && it.STATUS == status.name) }
} else if (tag != null) {
}else if(tag != null){
return json.LOGS.filter { (it.TAG == tag) }
} else if (status != null) {
}else if(status != null){
return json.LOGS.filter { (it.STATUS == status.name) }
}
return listOf()
}
fun raw(context: Context, key: String): String {
fun raw(context: Context, key:String):String{
val pref = Logs.storage(context)
val string = pref.getString(key, "{}")
val string = pref.getString(key,"{}")
return string!!
}
}
}
class LogModel {
lateinit var TAG: String
lateinit var MESSAGE: String
lateinit var STATUS: String
lateinit var DATE: String
class LogModel{
lateinit var TAG:String
lateinit var MESSAGE:String
lateinit var STATUS:String
lateinit var DATE:String
companion object {
fun with(tag: String, message: String, status: String): LogModel {
companion object{
fun with(tag:String, message:String, status:String):LogModel{
return LogModel().apply {
this.TAG = tag
this.MESSAGE = message
@ -134,9 +134,9 @@ class Logs {
}
}
class LogsContainerModel {
class LogsContainerModel{
var LOGS = mutableListOf<LogModel>()
fun add(log: LogModel) {
fun add(log:LogModel){
LOGS.add(log)
}
}

@ -1,6 +1,6 @@
package com.ejada.hmg.utils
import com.cloud.diplomaticquarterapp.MainActivity
import com.ejada.hmg.MainActivity
import com.ejada.hmg.opentok.OpenTok
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall

@ -11,7 +11,7 @@ import android.widget.Toast
import androidx.core.app.ActivityCompat.startActivityForResult
import android.net.wifi.WifiManager
import android.util.Log
import com.cloud.diplomaticquarterapp.MainActivity
import com.ejada.hmg.MainActivity
import com.ejada.hmg.hmgwifi.HMG_Guest
import com.ejada.hmg.geofence.GeoZoneModel
import com.ejada.hmg.geofence.HMG_Geofence

@ -1,7 +0,0 @@
package com.cloud.diplomaticquarterapp.utils
import kotlinx.coroutines.channels.Channel
object UiChannel {
val progressChannel = Channel<Int>(Channel.CONFLATED)
}

@ -0,0 +1,81 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.cloud.diplomaticquarterapp.whatsapp;
import static java.sql.DriverManager.println;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.util.Base64;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Collection;
import java.util.stream.Collectors;
public class AppSignatureRetriever {
private static final String HASH_TYPE = "SHA-256";
public static final int NUM_HASHED_BYTES = 9;
public static final int NUM_BASE64_CHAR = 11;
public void logSignatures(Context context) {
Collection<String> appSignatures = getAppSignatures(context);
appSignatures.forEach(signature -> println("Signature: " + signature));
}
/**
* Get all the app signatures for the current package.
*
* @return signatures for current app
*/
public Collection<String> getAppSignatures(Context context) {
try {
// Get all package signatures for the current package
String packageName = context.getPackageName();
println("Package name: " + packageName);
PackageManager packageManager = context.getPackageManager();
Signature[] signatures = packageManager.getPackageInfo(packageName,
PackageManager.GET_SIGNATURES).signatures;
// For each signature create a compatible hash
Collection<String> appCodes = Arrays.stream(signatures)
.map(signature -> hash(packageName, signature.toCharsString()))
.collect(Collectors.toList());
return appCodes;
} catch (PackageManager.NameNotFoundException e) {
println("Unable to find package to obtain hash.");
throw new RuntimeException("Unable to find package to obtain hash.", e);
}
}
private String hash(String packageName, String signature) {
String appInfo = packageName + " " + signature;
try {
MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE);
messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8));
byte[] hashSignature = messageDigest.digest();
// truncated into NUM_HASHED_BYTES
hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES);
// encode into Base64
String base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING | Base64.NO_WRAP);
base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR);
println(String.format("pkg: %s -- hash: %s", packageName, base64Hash));
return base64Hash;
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Unable to generate hash for application", e);
}
}
}

@ -0,0 +1,31 @@
package com.cloud.diplomaticquarterapp.whatsapp
import android.content.Context
import android.content.Intent
import com.whatsapp.otp.android.sdk.WhatsAppOtpHandler
import com.whatsapp.otp.android.sdk.WhatsAppOtpIncomingIntentHandler
import java.lang.ref.WeakReference
object WhatsApp {
val whatsAppOtpHandler = WhatsAppOtpHandler()
inline fun handleOTP ( intent: Intent, crossinline validateOTP:(code: String )-> Unit) =
WhatsAppOtpIncomingIntentHandler().processOtpCode(
intent,
// call your function to validate
{code -> validateOTP(code) },
{error,exception->
println("the error is ${error.name}")
println("the exception stacktrace is ${exception.message}")
println("the exception is cause ${exception.cause}")
})
fun performHandShake(context : WeakReference<Context>) = whatsAppOtpHandler.sendOtpIntentToWhatsApp(context.get()!!)
fun isWhatsAppInstalled(context : WeakReference<Context>) : Boolean = whatsAppOtpHandler.isWhatsAppInstalled(context.get()!!)
}

@ -0,0 +1,17 @@
package com.cloud.diplomaticquarterapp.whatsapp
import android.app.PendingIntent
import android.content.Intent
import android.os.Bundle
import com.cloud.diplomaticquarterapp.whatsapp.WhatsApp
import com.cloud.diplomaticquarterapp.whatsapp.WhatsAppOtpPlatformBridge
import io.flutter.embedding.android.FlutterFragmentActivity
class WhatsAppCodeActivity : FlutterFragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WhatsApp.handleOTP(intent){code ->
WhatsAppOtpPlatformBridge.result?.success(code);
finish()
}
}
}

@ -0,0 +1,48 @@
package com.cloud.diplomaticquarterapp.whatsapp
import com.ejada.hmg.MainActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import java.lang.ref.WeakReference
class WhatsAppOtpPlatformBridge(
private var flutterEngine: FlutterEngine,
private var mainActivity: MainActivity
) {
private lateinit var channel: MethodChannel
companion object {
private const val CHANNEL = "whats_app_otp"
var result: MethodChannel.Result? = null
}
fun invoke() {
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
channel.setMethodCallHandler { call: MethodCall, result: MethodChannel.Result ->
when (call.method) {
"isWhatsAppInstalled" -> {
val isAppInstalled =
WhatsApp.isWhatsAppInstalled(WeakReference(mainActivity))
result.success(isAppInstalled)
}
"performHandShake" -> {
WhatsApp.performHandShake(WeakReference(mainActivity))
}
"startListening" -> {
WhatsAppOtpPlatformBridge.result = result
}
else -> {
result.notImplemented()
}
}
}
}
}

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.cloud.diplomaticquarterapp.whatsapp.WhatsAppCodeActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save