├── ios
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── AppFrameworkInfo.plist
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── 29.png
│ │ │ ├── 40.png
│ │ │ ├── 57.png
│ │ │ ├── 58.png
│ │ │ ├── 60.png
│ │ │ ├── 80.png
│ │ │ ├── 87.png
│ │ │ ├── 1024.png
│ │ │ ├── 114.png
│ │ │ ├── 120.png
│ │ │ ├── 180.png
│ │ │ └── Contents.json
│ │ └── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
└── .gitignore
├── img
├── 1.png
├── 2.png
├── 3.png
├── 4.png
├── 5.png
├── 6.png
├── 7.png
├── ip.gif
├── auth.gif
├── storage.gif
├── database.gif
└── google_auth.gif
├── lib
├── assets
│ ├── gif
│ │ ├── loader.gif
│ │ ├── loader1.gif
│ │ └── success1.gif
│ ├── images
│ │ ├── img.png
│ │ ├── red.png
│ │ ├── card.png
│ │ ├── card1.png
│ │ ├── card2.png
│ │ ├── card3.png
│ │ ├── card4.png
│ │ ├── card5.png
│ │ ├── image.png
│ │ ├── img1.png
│ │ ├── img2.png
│ │ ├── logo.png
│ │ ├── pink.png
│ │ ├── avatar.png
│ │ ├── avatar1.png
│ │ ├── avatar10.png
│ │ ├── avatar11.png
│ │ ├── avatar12.png
│ │ ├── avatar2.png
│ │ ├── avatar3.png
│ │ ├── avatar4.png
│ │ ├── avatar5.png
│ │ ├── avatar6.png
│ │ ├── avatar7.png
│ │ ├── avatar8.png
│ │ ├── avatar9.png
│ │ ├── firebase.png
│ │ ├── gflogo.png
│ │ ├── image1.png
│ │ ├── image2.png
│ │ ├── orange.png
│ │ └── purple.png
│ ├── fonts
│ │ ├── loader.ttf
│ │ ├── gfFontIcon.ttf
│ │ ├── gfIconFonts.ttf
│ │ ├── gfFontIcons2.ttf
│ │ └── gfSocialFonts.ttf
│ └── icons
│ │ └── gflogo.png
├── const
│ └── strings.dart
├── utils
│ ├── common.dart
│ ├── system_padding.dart
│ ├── customlistloadingshimmer.dart
│ ├── websocket.dart
│ ├── rest_ds.dart
│ └── network.dart
├── main.dart
├── screens
│ ├── ppg
│ │ ├── chart.dart
│ │ └── heartRate.dart
│ ├── drawer
│ │ ├── webview.dart
│ │ └── drawer.dart
│ ├── addpatient
│ │ └── local_widgets
│ │ │ └── custom_dropdown_field.dart
│ ├── telehealth
│ │ ├── local_widgets
│ │ │ └── profileShimmer.dart
│ │ ├── profile.dart
│ │ ├── chat.dart
│ │ └── signaling.dart
│ ├── login
│ │ ├── create_account.dart
│ │ ├── login.dart
│ │ └── login2.dart
│ ├── shimmer
│ │ └── shimmer.dart
│ ├── medicine
│ │ └── medicine_recognition_ML_Kit.dart
│ ├── home.dart
│ ├── patientList
│ │ └── patient_list.dart
│ ├── codescanner
│ │ └── codescanner.dart
│ └── register
│ │ └── register.dart
└── models
│ ├── user.dart
│ └── patient.dart
├── .gitmodules
├── android
├── gradle.properties
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ ├── splash.png
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ └── values
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── example
│ │ │ │ │ ├── openemr_app
│ │ │ │ │ └── MainActivity.kt
│ │ │ │ │ └── app_openemr
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── build.gradle
└── settings.gradle
├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── feature_request.md
│ └── security_report.md
└── PULL_REQUEST_TEMPLATE.md
├── .metadata
├── .gitignore
├── test
└── widget_test.dart
├── pubspec.yaml
├── CONTRIBUTING.md
├── README.md
└── CODE_OF_CONDUCT.md
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/img/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/1.png
--------------------------------------------------------------------------------
/img/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/2.png
--------------------------------------------------------------------------------
/img/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/3.png
--------------------------------------------------------------------------------
/img/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/4.png
--------------------------------------------------------------------------------
/img/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/5.png
--------------------------------------------------------------------------------
/img/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/6.png
--------------------------------------------------------------------------------
/img/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/7.png
--------------------------------------------------------------------------------
/img/ip.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/ip.gif
--------------------------------------------------------------------------------
/img/auth.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/auth.gif
--------------------------------------------------------------------------------
/img/storage.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/storage.gif
--------------------------------------------------------------------------------
/img/database.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/database.gif
--------------------------------------------------------------------------------
/img/google_auth.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/img/google_auth.gif
--------------------------------------------------------------------------------
/lib/assets/gif/loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/gif/loader.gif
--------------------------------------------------------------------------------
/lib/assets/images/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/img.png
--------------------------------------------------------------------------------
/lib/assets/images/red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/red.png
--------------------------------------------------------------------------------
/lib/assets/fonts/loader.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/fonts/loader.ttf
--------------------------------------------------------------------------------
/lib/assets/gif/loader1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/gif/loader1.gif
--------------------------------------------------------------------------------
/lib/assets/gif/success1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/gif/success1.gif
--------------------------------------------------------------------------------
/lib/assets/icons/gflogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/icons/gflogo.png
--------------------------------------------------------------------------------
/lib/assets/images/card.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/card.png
--------------------------------------------------------------------------------
/lib/assets/images/card1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/card1.png
--------------------------------------------------------------------------------
/lib/assets/images/card2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/card2.png
--------------------------------------------------------------------------------
/lib/assets/images/card3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/card3.png
--------------------------------------------------------------------------------
/lib/assets/images/card4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/card4.png
--------------------------------------------------------------------------------
/lib/assets/images/card5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/card5.png
--------------------------------------------------------------------------------
/lib/assets/images/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/image.png
--------------------------------------------------------------------------------
/lib/assets/images/img1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/img1.png
--------------------------------------------------------------------------------
/lib/assets/images/img2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/img2.png
--------------------------------------------------------------------------------
/lib/assets/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/logo.png
--------------------------------------------------------------------------------
/lib/assets/images/pink.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/pink.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar1.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar10.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar11.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar12.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar2.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar3.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar4.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar5.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar6.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar7.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar8.png
--------------------------------------------------------------------------------
/lib/assets/images/avatar9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/avatar9.png
--------------------------------------------------------------------------------
/lib/assets/images/firebase.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/firebase.png
--------------------------------------------------------------------------------
/lib/assets/images/gflogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/gflogo.png
--------------------------------------------------------------------------------
/lib/assets/images/image1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/image1.png
--------------------------------------------------------------------------------
/lib/assets/images/image2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/image2.png
--------------------------------------------------------------------------------
/lib/assets/images/orange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/orange.png
--------------------------------------------------------------------------------
/lib/assets/images/purple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/images/purple.png
--------------------------------------------------------------------------------
/lib/assets/fonts/gfFontIcon.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/fonts/gfFontIcon.ttf
--------------------------------------------------------------------------------
/lib/assets/fonts/gfIconFonts.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/fonts/gfIconFonts.ttf
--------------------------------------------------------------------------------
/lib/assets/fonts/gfFontIcons2.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/fonts/gfFontIcons2.ttf
--------------------------------------------------------------------------------
/lib/assets/fonts/gfSocialFonts.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/lib/assets/fonts/gfSocialFonts.ttf
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "app-golang-openemr"]
2 | path = app-golang-openemr
3 | url = https://github.com/openemr/app-golang-openemr
4 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/android/app/src/main/res/mipmap-xxhdpi/splash.png
--------------------------------------------------------------------------------
/lib/const/strings.dart:
--------------------------------------------------------------------------------
1 | const loginendpoint = "/apis/api/auth";
2 | const patientendpoint = "/apis/api/patient";
3 | const addpatientendpoint = "/apis/api/patient";
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/openemr/app-flutter-openemr/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/openemr_app/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.openemr
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/app_openemr/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.app_openemr
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/lib/utils/common.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | void showToast(BuildContext context, String msg) {
4 | ScaffoldMessenger.of(context).showSnackBar(
5 | SnackBar(
6 | content: Text(msg),
7 | ),
8 | );
9 | }
10 |
11 | bool isValidUrl(url) {
12 | return Uri.parse(url).isAbsolute;
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug Report
3 | about: Report any bugs present in the code
4 | ---
5 |
6 | **Expected Behavior**
7 |
8 | **Actual Behavior**
9 |
10 | **Steps to Reproduce the Problem**
11 |
12 | **Screenshots/Video showcasing the issue**
13 |
14 | **What might be causing this behavior and your solution to it**
15 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 0b8abb4724aa590dd0f429683339b1e045a1594d
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature Request
3 | about: Suggest a feature for the Project
4 | ---
5 |
6 | **Describe the Feature**
7 |
8 |
9 |
10 | **Need of this Feature**
11 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/lib/utils/system_padding.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class SystemPadding extends StatelessWidget {
4 | final Widget child;
5 |
6 | SystemPadding({Key key, this.child}) : super(key: key);
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | var mediaQuery = MediaQuery.of(context);
11 | return new AnimatedContainer(
12 | padding: mediaQuery.viewInsets,
13 | duration: const Duration(milliseconds: 300),
14 | child: child);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | -
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/security_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Security Report
3 | about: Privately report a Security Vulnerability
4 | ---
5 |
6 | **Security Report**
7 |
8 |
12 |
13 |
15 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Exceptions to above rules.
37 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
38 |
39 | #Keys
40 | google-services.json
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.50'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.5.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | // Uncomment the line if you want to use firebase
12 | // classpath 'com.google.gms:google-services:4.3.3'
13 | }
14 | }
15 |
16 | allprojects {
17 | repositories {
18 | google()
19 | jcenter()
20 | }
21 | }
22 |
23 | rootProject.buildDir = '../build'
24 | subprojects {
25 | project.buildDir = "${rootProject.buildDir}/${project.name}"
26 | }
27 | subprojects {
28 | project.evaluationDependsOn(':app')
29 | }
30 |
31 | task clean(type: Delete) {
32 | delete rootProject.buildDir
33 | }
34 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:openemr/screens/home.dart';
4 | // import './screens/home.dart';
5 |
6 | void main(){
7 | HttpOverrides.global = new MyHttpOverrides();
8 | runApp(new MyApp());
9 | }
10 |
11 | class MyApp extends StatelessWidget {
12 | @override
13 | Widget build(BuildContext context) => MaterialApp(
14 | title: 'OpenEMR',
15 | debugShowCheckedModeBanner: false,
16 | theme: ThemeData(
17 | primarySwatch: Colors.blue,
18 | ),
19 | home: HomePage(),
20 | );
21 | }
22 |
23 | class MyHttpOverrides extends HttpOverrides{
24 | @override
25 | HttpClient createHttpClient(SecurityContext context){
26 | return super.createHttpClient(context)
27 | ..badCertificateCallback = (X509Certificate cert, String host, int port)=> true;
28 | }
29 | }
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | **IMPORTANT: Please do not create a Pull Request without creating an issue first.**
2 |
3 |
4 |
5 | **Description**
6 |
7 |
8 |
9 | **Testing Methods**
10 |
11 |
12 |
13 | **Screenshots/Videos**
14 |
15 |
16 |
17 | **New Packages Added**
18 |
19 |
20 |
21 | **Closing Issues**
22 |
23 |
24 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
13 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
14 |
15 | def plugins = new Properties()
16 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
17 | if (pluginsFile.exists()) {
18 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
19 | }
20 |
21 | plugins.each { name, path ->
22 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
23 | include ":$name"
24 | project(":$name").projectDir = pluginDirectory
25 | }
26 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:openemr/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/lib/screens/ppg/chart.dart:
--------------------------------------------------------------------------------
1 | import 'package:charts_flutter/flutter.dart' as charts;
2 | import 'package:flutter/material.dart';
3 |
4 | class Chart extends StatelessWidget {
5 | final List _data;
6 |
7 | Chart(this._data);
8 |
9 | @override
10 | Widget build(BuildContext context) {
11 | return new charts.TimeSeriesChart([
12 | charts.Series(
13 | id: 'Values',
14 | colorFn: (_, __) => charts.MaterialPalette.green.shadeDefault,
15 | domainFn: (SensorValue values, _) => values.time,
16 | measureFn: (SensorValue values, _) => values.value,
17 | data: _data,
18 | )
19 | ],
20 | animate: false,
21 | primaryMeasureAxis: charts.NumericAxisSpec(
22 | tickProviderSpec:
23 | charts.BasicNumericTickProviderSpec(zeroBound: false),
24 | renderSpec: charts.NoneRenderSpec(),
25 | ),
26 | domainAxis: new charts.DateTimeAxisSpec(
27 | renderSpec: new charts.NoneRenderSpec()));
28 | }
29 | }
30 |
31 | class SensorValue {
32 | final DateTime time;
33 | final double value;
34 |
35 | SensorValue(this.time, this.value);
36 | }
--------------------------------------------------------------------------------
/lib/models/user.dart:
--------------------------------------------------------------------------------
1 | class User {
2 | String _username;
3 | String _tokenType;
4 | String _accessToken;
5 | String _baseUrl;
6 | String _password;
7 | User(this._username, this._tokenType, this._accessToken, this._baseUrl,
8 | this._password);
9 |
10 | User.map(dynamic obj) {
11 | this._username = obj["username"];
12 | this._tokenType = obj["token_type"];
13 | this._accessToken = obj["access_token"];
14 | this._baseUrl = obj["baseUrl"];
15 | this._password = obj["password"];
16 | }
17 |
18 | set username(String username) {
19 | this._username = username;
20 | }
21 |
22 | set password(String password) {
23 | this._password = password;
24 | }
25 |
26 | set url(String url) {
27 | this._baseUrl = url;
28 | }
29 |
30 | String get username => _username;
31 | String get tokenType => _tokenType;
32 | String get accessToken => _accessToken;
33 | String get baseUrl => _baseUrl;
34 | String get password => _password;
35 |
36 | Map toMap() {
37 | var map = new Map();
38 | map["username"] = _username;
39 | map["tokenType"] = _tokenType;
40 | map["accessToken"] = _accessToken;
41 | map["baseUrl"] = _baseUrl;
42 | map["password"] = _password;
43 | return map;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/lib/screens/drawer/webview.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 |
3 | import 'package:flutter/cupertino.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:getwidget/getwidget.dart';
6 | import 'package:webview_flutter/webview_flutter.dart';
7 |
8 | class WebViews extends StatefulWidget {
9 | const WebViews({Key key, this.url}) : super(key: key);
10 | final String url;
11 | @override
12 | _WebViewsState createState() => _WebViewsState();
13 | }
14 |
15 | class _WebViewsState extends State {
16 | final Completer _controller =
17 | Completer();
18 | @override
19 | Widget build(BuildContext context) => Scaffold(
20 | appBar: AppBar(
21 | backgroundColor: GFColors.DARK,
22 | title: Image.asset(
23 | 'lib/assets/icons/gflogo.png',
24 | width: 150,
25 | ),
26 | centerTitle: true,
27 | leading: InkWell(
28 | onTap: () {
29 | Navigator.pop(context);
30 | },
31 | child: Icon(
32 | CupertinoIcons.back,
33 | color: GFColors.SUCCESS,
34 | ),
35 | ),
36 | ),
37 | body: Builder(
38 | builder: (BuildContext context) => WebView(
39 | initialUrl: widget.url,
40 | javascriptMode: JavascriptMode.unrestricted,
41 | onWebViewCreated: _controller.complete,
42 | )));
43 | }
44 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"}]}
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | openemr
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/lib/screens/addpatient/local_widgets/custom_dropdown_field.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class CustomDropdownField extends StatefulWidget {
4 | final String label;
5 | final List options;
6 | final Function updateValue;
7 | final String value;
8 |
9 | CustomDropdownField({
10 | this.label,
11 | this.options,
12 | this.updateValue,
13 | this.value,
14 | });
15 |
16 | @override
17 | _CustomDropdownFieldState createState() => _CustomDropdownFieldState();
18 | }
19 |
20 | class _CustomDropdownFieldState extends State {
21 | @override
22 | Widget build(BuildContext context) {
23 | return Container(
24 | padding: const EdgeInsets.symmetric(horizontal: 10),
25 | child: Row(
26 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
27 | children: [
28 | Text(
29 | widget.label,
30 | style: TextStyle(
31 | color: Colors.black,
32 | fontSize: 16,
33 | ),
34 | ),
35 | DropdownButton(
36 | value: widget.value,
37 | icon: Icon(Icons.arrow_drop_down_rounded),
38 | iconSize: 20,
39 | elevation: 16,
40 | underline: Container(
41 | height: 2,
42 | color: Colors.black,
43 | ),
44 | onChanged: (String newValue) {
45 | setState(() {
46 | widget.updateValue(newValue);
47 | });
48 | },
49 | items: widget.options.map>((String value) {
50 | return DropdownMenuItem(
51 | value: value,
52 | child: Text(value),
53 | );
54 | }).toList(),
55 | ),
56 | ],
57 | ),
58 | );
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/lib/utils/customlistloadingshimmer.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:getwidget/components/shimmer/gf_shimmer.dart';
3 |
4 | Widget listItemShimmer(BuildContext context) {
5 | return GFShimmer(
6 | child: Container(
7 | alignment: Alignment.center,
8 | margin: const EdgeInsets.all(5),
9 | child: Row(
10 | children: [
11 | CircleAvatar(
12 | backgroundColor: Colors.white,
13 | radius: 30,
14 | ),
15 | Container(
16 | padding: const EdgeInsets.fromLTRB(10, 5, 5, 5),
17 | child: Column(
18 | crossAxisAlignment: CrossAxisAlignment.start,
19 | children: [
20 | Container(
21 | height: 25,
22 | width: MediaQuery.of(context).size.width * 0.55,
23 | color: Colors.white,
24 | ),
25 | SizedBox(height: 10),
26 | Container(
27 | height: 20,
28 | width: MediaQuery.of(context).size.width * 0.5,
29 | color: Colors.white,
30 | ),
31 | ],
32 | ),
33 | )
34 | ],
35 | ),
36 | ),
37 | );
38 | }
39 |
40 | Widget customListLoadingShimmer(BuildContext context,
41 | {String loadingMessage, int listLength = 1}) {
42 | return Container(
43 | alignment: Alignment.center,
44 | width: MediaQuery.of(context).size.width * 0.8,
45 | margin: const EdgeInsets.symmetric(vertical: 10),
46 | child: Column(
47 | mainAxisAlignment: MainAxisAlignment.center,
48 | crossAxisAlignment: CrossAxisAlignment.center,
49 | children: [
50 | loadingMessage == null
51 | ? Container()
52 | : Padding(
53 | padding: const EdgeInsets.only(bottom: 10),
54 | child: Text(
55 | loadingMessage,
56 | style: TextStyle(fontSize: 16, color: Colors.grey),
57 | ),
58 | ),
59 | for (var i = 0; i < listLength; i++) listItemShimmer(context)
60 | ],
61 | ),
62 | );
63 | }
64 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | // Uncomment the line if you want to use firebase
26 | // apply plugin: 'com.google.gms.google-services'
27 | apply plugin: 'kotlin-android'
28 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
29 |
30 | android {
31 | compileSdkVersion 28
32 |
33 | sourceSets {
34 | main.java.srcDirs += 'src/main/kotlin'
35 | }
36 |
37 | lintOptions {
38 | disable 'InvalidPackage'
39 | }
40 |
41 | defaultConfig {
42 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
43 | applicationId "com.example.openemr"
44 | minSdkVersion 21
45 | targetSdkVersion 28
46 | versionCode flutterVersionCode.toInteger()
47 | versionName flutterVersionName
48 | }
49 |
50 | buildTypes {
51 | release {
52 | // TODO: Add your own signing config for the release build.
53 | // Signing with the debug keys for now, so `flutter run --release` works.
54 | signingConfig signingConfigs.debug
55 | }
56 | }
57 | }
58 |
59 | flutter {
60 | source '../..'
61 | }
62 |
63 | dependencies {
64 | // Uncomment the line if you want to use firebase
65 | // implementation 'com.google.firebase:firebase-analytics:17.2.2'
66 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
67 | api 'com.google.firebase:firebase-ml-vision-image-label-model:17.0.2'
68 |
69 | }
70 |
--------------------------------------------------------------------------------
/lib/utils/websocket.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'dart:math';
3 | import 'dart:convert';
4 | import 'dart:async';
5 |
6 | typedef void OnMessageCallback(dynamic msg);
7 | typedef void OnCloseCallback(int code, String reason);
8 | typedef void OnOpenCallback();
9 |
10 | class SimpleWebSocket {
11 | String _url;
12 | var _socket;
13 | OnOpenCallback onOpen;
14 | OnMessageCallback onMessage;
15 | OnCloseCallback onClose;
16 | SimpleWebSocket(this._url);
17 |
18 | connect() async {
19 | try {
20 | //_socket = await WebSocket.connect(_url);
21 | _socket = await _connectForSelfSignedCert(_url);
22 | this?.onOpen();
23 | _socket.listen((data) {
24 | this?.onMessage(data);
25 | }, onDone: () {
26 | this?.onClose(_socket.closeCode, _socket.closeReason);
27 | });
28 | } catch (e) {
29 | this.onClose(500, e.toString());
30 | }
31 | }
32 |
33 | send(data) {
34 | if (_socket != null) {
35 | _socket.add(data);
36 | print('send: $data');
37 | }
38 | }
39 |
40 | close() {
41 | if (_socket != null) _socket.close();
42 | }
43 |
44 | Future _connectForSelfSignedCert(url) async {
45 | try {
46 | Random r = new Random();
47 | String key = base64.encode(List.generate(8, (_) => r.nextInt(255)));
48 | HttpClient client = HttpClient(context: SecurityContext());
49 | client.badCertificateCallback =
50 | (X509Certificate cert, String host, int port) {
51 | print(
52 | 'SimpleWebSocket: Allow self-signed certificate => $host:$port. ');
53 | return true;
54 | };
55 |
56 | HttpClientRequest request =
57 | await client.getUrl(Uri.parse(url)); // form the correct url here
58 | request.headers.add('Connection', 'Upgrade');
59 | request.headers.add('Upgrade', 'websocket');
60 | request.headers.add(
61 | 'Sec-WebSocket-Version', '13'); // insert the correct version here
62 | request.headers.add('Sec-WebSocket-Key', key.toLowerCase());
63 |
64 | HttpClientResponse response = await request.close();
65 | // ignore: close_sinks
66 | Socket socket = await response.detachSocket();
67 | var webSocket = WebSocket.fromUpgradedSocket(
68 | socket,
69 | protocol: 'signaling',
70 | serverSide: false,
71 | );
72 |
73 | return webSocket;
74 | } catch (e) {
75 | throw e;
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/lib/utils/rest_ds.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:io';
3 |
4 | import 'package:openemr/models/patient.dart';
5 | import 'package:openemr/utils/network.dart';
6 | import 'package:openemr/models/user.dart';
7 | import 'package:openemr/const/strings.dart';
8 |
9 | class RestDatasource {
10 | NetworkUtil _netUtil = new NetworkUtil();
11 |
12 | Future login(String username, String password, String url) {
13 | url = url == null ? "" : url;
14 | return _netUtil.post(url + loginendpoint, body: {
15 | "grant_type": "password",
16 | "username": username,
17 | "password": password,
18 | "scope": "default"
19 | }).then((dynamic res) {
20 | if (res == null) throw new Exception("Invalid Login Credentials");
21 | res['username'] = username;
22 | res['baseUrl'] = url;
23 | res['password'] = password;
24 | return new User.map(res);
25 | });
26 | }
27 |
28 | Future> getPatientList(baseUrl, token) {
29 | Map headers = {"Authorization": token};
30 | return _netUtil
31 | .get(baseUrl + patientendpoint, headers: headers)
32 | .then((dynamic res) {
33 | if (res == null) throw new Exception("Error fetching data");
34 | var patientList = new List.empty(growable: true);
35 | if (res["data"] != null) {
36 | res = res["data"];
37 | }
38 | res.forEach((patient) => {patientList.add(Patient.map(patient))});
39 | return patientList;
40 | });
41 | }
42 |
43 | Future addPatient({
44 | baseUrl,
45 | token,
46 | title,
47 | fname,
48 | mname,
49 | lname,
50 | dob,
51 | sex,
52 | street,
53 | postalcode,
54 | city,
55 | state,
56 | countrycode,
57 | phonecontact,
58 | race,
59 | ethnicity,
60 | }) {
61 | Map headers = {"Authorization": token};
62 | return _netUtil.post(baseUrl + addpatientendpoint, headers: headers, body: {
63 | "title": title,
64 | "fname": fname,
65 | "mname": mname,
66 | "lname": lname,
67 | "DOB": dob,
68 | "sex": sex,
69 | "street": street,
70 | "postal_code": postalcode,
71 | "city": city,
72 | "state": state,
73 | "country_code": countrycode,
74 | "phone_contact": phonecontact,
75 | "race": race,
76 | "ethnicity": ethnicity,
77 | }).then((dynamic res) {
78 | if (res["data"] != null) {
79 | res = res["data"];
80 | }
81 | return res;
82 | });
83 | }
84 |
85 | Future textRecognition(File img, ip) {
86 | return _netUtil
87 | .upload("https://" + ip + ":8086/ocrImage", img)
88 | .then((dynamic res) {
89 | return res;
90 | });
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: openemr
2 | description: A new Flutter project.
3 |
4 | version: 2.2+5
5 |
6 | environment:
7 | sdk: '>=2.3.0 <3.0.0'
8 |
9 | dependencies:
10 | json_store: ^1.1.0
11 | flutter:
12 | sdk: flutter
13 | getwidget: ^1.2.4
14 | webview_flutter: ^0.3.19+6
15 | cupertino_icons: ^0.1.2
16 | charts_flutter: ^0.9.0
17 | wakelock: ^0.1.4+1
18 | image_picker: ^0.6.7+22
19 | dash_chat: ^1.1.8
20 | camera: ^0.6.4+3
21 | barcode_scan: ^3.0.1
22 | shared_preferences: ^0.5.8
23 | firebase_storage: ^3.1.6
24 | cloud_firestore: ^0.13.7
25 | firebase_auth: ^0.16.1
26 | flutter_webrtc: ^0.2.8
27 | google_sign_in: ^4.4.0
28 | flutter_auth_buttons: ^0.8.0
29 | firebase_ml_vision: ^0.9.6+2
30 | http: ^0.12.2
31 | modal_progress_hud: ^0.1.3
32 |
33 | dev_dependencies:
34 | flutter_test:
35 | sdk: flutter
36 |
37 | flutter:
38 | uses-material-design: true
39 | assets:
40 | - lib/assets/images/image.png
41 | - lib/assets/images/image1.png
42 | - lib/assets/images/red.png
43 | - lib/assets/images/purple.png
44 | - lib/assets/images/pink.png
45 | - lib/assets/images/orange.png
46 | - lib/assets/images/image2.png
47 | - lib/assets/images/img.png
48 | - lib/assets/images/img1.png
49 | - lib/assets/images/img2.png
50 | - lib/assets/images/card.png
51 | - lib/assets/images/card1.png
52 | - lib/assets/images/card2.png
53 | - lib/assets/images/card3.png
54 | - lib/assets/images/card5.png
55 | - lib/assets/images/card4.png
56 | - lib/assets/images/gflogo.png
57 | - lib/assets/images/avatar1.png
58 | - lib/assets/images/avatar2.png
59 | - lib/assets/images/avatar3.png
60 | - lib/assets/images/avatar4.png
61 | - lib/assets/images/avatar5.png
62 | - lib/assets/images/avatar6.png
63 | - lib/assets/images/avatar7.png
64 | - lib/assets/images/avatar8.png
65 | - lib/assets/images/avatar9.png
66 | - lib/assets/images/avatar10.png
67 | - lib/assets/images/avatar11.png
68 | - lib/assets/images/avatar12.png
69 | - lib/assets/images/firebase.png
70 | - lib/assets/gif/success1.gif
71 | - lib/assets/icons/gflogo.png
72 | - lib/assets/images/logo.png
73 |
74 | fonts:
75 | - family: GFFontIcons
76 | fonts:
77 | - asset: lib/assets/fonts/gfFontIcon.ttf
78 | weight: 400
79 |
80 | - family: GFFontIcons2
81 | fonts:
82 | - asset: lib/assets/fonts/gfFontIcons2.ttf
83 | weight: 400
84 |
85 | - family: GFSocialFonts
86 | fonts:
87 | - asset: lib/assets/fonts/gfSocialFonts.ttf
88 | weight: 400
89 |
90 | - family: GFIconFonts
91 | fonts:
92 | - asset: lib/assets/fonts/gfIconFonts.ttf
93 | weight: 400
94 |
95 | - family: GFIcons
96 | fonts:
97 | - asset: lib/assets/fonts/loader.ttf
98 | weight: 400
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
12 |
19 |
23 |
27 |
32 |
36 |
37 |
38 |
39 |
40 |
41 |
43 |
46 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/lib/screens/telehealth/local_widgets/profileShimmer.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:getwidget/components/shimmer/gf_shimmer.dart';
3 |
4 | Widget profileShimmer(BuildContext context) {
5 | return GFShimmer(
6 | child: Column(
7 | crossAxisAlignment: CrossAxisAlignment.center,
8 | children: [
9 | SizedBox(
10 | height: 40,
11 | ),
12 | Container(
13 | height: 100,
14 | width: MediaQuery.of(context).size.width * 0.8,
15 | color: Colors.white,
16 | ),
17 | SizedBox(
18 | height: 10,
19 | ),
20 | Row(
21 | mainAxisAlignment: MainAxisAlignment.center,
22 | crossAxisAlignment: CrossAxisAlignment.start,
23 | children: [
24 | CircleAvatar(
25 | backgroundColor: Colors.white,
26 | radius: 40,
27 | ),
28 | Container(
29 | padding: const EdgeInsets.fromLTRB(10, 5, 5, 5),
30 | child: Column(
31 | crossAxisAlignment: CrossAxisAlignment.start,
32 | children: [
33 | Container(
34 | height: 25,
35 | width: MediaQuery.of(context).size.width * 0.55,
36 | color: Colors.white,
37 | ),
38 | SizedBox(height: 10),
39 | Container(
40 | height: 20,
41 | width: MediaQuery.of(context).size.width * 0.5,
42 | color: Colors.white,
43 | ),
44 | ],
45 | ),
46 | )
47 | ],
48 | ),
49 | Container(
50 | margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 15),
51 | child: Column(
52 | crossAxisAlignment: CrossAxisAlignment.start,
53 | children: [
54 | Container(
55 | height: 25,
56 | width: MediaQuery.of(context).size.width * 0.7,
57 | color: Colors.white,
58 | ),
59 | SizedBox(height: 10),
60 | Container(
61 | height: 20,
62 | width: MediaQuery.of(context).size.width * 0.7,
63 | color: Colors.white,
64 | ),
65 | ],
66 | ),
67 | ),
68 | Row(
69 | mainAxisAlignment: MainAxisAlignment.center,
70 | children: [
71 | Container(
72 | margin: const EdgeInsets.all(5),
73 | height: 100,
74 | width: 100,
75 | color: Colors.white,
76 | ),
77 | Container(
78 | margin: const EdgeInsets.all(5),
79 | height: 100,
80 | width: 100,
81 | color: Colors.white,
82 | ),
83 | Container(
84 | margin: const EdgeInsets.all(5),
85 | height: 100,
86 | width: 100,
87 | color: Colors.white,
88 | ),
89 | ],
90 | )
91 | ],
92 | ));
93 | }
94 |
--------------------------------------------------------------------------------
/lib/models/patient.dart:
--------------------------------------------------------------------------------
1 | class Patient {
2 | String _id;
3 | String _pid;
4 | String _pubpid;
5 | String _title;
6 | String _fname;
7 | String _mname;
8 | String _lname;
9 | String _street;
10 | String _postalCode;
11 | String _city;
12 | String _state;
13 | String _countryCode;
14 | String _phoneContact;
15 | String _dob;
16 | String _sex;
17 | String _race;
18 | String _ethnicity;
19 | String _username;
20 | String _tokenType;
21 | String _accessToken;
22 | String _userId;
23 |
24 | String get pid => _pid;
25 | String get title => _title;
26 | String get fname => _fname;
27 | String get mname => _mname;
28 | String get lname => _lname;
29 | String get sex => _sex;
30 |
31 | Patient(
32 | this._accessToken,
33 | this._tokenType,
34 | this._userId,
35 | this._username,
36 | this._city,
37 | this._countryCode,
38 | this._dob,
39 | this._ethnicity,
40 | this._fname,
41 | this._id,
42 | this._lname,
43 | this._mname,
44 | this._phoneContact,
45 | this._pid,
46 | this._postalCode,
47 | this._pubpid,
48 | this._race,
49 | this._sex,
50 | this._state,
51 | this._street,
52 | this._title);
53 |
54 | Patient.map(dynamic obj) {
55 | this._accessToken = obj["access_token"];
56 | this._tokenType = obj["token_type"];
57 | this._userId = obj["user_id"];
58 | this._username = obj["username"];
59 | this._city = obj["city"];
60 | this._countryCode = obj["country_code"];
61 | this._dob = obj["DOB"];
62 | this._ethnicity = obj["ethnicity"];
63 | this._fname = obj["fname"];
64 | this._id = obj["id"];
65 | this._lname = obj["lname"];
66 | this._mname = obj["mname"];
67 | this._phoneContact = obj["phone_contact"];
68 | this._pid = obj["pid"];
69 | this._postalCode = obj["postal_code"];
70 | this._pubpid = obj["pubpid"];
71 | this._race = obj["race"];
72 | this._sex = obj["sex"];
73 | this._state = obj["state"];
74 | this._street = obj["street"];
75 | this._title = obj["title"];
76 | }
77 |
78 | Map toMap() {
79 | var map = new Map();
80 | map["access_token"] = _accessToken;
81 | map["token_type"] = _tokenType;
82 | map["user_id"] = _userId;
83 | map["username"] = _username;
84 | map["city"] = _city;
85 | map["country_code"] = _countryCode;
86 | map["DOB"] = _dob;
87 | map["ethnicity"] = _ethnicity;
88 | map["fname"] = _fname;
89 | map["id"] = _id;
90 | map["lname"] = _lname;
91 | map["mname"] = _mname;
92 | map["phone_contact"] = _phoneContact;
93 | map["pid"] = _pid;
94 | map["postal_code"] = _postalCode;
95 | map["pubpid"] = _pubpid;
96 | map["race"] = _race;
97 | map["sex"] = _sex;
98 | map["state"] = _state;
99 | map["street"] = _street;
100 | map["title"] = _title;
101 | return map;
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | Thank you for your contribution. OpenEMR (and global healthcare) continues to get better because of people like you!
2 |
3 | The maintainers of OpenEMR want to get your pull request in as seamlessly as possible, so please ensure your code is consistent with our [development policies](https://open-emr.org/wiki/index.php/Development_Policies).
4 |
5 |
6 | We look forward to your contribution...
7 |
8 | ## Financial contributions
9 |
10 | We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/openemr).
11 | Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed.
12 |
13 | ## Credits
14 |
15 | ### Contributors
16 |
17 | Thank you to all the people who have already contributed to openemr!
18 |
19 |
20 | ### Backers
21 |
22 | Thank you to all our backers! [[Become a backer](https://opencollective.com/openemr#backer)]
23 |
24 |
25 |
26 | ### Sponsors
27 |
28 | Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/openemr#sponsor))
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OpenEMRv2.2
2 |
3 | [OpenEMR](https://open-emr.org) is the most popular open source electronic health records and medical practice management solution.
4 | ## What's New?
5 | - Warnings has been removed
6 | - Deprecated has been fixed
7 | - Api has been improved
8 | - Databse has been added to medical recognition
9 |
10 | ## Future Work
11 | -> Error message based on API response (In Progress)
12 |
13 | ## For Developers
14 |
15 | If using OpenEMR directly from the code repository, then the following commands will build OpenEMR apk :
16 |
17 | ```shell
18 | flutter pub get
19 | flutter build apk|appbundle|ios|ios-framework
20 | ```
21 |
22 | To run openemr in a device
23 |
24 | ```shell
25 | flutter pub get
26 | flutter run
27 | ```
28 | ### How to use calling feature
29 | 1. Run the [app-golang-openemr](https://github.com/openemr/app-golang-openemr/tree/c6930bb8f84e572234daaa071add316334a247f5)
30 | 2. Enter the server ip address in the prompt
31 | 
32 |
33 | ### How to Setup Firebase
34 |
35 | #### Project Creation
36 |
37 | 1. Go to [Firebase console](https://console.firebase.google.com/)
38 | 2. Login and click on `Add Project` card
39 | 
40 | 3. Enter desired project name and click on `Continue` button
41 | 
42 | 4. Disable Google Analytics if you want but we suggest you to keep it as it is and click on `Continue` button
43 | 
44 | 5. Select default or desired account and click on `Continue`. (will not appear if you have disabled Google Analytics in previous step)
45 | 
46 |
47 | #### Android - Connection
48 |
49 | 1. Select `Android` on home-page of your project
50 | 
51 | 2. Enter a `com.example.openemr` as package name. You can checkout this post if you want to [use custom package name](https://medium.com/@skyblazar.cc/how-to-change-the-package-name-of-your-flutter-app-4529e6e6e6fc)
52 | 
53 | 3. Enter the `SHA-1 hash`. [You can get the SHA-1 using this link](https://developers.google.com/android/guides/client-auth)
54 | 4. Click on `register app` button
55 | 5. Click on `Download google-services.json`. A json file will be downloaded to your desktop.
56 | 
57 | 6. Click on `next` button then again click on `next` button followed by `skip this step` button.
58 | 7. Place the `google-services.json` in `android/app` directory.
59 | 8. Go to `android/build.gradle` and uncomment `line 12`
60 | 9. Go to `android/app/build.gradle` and uncomment `line 26 & 65`
61 |
62 | #### IOS - Connection
63 |
64 | Coming soon
65 |
66 | #### Enable Firebase services
67 |
68 | 1. Authentication(Used for login/register)
69 | - Enable Email / Password
70 | 
71 | - Enable Google
72 | 
73 | 2. Database(Used to store messages)
74 | 
75 | 3. Firestore(Used to store images shared in chat)
76 | 
77 |
78 | #### Final step - turn firebase flag on
79 |
80 | Go to `lib/screens/home.dart` and change `firebaseFlag` to `true` from `false`
81 |
82 | ```diff
83 | - final firebaseFlag = false;
84 | + final firebaseFlag = true;
85 | ```
86 |
87 | ## License
88 |
89 | [GNU GPL](LICENSE)
90 |
--------------------------------------------------------------------------------
/lib/utils/network.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:convert';
3 | import 'dart:io';
4 | import 'package:http/http.dart' as http;
5 | import 'package:http_parser/http_parser.dart';
6 | import 'package:path/path.dart';
7 | import 'common.dart';
8 |
9 | class NetworkUtil {
10 | // next three lines makes this class a Singleton
11 | static NetworkUtil _instance = new NetworkUtil.internal();
12 | NetworkUtil.internal();
13 | factory NetworkUtil() => _instance;
14 |
15 | final JsonDecoder _decoder = new JsonDecoder();
16 |
17 | Future get(String url, {Map headers}) {
18 | if (!isValidUrl(url)) {
19 | return Future.error("Invalid API URL");
20 | }
21 | return http.get(url, headers: headers).then((http.Response response) {
22 | final String res = response.body;
23 | final int statusCode = response.statusCode;
24 |
25 | if (statusCode < 200 || statusCode > 400 || json == null) {
26 | throw new Exception("Error while fetching data");
27 | }
28 | return _decoder.convert(res);
29 | });
30 | }
31 |
32 | Future post(String url, {Map headers, body, encoding}) {
33 | if (!isValidUrl(url)) {
34 | return Future.error("Invalid API URL");
35 | }
36 | return http
37 | .post(url,
38 | body: json.encode(body), headers: headers, encoding: encoding)
39 | .then((http.Response response) {
40 | final res = response.body;
41 | final int statusCode = response.statusCode;
42 | if (statusCode == 401) {
43 | throw new Exception(statusCode.toString() + "Invalid Credentials");
44 | } else if (statusCode == 400) {
45 | final resData = json.decode(res);
46 | var validationErrorData = resData['validationErrors'];
47 | List