diff --git a/android/app/build.gradle b/android/app/build.gradle
index b7605ad0..96428f49 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -39,7 +39,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.hmg.hmgDr"
- minSdkVersion 18
+ minSdkVersion 21
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
@@ -54,6 +54,11 @@ android {
signingConfig signingConfigs.debug
}
}
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
}
flutter {
@@ -65,6 +70,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
@@ -74,9 +80,10 @@ dependencies {
//permissions
implementation 'pub.devrel:easypermissions:0.4.0'
//retrofit
- implementation 'com.squareup.retrofit2:retrofit:2.6.2'
+ implementation 'com.squareup.retrofit2:retrofit:2.9.0'
+ implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.2'
- implementation 'com.squareup.okhttp3:logging-interceptor:3.14.1'
+ implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
}
apply plugin: 'com.google.gms.google-services'
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index c656ebbf..bf0d3766 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -9,18 +9,24 @@
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here.
-->
-
-
-
+
+
+
+
+
+
+
+
+
+
-
("kApiKey")
- val sessionId = call.argument("kSessionId")
- val token = call.argument("kToken")
- val appLang = call.argument("appLang")
- val baseUrl = call.argument("baseUrl")
+ when (call.method) {
+ "openVideoCall" -> {
+ val apiKey = call.argument("kApiKey")
+ val sessionId = call.argument("kSessionId")
+ val token = call.argument("kToken")
+ val appLang = call.argument("appLang")
+ val baseUrl = call.argument("baseUrl")
+
+ // Session Status model
+ val VC_ID = call.argument("VC_ID")
+ val tokenID = call.argument("TokenID")
+ val generalId = call.argument("generalId")
+ val doctorId = call.argument("DoctorId")
+ val patientName = call.argument("patientName")
- // Session Status model
- val VC_ID = call.argument("VC_ID")
- val tokenID = call.argument("TokenID")
- val generalId = call.argument("generalId")
- val doctorId = call.argument("DoctorId")
+ val sessionStatusModel = GetSessionStatusModel(VC_ID, tokenID, generalId, doctorId, patientName)
- val sessionStatusModel = GetSessionStatusModel(VC_ID, tokenID, generalId, doctorId)
+ openVideoCall(apiKey, sessionId, token, appLang, baseUrl, sessionStatusModel)
- openVideoCall(apiKey, sessionId, token, appLang, baseUrl, sessionStatusModel)
+ }
+ "closeVideoCall" -> {
+ dialogFragment?.onCallClicked()
+ }
+ "onCallConnected" -> {
- } else {
- result.notImplemented()
+ }
+ else -> {
+ result.notImplemented()
+ }
}
}
private fun openVideoCall(apiKey: String?, sessionId: String?, token: String?, appLang: String?, baseUrl: String?, sessionStatusModel: GetSessionStatusModel) {
- // val videoCallActivity = VideoCallActivity()
+ if (dialogFragment == null) {
+ val arguments = Bundle()
+ arguments.putString("apiKey", apiKey)
+ arguments.putString("sessionId", sessionId)
+ arguments.putString("token", token)
+ arguments.putString("appLang", appLang)
+ arguments.putString("baseUrl", baseUrl)
+ arguments.putParcelable("sessionStatusModel", sessionStatusModel)
+
+ val transaction = supportFragmentManager.beginTransaction()
+ dialogFragment = VideoCallFragment.newInstance(arguments)
+ dialogFragment?.let {
+ it.setCallListener(this)
+ it.isCancelable = true
+ if (it.isAdded){
+ it.dismiss()
+ }else {
+ it.show(transaction, "dialog")
+ }
- val intent = Intent(this, VideoCallActivity::class.java)
- intent.putExtra("apiKey", apiKey)
- intent.putExtra("sessionId", sessionId)
- intent.putExtra("token", token)
- intent.putExtra("appLang", appLang)
- intent.putExtra("baseUrl", baseUrl)
- intent.putExtra("sessionStatusModel", sessionStatusModel)
- startActivityForResult(intent, LAUNCH_VIDEO)
+ }
+ } else if (!dialogFragment!!.isVisible) {
+ val transaction = supportFragmentManager.beginTransaction()
+ dialogFragment!!.show(transaction, "dialog")
+ }
}
- override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
- super.onActivityResult(requestCode, resultCode, data)
- var asd = "";
- if (requestCode == LAUNCH_VIDEO) {
- if (resultCode == Activity.RESULT_OK) {
- val result : SessionStatusModel? = data?.getParcelableExtra("sessionStatusNotRespond")
- val callResponse : HashMap = HashMap()
+ /* override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ var asd = "";
+ if (requestCode == LAUNCH_VIDEO) {
+ if (resultCode == Activity.RESULT_OK) {
+ val result : SessionStatusModel? = data?.getParcelableExtra("sessionStatusNotRespond")
+ val callResponse : HashMap = HashMap()
+
+ val sessionStatus : HashMap = HashMap()
+ val gson = GsonBuilder().serializeNulls().create()
- val sessionStatus : HashMap = HashMap()
- val gson = GsonBuilder().serializeNulls().create()
+ callResponse["callResponse"] = "CallNotRespond"
+ val jsonRes = gson.toJson(result)
+ callResponse["sessionStatus"] = jsonRes
- callResponse["callResponse"] = "CallNotRespond"
- val jsonRes = gson.toJson(result)
- callResponse["sessionStatus"] = jsonRes
+ this.result?.success(callResponse)
+ }
+ if (resultCode == Activity.RESULT_CANCELED) {
+ val callResponse : HashMap = HashMap()
+ callResponse["callResponse"] = "CallEnd"
+ result?.success(callResponse)
+ }
+ }
+ }*/
+
+ override fun onCallFinished(resultCode: Int, intent: Intent?) {
+ dialogFragment = null
+
+ if (resultCode == Activity.RESULT_OK) {
+ val result: SessionStatusModel? = intent?.getParcelableExtra("sessionStatusNotRespond")
+ val callResponse: HashMap = HashMap()
+
+ val sessionStatus: HashMap = HashMap()
+ val gson = GsonBuilder().serializeNulls().create()
+
+ callResponse["callResponse"] = "CallNotRespond"
+ val jsonRes = gson.toJson(result)
+ callResponse["sessionStatus"] = jsonRes
+
+ try {
this.result?.success(callResponse)
+ } catch (e : Exception){
+ Log.e("onVideoCallFinished", "${e.message}.")
}
- if (resultCode == Activity.RESULT_CANCELED) {
- val callResponse : HashMap = HashMap()
- callResponse["callResponse"] = "CallEnd"
-
+ } else if (resultCode == Activity.RESULT_CANCELED) {
+ val callResponse: HashMap = HashMap()
+ callResponse["callResponse"] = "CallEnd"
+ try {
result?.success(callResponse)
+ } catch (e : Exception){
+ Log.e("onVideoCallFinished", "${e.message}.")
}
}
}
+ override fun errorHandle(message: String) {
+ dialogFragment = null
+// Toast.makeText(this, message, Toast.LENGTH_LONG).show()
+ }
+
+ override fun minimizeVideoEvent(isMinimize: Boolean) {
+ if (isMinimize)
+ methodChannel.invokeMethod("onCallConnected", null)
+ else
+ methodChannel.invokeMethod("onCallDisconnected", null)
+ }
+
+ override fun onBackPressed() {
+ super.onBackPressed()
+ }
}
diff --git a/android/app/src/main/kotlin/com/hmg/hmgDr/Model/GetSessionStatusModel.java b/android/app/src/main/kotlin/com/hmg/hmgDr/Model/GetSessionStatusModel.java
index d41aa146..60350539 100644
--- a/android/app/src/main/kotlin/com/hmg/hmgDr/Model/GetSessionStatusModel.java
+++ b/android/app/src/main/kotlin/com/hmg/hmgDr/Model/GetSessionStatusModel.java
@@ -20,15 +20,19 @@ public class GetSessionStatusModel implements Parcelable {
@SerializedName("DoctorId")
@Expose
private Integer doctorId;
+ @SerializedName("PatientName")
+ @Expose
+ private String patientName;
public GetSessionStatusModel() {
}
- public GetSessionStatusModel(Integer vCID, String tokenID, String generalid, Integer doctorId) {
+ public GetSessionStatusModel(Integer vCID, String tokenID, String generalid, Integer doctorId, String patientName) {
this.vCID = vCID;
this.tokenID = tokenID;
this.generalid = generalid;
this.doctorId = doctorId;
+ this.patientName = patientName;
}
protected GetSessionStatusModel(Parcel in) {
@@ -44,6 +48,7 @@ public class GetSessionStatusModel implements Parcelable {
} else {
doctorId = in.readInt();
}
+ patientName = in.readString();
}
public static final Creator CREATOR = new Creator() {
@@ -90,6 +95,16 @@ public class GetSessionStatusModel implements Parcelable {
this.doctorId = doctorId;
}
+ public String getPatientName() {
+ if (patientName == null)
+ patientName = "-";
+ return patientName;
+ }
+
+ public void setPatientName(String patientName) {
+ this.patientName = patientName;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -111,5 +126,6 @@ public class GetSessionStatusModel implements Parcelable {
dest.writeByte((byte) 1);
dest.writeInt(doctorId);
}
+ dest.writeString(patientName);
}
}
diff --git a/android/app/src/main/kotlin/com/hmg/hmgDr/ui/VideoCallActivity.java b/android/app/src/main/kotlin/com/hmg/hmgDr/ui/VideoCallActivity.java
deleted file mode 100644
index 1c907089..00000000
--- a/android/app/src/main/kotlin/com/hmg/hmgDr/ui/VideoCallActivity.java
+++ /dev/null
@@ -1,442 +0,0 @@
-package com.hmg.hmgDr.ui;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
-
-import android.Manifest;
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.content.Intent;
-import android.opengl.GLSurfaceView;
-import android.os.Bundle;
-import android.os.CountDownTimer;
-import android.os.Handler;
-import android.util.Log;
-import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.ProgressBar;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import com.hmg.hmgDr.Model.ChangeCallStatusRequestModel;
-import com.hmg.hmgDr.Model.GetSessionStatusModel;
-import com.hmg.hmgDr.Model.SessionStatusModel;
-import com.hmg.hmgDr.R;
-import com.opentok.android.Session;
-import com.opentok.android.Stream;
-import com.opentok.android.Publisher;
-import com.opentok.android.PublisherKit;
-import com.opentok.android.Subscriber;
-import com.opentok.android.BaseVideoRenderer;
-import com.opentok.android.OpentokError;
-import com.opentok.android.SubscriberKit;
-
-import java.util.List;
-import java.util.Objects;
-
-import pub.devrel.easypermissions.AfterPermissionGranted;
-import pub.devrel.easypermissions.AppSettingsDialog;
-import pub.devrel.easypermissions.EasyPermissions;
-
-public class VideoCallActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks,
- Session.SessionListener,
- Publisher.PublisherListener,
- Subscriber.VideoListener, VideoCallContract.VideoCallView {
-
- private static final String TAG = VideoCallActivity.class.getSimpleName();
-
- VideoCallContract.VideoCallPresenter videoCallPresenter;
-
- private static final int RC_SETTINGS_SCREEN_PERM = 123;
- private static final int RC_VIDEO_APP_PERM = 124;
-
-
- private Session mSession;
- private Publisher mPublisher;
- private Subscriber mSubscriber;
-
- private Handler mVolHandler, mConnectedHandler;
- private Runnable mVolRunnable, mConnectedRunnable;
-
- private FrameLayout mPublisherViewContainer;
- private RelativeLayout mSubscriberViewContainer;
- private RelativeLayout controlPanel;
-
- private String apiKey;
- private String sessionId;
- private String token;
- private String appLang;
- private String baseUrl;
-
- private boolean isSwitchCameraClicked;
- private boolean isCameraClicked;
- private boolean isSpeckerClicked;
- private boolean isMicClicked;
-
- private ImageView mCallBtn;
- private ImageView mCameraBtn;
- private ImageView mSwitchCameraBtn;
- private ImageView mspeckerBtn;
- private ImageView mMicBtn;
-
- private ProgressBar progressBar;
- private CountDownTimer countDownTimer;
- private TextView progressBarTextView;
- private RelativeLayout progressBarLayout;
-
- private boolean isConnected = false;
-
- private GetSessionStatusModel sessionStatusModel;
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- setTheme(R.style.AppTheme);
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_video_call);
- Objects.requireNonNull(getSupportActionBar()).hide();
- initUI();
- requestPermissions();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
-
- if (mSession == null) {
- return;
- }
- mSession.onPause();
-
- if (isFinishing()) {
- disconnectSession();
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- if (mSession == null) {
- return;
- }
- mSession.onResume();
- }
-
- @Override
- protected void onDestroy() {
- disconnectSession();
-
- super.onDestroy();
- }
-
- @SuppressLint("ClickableViewAccessibility")
- private void initUI() {
- mPublisherViewContainer = (FrameLayout) findViewById(R.id.local_video_view_container);
- mSubscriberViewContainer = (RelativeLayout) findViewById(R.id.remote_video_view_container);
-
- apiKey = getIntent().getStringExtra("apiKey");
- sessionId = getIntent().getStringExtra("sessionId");
- token = getIntent().getStringExtra("token");
- appLang = getIntent().getStringExtra("appLang");
- baseUrl = getIntent().getStringExtra("baseUrl");
- sessionStatusModel = getIntent().getParcelableExtra("sessionStatusModel");
-
- controlPanel = findViewById(R.id.control_panel);
-
- videoCallPresenter = new VideoCallPresenterImpl(this, baseUrl);
-
-
- mCallBtn = findViewById(R.id.btn_call);
- mCameraBtn = findViewById(R.id.btn_camera);
- mSwitchCameraBtn = findViewById(R.id.btn_switch_camera);
- mspeckerBtn = findViewById(R.id.btn_specker);
- mMicBtn = findViewById(R.id.btn_mic);
-
- // progressBarLayout=findViewById(R.id.progressBar);
- // progressBar=findViewById(R.id.progress_bar);
-// progressBarTextView=findViewById(R.id.progress_bar_text);
-// progressBar.setVisibility(View.GONE);
-
- hiddenButtons();
-
- checkClientConnected();
-
- mSubscriberViewContainer.setOnTouchListener((v, event) -> {
- controlPanel.setVisibility(View.VISIBLE);
- mVolHandler.removeCallbacks(mVolRunnable);
- mVolHandler.postDelayed(mVolRunnable, 5 * 1000);
- return true;
- });
-
- if (appLang.equals("ar")) {
- progressBarLayout.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
- }
-
- }
-
- private void checkClientConnected() {
- mConnectedHandler = new Handler();
- mConnectedRunnable = () -> {
- if (!isConnected) {
- videoCallPresenter.callClintConnected(sessionStatusModel);
- }
- };
- mConnectedHandler.postDelayed(mConnectedRunnable, 30 * 1000);
-
- }
-
- private void hiddenButtons() {
- mVolHandler = new Handler();
- mVolRunnable = new Runnable() {
- public void run() {
- controlPanel.setVisibility(View.GONE);
- }
- };
- mVolHandler.postDelayed(mVolRunnable, 5 * 1000);
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
-
- EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
- }
-
- @Override
- public void onPermissionsGranted(int requestCode, List perms) {
- Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());
- }
-
- @Override
- public void onPermissionsDenied(int requestCode, List perms) {
- Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());
-
- if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
- new AppSettingsDialog.Builder(this)
- .setTitle(getString(R.string.title_settings_dialog))
- .setRationale(getString(R.string.rationale_ask_again))
- .setPositiveButton(getString(R.string.setting))
- .setNegativeButton(getString(R.string.cancel))
- .setRequestCode(RC_SETTINGS_SCREEN_PERM)
- .build()
- .show();
- }
- }
-
- @AfterPermissionGranted(RC_VIDEO_APP_PERM)
- private void requestPermissions() {
- String[] perms = {Manifest.permission.INTERNET, Manifest.permission.CAMERA,};
- if (EasyPermissions.hasPermissions(this, perms)) {
- try {
- mSession = new Session.Builder(this, apiKey, sessionId).build();
- mSession.setSessionListener(this);
- mSession.connect(token);
- } catch (Exception e) {
- e.printStackTrace();
- }
- } else {
- EasyPermissions.requestPermissions(this, getString(R.string.remaining_ar), RC_VIDEO_APP_PERM, perms);
- }
- }
-
- @Override
- public void onConnected(Session session) {
- Log.i(TAG, "Session Connected");
-
- mPublisher = new Publisher.Builder(this).build();
- mPublisher.setPublisherListener(this);
-
- mPublisherViewContainer.addView(mPublisher.getView());
-
- if (mPublisher.getView() instanceof GLSurfaceView) {
- ((GLSurfaceView) mPublisher.getView()).setZOrderOnTop(true);
- }
-
- mSession.publish(mPublisher);
- }
-
- @Override
- public void onDisconnected(Session session) {
- Log.d(TAG, "onDisconnected: disconnected from session " + session.getSessionId());
-
- mSession = null;
- }
-
- @Override
- public void onError(Session session, OpentokError opentokError) {
- Log.d(TAG, "onError: Error (" + opentokError.getMessage() + ") in session " + session.getSessionId());
-
- Toast.makeText(this, "Session error. See the logcat please.", Toast.LENGTH_LONG).show();
- finish();
- }
-
- @Override
- public void onStreamReceived(Session session, Stream stream) {
- Log.d(TAG, "onStreamReceived: New stream " + stream.getStreamId() + " in session " + session.getSessionId());
- if (mSubscriber != null) {
- isConnected = true;
- return;
- }
- isConnected = true;
- subscribeToStream(stream);
- videoCallPresenter.callChangeCallStatus(new ChangeCallStatusRequestModel(3,sessionStatusModel.getDoctorId(), sessionStatusModel.getGeneralid(),token,sessionStatusModel.getVCID()));
- }
-
- @Override
- public void onStreamDropped(Session session, Stream stream) {
- Log.d(TAG, "onStreamDropped: Stream " + stream.getStreamId() + " dropped from session " + session.getSessionId());
-
- if (mSubscriber == null) {
- return;
- }
-
- if (mSubscriber.getStream().equals(stream)) {
- mSubscriberViewContainer.removeView(mSubscriber.getView());
- mSubscriber.destroy();
- mSubscriber = null;
- }
- disconnectSession();
- }
-
- @Override
- public void onStreamCreated(PublisherKit publisherKit, Stream stream) {
- Log.d(TAG, "onStreamCreated: Own stream " + stream.getStreamId() + " created");
- }
-
- @Override
- public void onStreamDestroyed(PublisherKit publisherKit, Stream stream) {
- Log.d(TAG, "onStreamDestroyed: Own stream " + stream.getStreamId() + " destroyed");
- }
-
- @Override
- public void onError(PublisherKit publisherKit, OpentokError opentokError) {
- Log.d(TAG, "onError: Error (" + opentokError.getMessage() + ") in publisher");
-
- Toast.makeText(this, "Session error. See the logcat please.", Toast.LENGTH_LONG).show();
- finish();
- }
-
- @Override
- public void onVideoDataReceived(SubscriberKit subscriberKit) {
- mSubscriber.setStyle(BaseVideoRenderer.STYLE_VIDEO_SCALE, BaseVideoRenderer.STYLE_VIDEO_FILL);
- mSubscriberViewContainer.addView(mSubscriber.getView());
- }
-
- @Override
- public void onVideoDisabled(SubscriberKit subscriberKit, String s) {
-
- }
-
- @Override
- public void onVideoEnabled(SubscriberKit subscriberKit, String s) {
-
- }
-
- @Override
- public void onVideoDisableWarning(SubscriberKit subscriberKit) {
-
- }
-
- @Override
- public void onVideoDisableWarningLifted(SubscriberKit subscriberKit) {
-
- }
-
- private void subscribeToStream(Stream stream) {
- mSubscriber = new Subscriber.Builder(VideoCallActivity.this, stream).build();
- mSubscriber.setVideoListener(this);
- mSession.subscribe(mSubscriber);
- }
-
- private void disconnectSession() {
- if (mSession == null) {
- setResult(Activity.RESULT_CANCELED);
- finish();
- return;
- }
-
- if (mSubscriber != null) {
- mSubscriberViewContainer.removeView(mSubscriber.getView());
- mSession.unsubscribe(mSubscriber);
- mSubscriber.destroy();
- mSubscriber = null;
- }
-
- if (mPublisher != null) {
- mPublisherViewContainer.removeView(mPublisher.getView());
- mSession.unpublish(mPublisher);
- mPublisher.destroy();
- mPublisher = null;
- }
- mSession.disconnect();
- if (countDownTimer != null) {
- countDownTimer.cancel();
- }
- videoCallPresenter.callChangeCallStatus(new ChangeCallStatusRequestModel(16,sessionStatusModel.getDoctorId(), sessionStatusModel.getGeneralid(),token,sessionStatusModel.getVCID()));
- finish();
- }
-
- public void onSwitchCameraClicked(View view) {
- if (mPublisher != null) {
- isSwitchCameraClicked = !isSwitchCameraClicked;
- mPublisher.cycleCamera();
- int res = isSwitchCameraClicked ? R.drawable.flip_disapled : R.drawable.flip_enabled;
- mSwitchCameraBtn.setImageResource(res);
- }
- }
-
- public void onCameraClicked(View view) {
- if (mPublisher != null) {
- isCameraClicked = !isCameraClicked;
- mPublisher.setPublishVideo(!isCameraClicked);
- int res = isCameraClicked ? R.drawable.video_disanabled : R.drawable.video_enabled;
- mCameraBtn.setImageResource(res);
- }
- }
-
- public void onSpeckerClicked(View view) {
- if (mSubscriber != null) {
- isSpeckerClicked = !isSpeckerClicked;
- mSubscriber.setSubscribeToAudio(!isSpeckerClicked);
- int res = isSpeckerClicked ? R.drawable.audio_disabled : R.drawable.audio_enabled;
- mspeckerBtn.setImageResource(res);
- }
- }
-
- public void onMicClicked(View view) {
-
- if (mPublisher != null) {
- isMicClicked = !isMicClicked;
- mPublisher.setPublishAudio(!isMicClicked);
- int res = isMicClicked ? R.drawable.mic_disabled : R.drawable.mic_enabled;
- mMicBtn.setImageResource(res);
- }
- }
-
- public void onCallClicked(View view) {
- disconnectSession();
- }
-
- @Override
- public void onCallSuccessful(SessionStatusModel sessionStatusModel) {
- if (sessionStatusModel.getSessionStatus() == 2 || sessionStatusModel.getSessionStatus() == 3) {
- Intent returnIntent = new Intent();
- returnIntent.putExtra("sessionStatusNotRespond", sessionStatusModel);
- setResult(Activity.RESULT_OK, returnIntent);
- finish();
- }
- }
-
- @Override
- public void onCallChangeCallStatusSuccessful(SessionStatusModel sessionStatusModel) {
-
- }
-
- @Override
- public void onFailure() {
-
- }
-}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/hmg/hmgDr/ui/VideoCallResponseListener.kt b/android/app/src/main/kotlin/com/hmg/hmgDr/ui/VideoCallResponseListener.kt
new file mode 100644
index 00000000..204568a4
--- /dev/null
+++ b/android/app/src/main/kotlin/com/hmg/hmgDr/ui/VideoCallResponseListener.kt
@@ -0,0 +1,14 @@
+package com.hmg.hmgDr.ui
+
+import android.content.Intent
+
+interface VideoCallResponseListener {
+
+ fun onCallFinished(resultCode : Int, intent: Intent? = null)
+
+ fun errorHandle(message: String)
+
+ fun minimizeVideoEvent(isMinimize : Boolean)
+
+ fun onBackHandle(){}
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/hmg/hmgDr/ui/fragment/VideoCallFragment.kt b/android/app/src/main/kotlin/com/hmg/hmgDr/ui/fragment/VideoCallFragment.kt
new file mode 100644
index 00000000..35e28b23
--- /dev/null
+++ b/android/app/src/main/kotlin/com/hmg/hmgDr/ui/fragment/VideoCallFragment.kt
@@ -0,0 +1,893 @@
+package com.hmg.hmgDr.ui.fragment
+
+import android.Manifest
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.app.Dialog
+import android.content.Context
+import android.content.Intent
+import android.graphics.Color
+import android.graphics.Point
+import android.graphics.drawable.ColorDrawable
+import android.opengl.GLSurfaceView
+import android.os.*
+import android.util.Log
+import android.view.*
+import android.widget.*
+import androidx.annotation.Nullable
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.content.ContextCompat
+import androidx.core.view.GestureDetectorCompat
+import androidx.fragment.app.DialogFragment
+import com.hmg.hmgDr.Model.ChangeCallStatusRequestModel
+import com.hmg.hmgDr.Model.GetSessionStatusModel
+import com.hmg.hmgDr.Model.SessionStatusModel
+import com.hmg.hmgDr.R
+import com.hmg.hmgDr.ui.VideoCallContract.VideoCallPresenter
+import com.hmg.hmgDr.ui.VideoCallContract.VideoCallView
+import com.hmg.hmgDr.ui.VideoCallPresenterImpl
+import com.hmg.hmgDr.ui.VideoCallResponseListener
+import com.hmg.hmgDr.util.DynamicVideoRenderer
+import com.hmg.hmgDr.util.ThumbnailCircleVideoRenderer
+import com.opentok.android.*
+import com.opentok.android.PublisherKit.PublisherListener
+import pub.devrel.easypermissions.AfterPermissionGranted
+import pub.devrel.easypermissions.AppSettingsDialog
+import pub.devrel.easypermissions.EasyPermissions
+import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
+import kotlin.math.ceil
+
+
+class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.SessionListener, PublisherListener,
+ SubscriberKit.VideoListener, VideoCallView {
+
+ private var isFullScreen: Boolean = true
+ private var isCircle: Boolean = false
+ private var x_init_cord = 0
+ private var y_init_cord: Int = 0
+ private var x_init_margin: Int = 0
+ private var y_init_margin: Int = 0
+ private val szWindow: Point = Point()
+ private lateinit var mWindowManager: WindowManager
+ private var isLeft = true
+
+ private lateinit var videoCallPresenter: VideoCallPresenter
+
+ private var mSession: Session? = null
+ private var mPublisher: Publisher? = null
+ private var mSubscriber: Subscriber? = null
+
+ private var mVolHandler: Handler? = null
+ private var mConnectedHandler: Handler? = null
+ private var mVolRunnable: Runnable? = null
+ private var mConnectedRunnable: Runnable? = null
+
+ private lateinit var thumbnail_container: FrameLayout
+ private lateinit var mPublisherViewContainer: FrameLayout
+ private lateinit var mPublisherViewIcon: View
+ private lateinit var mSubscriberViewContainer: FrameLayout
+ private lateinit var mSubscriberViewIcon: ImageView
+ private lateinit var controlPanel: ConstraintLayout
+
+ private var apiKey: String? = null
+ private var sessionId: String? = null
+ private var token: String? = null
+ private var appLang: String? = null
+ private var baseUrl: String? = null
+
+ private var isSwitchCameraClicked = false
+ private var isCameraClicked = false
+ private var isSpeckerClicked = false
+ private var isMicClicked = false
+
+ private lateinit var parentView: View
+ private lateinit var videoCallContainer: ConstraintLayout
+ private lateinit var layoutName: RelativeLayout
+ private lateinit var layoutMini: RelativeLayout
+ private lateinit var icMini: ImageButton
+ private lateinit var mCallBtn: ImageView
+ private lateinit var btnMinimize: ImageView
+ private lateinit var mCameraBtn: ImageView
+ private lateinit var mSwitchCameraBtn: ImageView
+ private lateinit var mspeckerBtn: ImageView
+ private lateinit var mMicBtn: ImageView
+
+ private lateinit var patientName: TextView
+ private lateinit var cmTimer: Chronometer
+ private var elapsedTime: Long = 0
+ private var resume = false
+
+ private val progressBar: ProgressBar? = null
+ private val countDownTimer: CountDownTimer? = null
+ private val progressBarTextView: TextView? = null
+ private val progressBarLayout: RelativeLayout? = null
+
+ private var isConnected = false
+
+ private var sessionStatusModel: GetSessionStatusModel? = null
+ private var videoCallResponseListener: VideoCallResponseListener? = null
+ private lateinit var mDetector: GestureDetectorCompat
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ requireActivity().setTheme(R.style.AppTheme)
+ super.onCreate(savedInstanceState)
+ }
+
+ override fun onStart() {
+ super.onStart()
+
+ dialog?.window?.setLayout(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT
+ )
+ }
+
+ override fun getTheme(): Int {
+ return R.style.dialogTheme
+ }
+
+ override fun onCreateDialog(@Nullable savedInstanceState: Bundle?): Dialog {
+ val dialog: Dialog = super.onCreateDialog(savedInstanceState)
+
+ // Add back button listener
+ // Add back button listener
+ dialog.setOnKeyListener { _, keyCode, keyEvent ->
+ // getAction to make sure this doesn't double fire
+ if (keyCode == KeyEvent.KEYCODE_BACK && keyEvent.action == KeyEvent.ACTION_UP) {
+ videoCallResponseListener?.onBackHandle()
+ false // Capture onKey
+ } else true
+ // Don't capture
+ }
+
+ return dialog
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ // This is done in a post() since the dialog must be drawn before locating.
+ requireView().post {
+ val dialogWindow = dialog!!.window
+
+ if (dialog != null && dialogWindow != null) {
+ dialogWindow.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT));
+ }
+
+ // Make the dialog possible to be outside touch
+ dialogWindow!!.setFlags(
+ WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
+ WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ )
+ dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
+ requireView().invalidate()
+ }
+ }
+
+ fun setCallListener(videoCallResponseListener: VideoCallResponseListener) {
+ this.videoCallResponseListener = videoCallResponseListener
+ }
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?): View {
+
+ parentView = inflater.inflate(R.layout.activity_video_call, container, false)
+
+ // Objects.requireNonNull(requireActivity().actionBar)!!.hide()
+ arguments?.run {
+ apiKey = getString("apiKey")
+ sessionId = getString("sessionId")
+ token = getString("token")
+ appLang = getString("appLang")
+ baseUrl = getString("baseUrl")
+ sessionStatusModel = getParcelable("sessionStatusModel")
+ }
+ initUI(parentView)
+ requestPermissions()
+
+ handleDragDialog()
+ mDetector = GestureDetectorCompat(context, MyGestureListener({ showControlPanelTemporarily() }, { miniCircleDoubleTap() }))
+
+ return parentView
+ }
+
+
+ override fun onPause() {
+ super.onPause()
+ if (mSession == null) {
+ return
+ }
+ mSession!!.onPause()
+ if (requireActivity().isFinishing) {
+ disconnectSession()
+ }
+ }
+
+ override fun onResume() {
+ super.onResume()
+ if (mSession == null) {
+ return
+ }
+ mSession!!.onResume()
+ }
+
+ override fun onDestroy() {
+ disconnectSession()
+ cmTimer.stop()
+ super.onDestroy()
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ private fun initUI(view: View) {
+ videoCallContainer = view.findViewById(R.id.video_call_ll)
+ layoutName = view.findViewById(R.id.layout_name)
+ layoutMini = view.findViewById(R.id.layout_mini)
+ icMini = view.findViewById(R.id.ic_mini)
+ thumbnail_container = view.findViewById(R.id.thumbnail_container)
+ mPublisherViewContainer = view.findViewById(R.id.local_video_view_container)
+ mPublisherViewIcon = view.findViewById(R.id.local_video_view_icon)
+ mSubscriberViewIcon = view.findViewById(R.id.remote_video_view_icon)
+ mSubscriberViewContainer = view.findViewById(R.id.remote_video_view_container)
+
+ patientName = view.findViewById(R.id.patient_name)
+ patientName.text = sessionStatusModel!!.patientName
+
+ cmTimer = view.findViewById(R.id.cmTimer)
+ cmTimer.format = "mm:ss"
+ cmTimer.onChronometerTickListener = Chronometer.OnChronometerTickListener { arg0: Chronometer? ->
+ val minutes: Long
+ val seconds: Long
+ if (!resume) {
+ minutes = (SystemClock.elapsedRealtime() - cmTimer.base) / 1000 / 60
+ seconds = (SystemClock.elapsedRealtime() - cmTimer.base) / 1000 % 60
+ elapsedTime = SystemClock.elapsedRealtime()
+ } else {
+ minutes = (elapsedTime - cmTimer.base) / 1000 / 60
+ seconds = (elapsedTime - cmTimer.base) / 1000 % 60
+ elapsedTime += 1000
+ }
+ arg0?.text = "$minutes:$seconds"
+ Log.d(VideoCallFragment.TAG, "onChronometerTick: $minutes : $seconds")
+ }
+
+ icMini.setOnClickListener {
+ onMiniCircleClicked()
+ }
+
+ controlPanel = view.findViewById(R.id.control_panel)
+ videoCallPresenter = VideoCallPresenterImpl(this, baseUrl)
+ mCallBtn = view.findViewById(R.id.btn_call)
+ mCallBtn.setOnClickListener {
+ onCallClicked()
+ }
+ btnMinimize = view.findViewById(R.id.btn_minimize)
+ btnMinimize.setOnClickListener {
+ onMinimizedClicked(it)
+ }
+ mCameraBtn = view.findViewById(R.id.btn_camera)
+ mCameraBtn.setOnClickListener {
+ onCameraClicked(it)
+ }
+ mSwitchCameraBtn = view.findViewById(R.id.btn_switch_camera)
+ mSwitchCameraBtn.setOnClickListener {
+ onSwitchCameraClicked(it)
+ }
+ mspeckerBtn = view.findViewById(R.id.btn_specker)
+ mspeckerBtn.setOnClickListener {
+ onSpeckerClicked(it)
+ }
+ mMicBtn = view.findViewById(R.id.btn_mic)
+ mMicBtn.setOnClickListener {
+ onMicClicked(it)
+ }
+ // progressBarLayout=findViewById(R.id.progressBar);
+ // progressBar=findViewById(R.id.progress_bar);
+// progressBarTextView=findViewById(R.id.progress_bar_text);
+// progressBar.setVisibility(View.GONE);
+ hiddenButtons()
+ checkClientConnected()
+
+ if (appLang == "ar") {
+ progressBarLayout!!.layoutDirection = View.LAYOUT_DIRECTION_RTL
+ }
+ }
+
+ private fun checkClientConnected() {
+ mConnectedHandler = Handler((Looper.getMainLooper()))
+ mConnectedRunnable = Runnable {
+ if (!isConnected) {
+ videoCallPresenter.callClintConnected(sessionStatusModel)
+ }
+ }
+ mConnectedHandler!!.postDelayed(mConnectedRunnable!!, (55 * 1000).toLong())
+ }
+
+ private fun hiddenButtons() {
+ mVolHandler = Handler()
+ mVolRunnable = Runnable { controlPanel.visibility = View.GONE }
+ mVolHandler!!.postDelayed(mVolRunnable!!, (5 * 1000).toLong())
+ }
+
+ override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: List) {
+ Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+ Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size)
+ if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
+ AppSettingsDialog.Builder(this)
+ .setTitle(getString(R.string.title_settings_dialog))
+ .setRationale(getString(R.string.rationale_ask_again))
+ .setPositiveButton(getString(R.string.setting))
+ .setNegativeButton(getString(R.string.cancel))
+ .setRequestCode(RC_SETTINGS_SCREEN_PERM)
+ .build()
+ .show()
+ }
+ }
+
+ @AfterPermissionGranted(RC_VIDEO_APP_PERM)
+ private fun requestPermissions() {
+ val perms = arrayOf(Manifest.permission.INTERNET, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.MODIFY_AUDIO_SETTINGS, Manifest.permission.CALL_PHONE)
+ if (EasyPermissions.hasPermissions(requireContext(), *perms)) {
+ try {
+ mSession = Session.Builder(context, apiKey, sessionId).build()
+ mSession!!.setSessionListener(this)
+ mSession!!.connect(token)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ } else {
+ EasyPermissions.requestPermissions(this, getString(R.string.remaining_ar), RC_VIDEO_APP_PERM, *perms)
+ }
+ }
+
+ override fun onConnected(session: Session?) {
+ Log.i(TAG, "Session Connected")
+ mPublisher = Publisher.Builder(requireContext())
+// .name("publisher")
+// .renderer(ThumbnailCircleVideoRenderer(requireContext()))
+ .build()
+ mPublisher!!.setPublisherListener(this)
+ if (mPublisher!!.view is GLSurfaceView) {
+ (mPublisher!!.view as GLSurfaceView).setZOrderOnTop(true)
+ }
+
+ mPublisherViewContainer.addView(mPublisher!!.view)
+ mSession!!.publish(mPublisher)
+
+ if (!resume) {
+ cmTimer.base = SystemClock.elapsedRealtime()
+ }
+ cmTimer.start()
+ videoCallResponseListener?.minimizeVideoEvent(true)
+ }
+
+ override fun onDisconnected(session: Session) {
+ Log.d(TAG, "onDisconnected: disconnected from session " + session.sessionId)
+ mSession = null
+ cmTimer.stop()
+ disconnectSession()
+ videoCallResponseListener?.minimizeVideoEvent(false)
+ }
+
+ override fun onError(session: Session, opentokError: OpentokError) {
+ Log.d(TAG, "onError: Error (" + opentokError.message + ") in session " + session.sessionId)
+
+ // videoCallResponseListener?.errorHandle("Error (" + opentokError.message + ") in session ")
+// dialog?.dismiss()
+ }
+
+ override fun onStreamReceived(session: Session, stream: Stream) {
+ Log.d(TAG, "onStreamReceived: New stream " + stream.streamId + " in session " + session.sessionId)
+ if (mSubscriber != null) {
+ isConnected = true
+ return
+ }
+ isConnected = true
+ subscribeToStream(stream)
+ if (mConnectedHandler != null && mConnectedRunnable != null)
+ mConnectedHandler!!.removeCallbacks(mConnectedRunnable!!)
+ videoCallPresenter.callChangeCallStatus(ChangeCallStatusRequestModel(3, sessionStatusModel!!.doctorId, sessionStatusModel!!.generalid, token, sessionStatusModel!!.vcid))
+ }
+
+ override fun onStreamDropped(session: Session, stream: Stream) {
+ Log.d(TAG, "onStreamDropped: Stream " + stream.streamId + " dropped from session " + session.sessionId)
+ if (mSubscriber == null) {
+ return
+ }
+ if (mSubscriber!!.stream == stream) {
+ mSubscriberViewContainer.removeView(mSubscriber!!.view)
+ mSubscriber!!.destroy()
+ mSubscriber = null
+ }
+ disconnectSession()
+ }
+
+ override fun onStreamCreated(publisherKit: PublisherKit?, stream: Stream) {
+ Log.d(TAG, "onStreamCreated: Own stream " + stream.streamId + " created")
+ }
+
+ override fun onStreamDestroyed(publisherKit: PublisherKit?, stream: Stream) {
+ Log.d(TAG, "onStreamDestroyed: Own stream " + stream.streamId + " destroyed")
+ }
+
+ override fun onError(publisherKit: PublisherKit?, opentokError: OpentokError) {
+ Log.d(VideoCallFragment.TAG, "onError: Error (" + opentokError.message + ") in publisher")
+ // videoCallResponseListener?.errorHandle("Error (" + opentokError.message + ") in publisher")
+// dialog?.dismiss()
+ }
+
+ override fun onVideoDataReceived(subscriberKit: SubscriberKit?) {
+ mSubscriber!!.setStyle(BaseVideoRenderer.STYLE_VIDEO_SCALE, BaseVideoRenderer.STYLE_VIDEO_FILL)
+ (mSubscriber!!.renderer as DynamicVideoRenderer).enableThumbnailCircle(false)
+ mSubscriberViewContainer.addView(mSubscriber!!.view)
+// switchToThumbnailCircle()
+ }
+
+ fun switchToThumbnailCircle() {
+ thumbnail_container.postDelayed({
+ val view = mSubscriber!!.view
+ if (view.parent != null) {
+ (view.parent as ViewGroup).removeView(view)
+ }
+ if (view is GLSurfaceView) {
+ view.setZOrderOnTop(true)
+ if (mSubscriber!!.renderer is DynamicVideoRenderer) {
+ (mSubscriber!!.renderer as DynamicVideoRenderer).enableThumbnailCircle(true)
+ thumbnail_container.addView(view)
+ }
+ }
+ switchToFullScreenView()
+ }, 4000)
+ }
+
+ fun switchToFullScreenView() {
+ mSubscriberViewContainer.postDelayed({
+ val view = mSubscriber!!.view
+ if (view.parent != null) {
+ (view.parent as ViewGroup).removeView(view)
+ }
+ if (view is GLSurfaceView) {
+ view.setZOrderOnTop(false)
+ if (mSubscriber!!.renderer is DynamicVideoRenderer) {
+ (mSubscriber!!.renderer as DynamicVideoRenderer).enableThumbnailCircle(false)
+ mSubscriberViewContainer.addView(view)
+ }
+ }
+ switchToThumbnailCircle()
+ }, 4000)
+ }
+
+ override fun onVideoDisabled(subscriberKit: SubscriberKit?, s: String?) {}
+
+ override fun onVideoEnabled(subscriberKit: SubscriberKit?, s: String?) {}
+
+ override fun onVideoDisableWarning(subscriberKit: SubscriberKit?) {}
+
+ override fun onVideoDisableWarningLifted(subscriberKit: SubscriberKit?) {}
+
+ private fun subscribeToStream(stream: Stream) {
+ mSubscriber = Subscriber.Builder(requireContext(), stream)
+ .renderer(DynamicVideoRenderer(requireContext()))
+ .build()
+ mSubscriber!!.setVideoListener(this)
+ mSession!!.subscribe(mSubscriber)
+ }
+
+ private fun disconnectSession() {
+ if (mSession == null) {
+ videoCallResponseListener?.onCallFinished(Activity.RESULT_CANCELED)
+// requireActivity().setResult(Activity.RESULT_CANCELED)
+ dialog?.dismiss()
+ return
+ }
+
+ if (mSubscriber != null) {
+ mSubscriberViewContainer.removeView(mSubscriber!!.view)
+ mSession!!.unsubscribe(mSubscriber)
+ mSubscriber!!.destroy()
+ mSubscriber = null
+ }
+ if (mPublisher != null) {
+ mPublisherViewContainer.removeView(mPublisher!!.view)
+ mSession!!.unpublish(mPublisher)
+ mPublisher!!.destroy()
+ mPublisher = null
+ }
+ mSession!!.disconnect()
+ countDownTimer?.cancel()
+
+ videoCallPresenter.callChangeCallStatus(ChangeCallStatusRequestModel(16, sessionStatusModel!!.doctorId, sessionStatusModel!!.generalid, token, sessionStatusModel!!.vcid))
+ dialog?.dismiss()
+ }
+
+ override fun onCallSuccessful(sessionStatusModel: SessionStatusModel) {
+ if (sessionStatusModel.sessionStatus == 2 || sessionStatusModel.sessionStatus == 3) {
+ val returnIntent = Intent()
+ returnIntent.putExtra("sessionStatusNotRespond", sessionStatusModel)
+ videoCallResponseListener?.onCallFinished(Activity.RESULT_OK, returnIntent)
+// requireActivity().setResult(Activity.RESULT_OK, returnIntent)
+ dialog?.dismiss()
+ }
+ }
+
+ override fun onCallChangeCallStatusSuccessful(sessionStatusModel: SessionStatusModel?) {}
+
+ override fun onFailure() {}
+
+ private fun onSwitchCameraClicked(view: View?) {
+ if (mPublisher != null) {
+ isSwitchCameraClicked = !isSwitchCameraClicked
+ mPublisher!!.cycleCamera()
+ val res = if (isSwitchCameraClicked) R.drawable.camera_front else R.drawable.camera_back
+ mSwitchCameraBtn.setImageResource(res)
+ }
+ }
+
+ fun onCallClicked() {
+ disconnectSession()
+ }
+
+ private fun miniCircleDoubleTap() {
+ if (isCircle) {
+ onMiniCircleClicked()
+ }
+ }
+
+ private fun onMiniCircleClicked() {
+ if (isCircle) {
+ dialog?.window?.setLayout(
+ 400,
+ 600
+ )
+ } else {
+ dialog?.window?.setLayout(
+ 300,
+ 300
+ )
+ }
+ isCircle = !isCircle
+
+ if (mSubscriber != null) {
+ (mSubscriber!!.renderer as DynamicVideoRenderer).enableThumbnailCircle(isCircle)
+ } else {
+ if (isCircle) {
+ videoCallContainer.background = ContextCompat.getDrawable(requireContext(), R.drawable.circle_shape)
+ mSubscriberViewContainer.background = ContextCompat.getDrawable(requireContext(), R.drawable.circle_shape)
+ } else {
+ videoCallContainer.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.text_color))
+ mSubscriberViewContainer.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.text_color))
+ }
+
+ }
+
+ if (isCircle) {
+ controlPanel.visibility = View.GONE
+ layoutMini.visibility = View.GONE
+ } else {
+ controlPanel.visibility = View.VISIBLE
+ layoutMini.visibility = View.VISIBLE
+ }
+ }
+
+ private fun onMinimizedClicked(view: View?) {
+ if (isFullScreen) {
+ dialog?.window?.setLayout(
+ 400,
+ 600
+ )
+ } else {
+ dialog?.window?.setLayout(
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT
+ )
+ }
+ isFullScreen = !isFullScreen
+
+ val res = if (isFullScreen) R.drawable.reducing else R.drawable.expand
+ btnMinimize.setImageResource(res)
+ setViewsVisibility()
+
+// videoCallResponseListener?.minimizeVideoEvent(!isFullScreen)
+ }
+
+ private fun setViewsVisibility() {
+ val iconSize: Int = context!!.resources.getDimension(R.dimen.video_icon_size).toInt()
+ val iconSizeSmall: Int = context!!.resources.getDimension(R.dimen.video_icon_size_small).toInt()
+ val btnMinimizeLayoutParam: ConstraintLayout.LayoutParams = btnMinimize.layoutParams as ConstraintLayout.LayoutParams
+ val mCallBtnLayoutParam: ConstraintLayout.LayoutParams = mCallBtn.layoutParams as ConstraintLayout.LayoutParams
+
+ val localPreviewMargin: Int = context!!.resources.getDimension(R.dimen.local_preview_margin_top).toInt()
+ val localPreviewWidth: Int = context!!.resources.getDimension(R.dimen.local_preview_width).toInt()
+ val localPreviewHeight: Int = context!!.resources.getDimension(R.dimen.local_preview_height).toInt()
+// val localPreviewIconSize: Int = context!!.resources.getDimension(R.dimen.local_back_icon_size).toInt()
+// val localPreviewMarginSmall : Int = context!!.resources.getDimension(R.dimen.local_preview_margin_small).toInt()
+// val localPreviewWidthSmall : Int = context!!.resources.getDimension(R.dimen.local_preview_width_small).toInt()
+// val localPreviewHeightSmall : Int = context!!.resources.getDimension(R.dimen.local_preview_height_small).toInt()
+// val localPreviewIconSmall: Int = context!!.resources.getDimension(R.dimen.local_back_icon_size_small).toInt()
+// val localPreviewLayoutIconParam : FrameLayout.LayoutParams
+ val localPreviewLayoutParam: RelativeLayout.LayoutParams = mPublisherViewContainer.layoutParams as RelativeLayout.LayoutParams
+
+ val remotePreviewIconSize: Int = context!!.resources.getDimension(R.dimen.remote_back_icon_size).toInt()
+ val remotePreviewIconSizeSmall: Int = context!!.resources.getDimension(R.dimen.remote_back_icon_size_small).toInt()
+ val remotePreviewLayoutParam: FrameLayout.LayoutParams = mSubscriberViewIcon.layoutParams as FrameLayout.LayoutParams
+
+ if (isFullScreen) {
+ layoutName.visibility = View.VISIBLE
+ layoutMini.visibility = View.GONE
+ mCameraBtn.visibility = View.VISIBLE
+ mSwitchCameraBtn.visibility = View.VISIBLE
+// mspeckerBtn.visibility = View.VISIBLE
+ mMicBtn.visibility = View.VISIBLE
+
+ btnMinimizeLayoutParam.width = iconSize
+ btnMinimizeLayoutParam.height = iconSize
+ mCallBtnLayoutParam.width = iconSize
+ mCallBtnLayoutParam.height = iconSize
+// localPreviewLayoutIconParam = FrameLayout.LayoutParams(localPreviewIconSize, localPreviewIconSize)
+//// localPreviewLayoutParam = RelativeLayout.LayoutParams(localPreviewWidth, localPreviewHeight)
+ localPreviewLayoutParam.width = localPreviewWidth
+ localPreviewLayoutParam.height = localPreviewHeight
+ localPreviewLayoutParam.setMargins(0, localPreviewMargin, localPreviewMargin, 0)
+// remotePreviewLayoutParam = FrameLayout.LayoutParams(remotePreviewIconSize, remotePreviewIconSize)
+ remotePreviewLayoutParam.width = remotePreviewIconSize
+ remotePreviewLayoutParam.height = remotePreviewIconSize
+ } else {
+ layoutName.visibility = View.GONE
+ layoutMini.visibility = View.VISIBLE
+ mCameraBtn.visibility = View.GONE
+ mSwitchCameraBtn.visibility = View.GONE
+// mspeckerBtn.visibility = View.GONE
+ mMicBtn.visibility = View.GONE
+// mPublisherViewContainer.visibility = View.GONE
+// mPublisherViewIcon.visibility = View.GONE
+
+// layoutParam = ConstraintLayout.LayoutParams(iconSizeSmall, iconSizeSmall)
+ btnMinimizeLayoutParam.width = iconSizeSmall
+ btnMinimizeLayoutParam.height = iconSizeSmall
+ mCallBtnLayoutParam.width = iconSizeSmall
+ mCallBtnLayoutParam.height = iconSizeSmall
+
+ localPreviewLayoutParam.width = 0
+ localPreviewLayoutParam.height = 0
+ localPreviewLayoutParam.setMargins(0, localPreviewMargin / 2, localPreviewMargin / 2, 0)
+// localPreviewLayoutIconParam = FrameLayout.LayoutParams(localPreviewIconSmall, localPreviewIconSmall)
+//// localPreviewLayoutParam = RelativeLayout.LayoutParams(localPreviewWidthSmall, localPreviewHeightSmall)
+// localPreviewLayoutParam.width = localPreviewWidthSmall
+// localPreviewLayoutParam.height = localPreviewWidthSmall
+// localPreviewLayoutParam.setMargins(0,localPreviewMarginSmall, localPreviewMarginSmall, 0)
+// remotePreviewLayoutParam = FrameLayout.LayoutParams(remotePreviewIconSizeSmall, remotePreviewIconSizeSmall)
+ remotePreviewLayoutParam.width = remotePreviewIconSizeSmall
+ remotePreviewLayoutParam.height = remotePreviewIconSizeSmall
+
+ if (isCircle) {
+ controlPanel.visibility = View.GONE
+ layoutMini.visibility = View.GONE
+ } else {
+ controlPanel.visibility = View.VISIBLE
+ layoutMini.visibility = View.VISIBLE
+ }
+ }
+
+ mPublisherViewContainer.layoutParams = localPreviewLayoutParam
+// mPublisherViewIcon.layoutParams = localPreviewLayoutIconParam
+ mSubscriberViewIcon.layoutParams = remotePreviewLayoutParam
+
+ btnMinimize.layoutParams = btnMinimizeLayoutParam
+ mCallBtn.layoutParams = mCallBtnLayoutParam
+ }
+
+ private fun onCameraClicked(view: View?) {
+ if (mPublisher != null) {
+ isCameraClicked = !isCameraClicked
+ mPublisher!!.publishVideo = !isCameraClicked
+ val res = if (isCameraClicked) R.drawable.video_disabled else R.drawable.video_enabled
+ mCameraBtn!!.setImageResource(res)
+ }
+ }
+
+ private fun onMicClicked(view: View?) {
+ if (mPublisher != null) {
+ isMicClicked = !isMicClicked
+ mPublisher!!.publishAudio = !isMicClicked
+ val res = if (isMicClicked) R.drawable.mic_disabled else R.drawable.mic_enabled
+ mMicBtn!!.setImageResource(res)
+ }
+ }
+
+ private fun onSpeckerClicked(view: View?) {
+ if (mSubscriber != null) {
+ isSpeckerClicked = !isSpeckerClicked
+ mSubscriber!!.subscribeToAudio = !isSpeckerClicked
+ val res = if (isSpeckerClicked) R.drawable.audio_disabled else R.drawable.audio_enabled
+ mspeckerBtn.setImageResource(res)
+ }
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ private fun handleDragDialog() {
+ mWindowManager = requireActivity().getSystemService(Context.WINDOW_SERVICE) as WindowManager
+ getWindowManagerDefaultDisplay()
+
+ videoCallContainer.setOnTouchListener(dragListener)
+ mSubscriberViewContainer.setOnTouchListener(dragListener)
+ }
+
+ @SuppressLint("ClickableViewAccessibility")
+ private val dragListener: View.OnTouchListener = View.OnTouchListener { _, event ->
+ mDetector.onTouchEvent(event)
+
+ //Get Floating widget view params
+ val layoutParams: WindowManager.LayoutParams = dialog!!.window!!.attributes
+ //get the touch location coordinates
+ val x_cord = event.rawX.toInt()
+ val y_cord = event.rawY.toInt()
+ val x_cord_Destination: Int
+ var y_cord_Destination: Int
+
+ when (event.action) {
+ MotionEvent.ACTION_DOWN -> {
+ x_init_cord = x_cord
+ y_init_cord = y_cord
+
+ //remember the initial position.
+ x_init_margin = layoutParams.x
+ y_init_margin = layoutParams.y
+ }
+ MotionEvent.ACTION_UP -> {
+ //Get the difference between initial coordinate and current coordinate
+ val x_diff: Int = x_cord - x_init_cord
+ val y_diff: Int = y_cord - y_init_cord
+
+ y_cord_Destination = y_init_margin + y_diff
+ val barHeight: Int = getStatusBarHeight()
+ if (y_cord_Destination < 0) {
+// y_cord_Destination = 0
+// y_cord_Destination =
+// -(szWindow.y - (videoCallContainer.height /*+ barHeight*/))
+ y_cord_Destination = -(szWindow.y / 2)
+ } else if (y_cord_Destination + (videoCallContainer.height + barHeight) > szWindow.y) {
+// y_cord_Destination = szWindow.y - (videoCallContainer.height + barHeight)
+ y_cord_Destination = (szWindow.y / 2)
+ }
+ layoutParams.y = y_cord_Destination
+
+ //reset position if user drags the floating view
+ resetPosition(x_cord)
+ }
+ MotionEvent.ACTION_MOVE -> {
+ val x_diff_move: Int = x_cord - x_init_cord
+ val y_diff_move: Int = y_cord - y_init_cord
+ x_cord_Destination = x_init_margin + x_diff_move
+ y_cord_Destination = y_init_margin + y_diff_move
+
+ layoutParams.x = x_cord_Destination
+ layoutParams.y = y_cord_Destination
+
+ dialog!!.window!!.attributes = layoutParams
+ }
+ }
+ true
+ }
+
+ private fun showControlPanelTemporarily() {
+ if (!isCircle) {
+ controlPanel.visibility = View.VISIBLE
+ mVolHandler!!.removeCallbacks(mVolRunnable!!)
+ mVolHandler!!.postDelayed(mVolRunnable!!, (5 * 1000).toLong())
+ }
+ }
+
+ /* Reset position of Floating Widget view on dragging */
+ private fun resetPosition(x_cord_now: Int) {
+ if (x_cord_now <= szWindow.x / 2) {
+ isLeft = true
+ moveToLeft(x_cord_now)
+ } else {
+ isLeft = false
+ moveToRight(x_cord_now)
+ }
+ }
+
+ /* Method to move the Floating widget view to Left */
+ private fun moveToLeft(current_x_cord: Int) {
+
+ var mParams: WindowManager.LayoutParams = dialog!!.window!!.attributes
+
+ mParams.x =
+ (szWindow.x - current_x_cord * current_x_cord - videoCallContainer.width).toInt()
+
+ dialog!!.window!!.attributes = mParams
+ val x = szWindow.x - current_x_cord
+ object : CountDownTimer(500, 5) {
+ //get params of Floating Widget view
+ var mParams: WindowManager.LayoutParams = dialog!!.window!!.attributes
+ override fun onTick(t: Long) {
+ val step = (500 - t) / 5
+ // mParams.x = 0 - (current_x_cord * current_x_cord * step).toInt()
+ mParams.x =
+ (szWindow.x - current_x_cord * current_x_cord * step - videoCallContainer.width).toInt()
+
+ dialog!!.window!!.attributes = mParams
+ }
+
+ override fun onFinish() {
+ mParams.x = -(szWindow.x - videoCallContainer.width)
+
+ dialog!!.window!!.attributes = mParams
+ }
+ }.start()
+ }
+
+ /* Method to move the Floating widget view to Right */
+ private fun moveToRight(current_x_cord: Int) {
+// var mParams : WindowManager.LayoutParams = dialog!!.window!!.attributes
+// mParams.x =
+// (szWindow.x + current_x_cord * current_x_cord - videoCallContainer.width).toInt()
+//
+// dialog!!.window!!.attributes = mParams
+ object : CountDownTimer(500, 5) {
+ //get params of Floating Widget view
+ var mParams: WindowManager.LayoutParams = dialog!!.window!!.attributes
+ override fun onTick(t: Long) {
+ val step = (500 - t) / 5
+ mParams.x =
+ (szWindow.x + current_x_cord * current_x_cord * step - videoCallContainer.width).toInt()
+
+ dialog!!.window!!.attributes = mParams
+ }
+
+ override fun onFinish() {
+ mParams.x = szWindow.x - videoCallContainer.width
+
+ dialog!!.window!!.attributes = mParams
+ }
+ }.start()
+ }
+
+ private fun getWindowManagerDefaultDisplay() {
+ mWindowManager.getDefaultDisplay()
+ .getSize(szWindow)
+ }
+
+ /* return status bar height on basis of device display metrics */
+ private fun getStatusBarHeight(): Int {
+ return ceil(
+ (25 * requireActivity().applicationContext.resources.displayMetrics.density).toDouble()
+ ).toInt()
+ }
+
+ private class MyGestureListener(val onTabCall: () -> Unit, val miniCircleDoubleTap: () -> Unit) : GestureDetector.SimpleOnGestureListener() {
+
+ override fun onSingleTapConfirmed(event: MotionEvent): Boolean {
+ onTabCall()
+ return true
+ }
+
+ override fun onDoubleTap(e: MotionEvent?): Boolean {
+ miniCircleDoubleTap()
+ return super.onDoubleTap(e)
+ }
+
+ }
+
+ companion object {
+ @JvmStatic
+ fun newInstance(args: Bundle) =
+ VideoCallFragment().apply {
+ arguments = args
+ }
+
+ private val TAG = VideoCallFragment::class.java.simpleName
+
+ private const val RC_SETTINGS_SCREEN_PERM = 123
+ private const val RC_VIDEO_APP_PERM = 124
+
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/hmg/hmgDr/util/DynamicVideoRenderer.kt b/android/app/src/main/kotlin/com/hmg/hmgDr/util/DynamicVideoRenderer.kt
new file mode 100644
index 00000000..1a307eb5
--- /dev/null
+++ b/android/app/src/main/kotlin/com/hmg/hmgDr/util/DynamicVideoRenderer.kt
@@ -0,0 +1,379 @@
+package com.hmg.hmgDr.util
+
+import android.content.Context
+import android.content.res.Resources
+import android.graphics.PixelFormat
+import android.opengl.GLES20
+import android.opengl.GLSurfaceView
+import android.opengl.Matrix
+import android.view.View
+import com.opentok.android.BaseVideoRenderer
+import java.nio.ByteBuffer
+import java.nio.ByteOrder
+import java.nio.FloatBuffer
+import java.nio.ShortBuffer
+import java.util.concurrent.locks.ReentrantLock
+import javax.microedition.khronos.egl.EGLConfig
+import javax.microedition.khronos.opengles.GL10
+
+/*
+* https://nhancv.medium.com/android-how-to-make-a-circular-view-as-a-thumbnail-of-opentok-27992aee15c9
+* to solve make circle video stream
+* */
+
+class DynamicVideoRenderer(private val mContext: Context) : BaseVideoRenderer() {
+ private val mView: GLSurfaceView = GLSurfaceView(mContext)
+ private val mRenderer: MyRenderer
+
+ interface DynamicVideoRendererMetadataListener {
+ fun onMetadataReady(metadata: ByteArray?)
+ }
+
+ fun setDynamicVideoRendererMetadataListener(metadataListener: DynamicVideoRendererMetadataListener?) {
+ mRenderer.metadataListener = metadataListener
+ }
+
+ fun enableThumbnailCircle(enable: Boolean) {
+ mRenderer.requestEnableThumbnailCircle = enable
+ }
+
+ internal class MyRenderer : GLSurfaceView.Renderer {
+ var mTextureIds = IntArray(3)
+ var mScaleMatrix = FloatArray(16)
+ private val mVertexBuffer: FloatBuffer
+ private val mTextureBuffer: FloatBuffer
+ private val mDrawListBuffer: ShortBuffer
+ var requestEnableThumbnailCircle = false
+ var mVideoFitEnabled = true
+ var mVideoDisabled = false
+ private val mVertexIndex = shortArrayOf(0, 1, 2, 0, 2, 3) // order to draw
+
+ // vertices
+ private val vertexShaderCode = """uniform mat4 uMVPMatrix;attribute vec4 aPosition;
+attribute vec2 aTextureCoord;
+varying vec2 vTextureCoord;
+void main() {
+ gl_Position = uMVPMatrix * aPosition;
+ vTextureCoord = aTextureCoord;
+}
+"""
+ private val fragmentShaderCode = """precision mediump float;
+uniform sampler2D Ytex;
+uniform sampler2D Utex,Vtex;
+uniform int enableCircle;
+uniform vec2 radiusDp;
+varying vec2 vTextureCoord;
+void main(void) {
+ float nx,ny,r,g,b,y,u,v;
+ mediump vec4 txl,ux,vx; nx=vTextureCoord[0];
+ ny=vTextureCoord[1];
+ y=texture2D(Ytex,vec2(nx,ny)).r;
+ u=texture2D(Utex,vec2(nx,ny)).r;
+ v=texture2D(Vtex,vec2(nx,ny)).r;
+ y=1.1643*(y-0.0625);
+ u=u-0.5;
+ v=v-0.5;
+ r=y+1.5958*v;
+ g=y-0.39173*u-0.81290*v;
+ b=y+2.017*u;
+ if (enableCircle > 0) {
+ float radius = 0.5;
+ vec4 color0 = vec4(0.0, 0.0, 0.0, 0.0);
+ vec4 color1 = vec4(r, g, b, 1.0);
+ vec2 st = (gl_FragCoord.xy/radiusDp.xy); float dist = radius - distance(st,vec2(0.5));
+ float t = 1.0;
+ if (dist < 0.0) t = 0.0;
+ gl_FragColor = mix(color0, color1, t);
+ }
+ else {
+ gl_FragColor = vec4(r, g, b, 1.0);
+ }
+}
+"""
+ var mFrameLock = ReentrantLock()
+ var mCurrentFrame: Frame? = null
+ private var mProgram = 0
+ private var mTextureWidth = 0
+ private var mTextureHeight = 0
+ private var mViewportWidth = 0
+ private var mViewportHeight = 0
+ override fun onSurfaceCreated(gl: GL10, config: EGLConfig) {
+ gl.glClearColor(0f, 0f, 0f, 1f)
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+ val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,
+ vertexShaderCode)
+ val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,
+ fragmentShaderCode)
+ mProgram = GLES20.glCreateProgram() // create empty OpenGL ES
+ // Program
+ GLES20.glAttachShader(mProgram, vertexShader) // add the vertex
+ // shader to program
+ GLES20.glAttachShader(mProgram, fragmentShader) // add the fragment
+ // shader to
+ // program
+ GLES20.glLinkProgram(mProgram)
+ val positionHandle = GLES20.glGetAttribLocation(mProgram,
+ "aPosition")
+ val textureHandle = GLES20.glGetAttribLocation(mProgram,
+ "aTextureCoord")
+ GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX,
+ GLES20.GL_FLOAT, false, COORDS_PER_VERTEX * 4,
+ mVertexBuffer)
+ GLES20.glEnableVertexAttribArray(positionHandle)
+ GLES20.glVertexAttribPointer(textureHandle,
+ TEXTURECOORDS_PER_VERTEX, GLES20.GL_FLOAT, false,
+ TEXTURECOORDS_PER_VERTEX * 4, mTextureBuffer)
+ GLES20.glEnableVertexAttribArray(textureHandle)
+ GLES20.glUseProgram(mProgram)
+ var i = GLES20.glGetUniformLocation(mProgram, "Ytex")
+ GLES20.glUniform1i(i, 0) /* Bind Ytex to texture unit 0 */
+ i = GLES20.glGetUniformLocation(mProgram, "Utex")
+ GLES20.glUniform1i(i, 1) /* Bind Utex to texture unit 1 */
+ i = GLES20.glGetUniformLocation(mProgram, "Vtex")
+ GLES20.glUniform1i(i, 2) /* Bind Vtex to texture unit 2 */
+ val radiusDpLocation = GLES20.glGetUniformLocation(mProgram, "radiusDp")
+ val radiusDp = (Resources.getSystem().displayMetrics.density * THUMBNAIL_SIZE).toInt()
+ GLES20.glUniform2f(radiusDpLocation, radiusDp.toFloat(), radiusDp.toFloat())
+ mTextureWidth = 0
+ mTextureHeight = 0
+ }
+
+ fun enableThumbnailCircle(enable: Boolean) {
+ GLES20.glUseProgram(mProgram)
+ val enableCircleLocation = GLES20.glGetUniformLocation(mProgram, "enableCircle")
+ GLES20.glUniform1i(enableCircleLocation, if (enable) 1 else 0)
+ }
+
+ fun setupTextures(frame: Frame) {
+ if (mTextureIds[0] != 0) {
+ GLES20.glDeleteTextures(3, mTextureIds, 0)
+ }
+ GLES20.glGenTextures(3, mTextureIds, 0)
+ val w = frame.width
+ val h = frame.height
+ val hw = w + 1 shr 1
+ val hh = h + 1 shr 1
+ initializeTexture(GLES20.GL_TEXTURE0, mTextureIds[0], w, h)
+ initializeTexture(GLES20.GL_TEXTURE1, mTextureIds[1], hw, hh)
+ initializeTexture(GLES20.GL_TEXTURE2, mTextureIds[2], hw, hh)
+ mTextureWidth = frame.width
+ mTextureHeight = frame.height
+ }
+
+ fun updateTextures(frame: Frame) {
+ val width = frame.width
+ val height = frame.height
+ val half_width = width + 1 shr 1
+ val half_height = height + 1 shr 1
+ val y_size = width * height
+ val uv_size = half_width * half_height
+ val bb = frame.buffer
+ // If we are reusing this frame, make sure we reset position and
+ // limit
+ bb.clear()
+ if (bb.remaining() == y_size + uv_size * 2) {
+ bb.position(0)
+ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1)
+ GLES20.glPixelStorei(GLES20.GL_PACK_ALIGNMENT, 1)
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE0)
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIds[0])
+ GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, width,
+ height, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE,
+ bb)
+ bb.position(y_size)
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE1)
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIds[1])
+ GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0,
+ half_width, half_height, GLES20.GL_LUMINANCE,
+ GLES20.GL_UNSIGNED_BYTE, bb)
+ bb.position(y_size + uv_size)
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE2)
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIds[2])
+ GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0,
+ half_width, half_height, GLES20.GL_LUMINANCE,
+ GLES20.GL_UNSIGNED_BYTE, bb)
+ } else {
+ mTextureWidth = 0
+ mTextureHeight = 0
+ }
+ }
+
+ override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) {
+ GLES20.glViewport(0, 0, width, height)
+ mViewportWidth = width
+ mViewportHeight = height
+ }
+
+ var metadataListener: DynamicVideoRendererMetadataListener? = null
+ override fun onDrawFrame(gl: GL10) {
+ gl.glClearColor(0f, 0f, 0f, 0f)
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+ mFrameLock.lock()
+ if (mCurrentFrame != null && !mVideoDisabled) {
+ GLES20.glUseProgram(mProgram)
+ if (mTextureWidth != mCurrentFrame!!.width
+ || mTextureHeight != mCurrentFrame!!.height) {
+ setupTextures(mCurrentFrame!!)
+ }
+ updateTextures(mCurrentFrame!!)
+ Matrix.setIdentityM(mScaleMatrix, 0)
+ var scaleX = 1.0f
+ var scaleY = 1.0f
+ val ratio = (mCurrentFrame!!.width.toFloat()
+ / mCurrentFrame!!.height)
+ val vratio = mViewportWidth.toFloat() / mViewportHeight
+ if (mVideoFitEnabled) {
+ if (ratio > vratio) {
+ scaleY = vratio / ratio
+ } else {
+ scaleX = ratio / vratio
+ }
+ } else {
+ if (ratio < vratio) {
+ scaleY = vratio / ratio
+ } else {
+ scaleX = ratio / vratio
+ }
+ }
+ Matrix.scaleM(mScaleMatrix, 0,
+ scaleX * if (mCurrentFrame!!.isMirroredX) -1.0f else 1.0f,
+ scaleY, 1f)
+ metadataListener?.onMetadataReady(mCurrentFrame!!.metadata)
+ val mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram,
+ "uMVPMatrix")
+ GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false,
+ mScaleMatrix, 0)
+ enableThumbnailCircle(requestEnableThumbnailCircle)
+ GLES20.glDrawElements(GLES20.GL_TRIANGLES, mVertexIndex.size,
+ GLES20.GL_UNSIGNED_SHORT, mDrawListBuffer)
+ } else {
+ //black frame when video is disabled
+ gl.glClearColor(0f, 0f, 0f, 1f)
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+ }
+ mFrameLock.unlock()
+ }
+
+ fun displayFrame(frame: Frame?) {
+ mFrameLock.lock()
+ if (mCurrentFrame != null) {
+ mCurrentFrame!!.recycle()
+ }
+ mCurrentFrame = frame
+ mFrameLock.unlock()
+ }
+
+ fun disableVideo(b: Boolean) {
+ mFrameLock.lock()
+ mVideoDisabled = b
+ if (mVideoDisabled) {
+ if (mCurrentFrame != null) {
+ mCurrentFrame!!.recycle()
+ }
+ mCurrentFrame = null
+ }
+ mFrameLock.unlock()
+ }
+
+ fun enableVideoFit(enableVideoFit: Boolean) {
+ mVideoFitEnabled = enableVideoFit
+ }
+
+ companion object {
+ // number of coordinates per vertex in this array
+ const val COORDS_PER_VERTEX = 3
+ const val TEXTURECOORDS_PER_VERTEX = 2
+ var mXYZCoords = floatArrayOf(
+ -1.0f, 1.0f, 0.0f, // top left
+ -1.0f, -1.0f, 0.0f, // bottom left
+ 1.0f, -1.0f, 0.0f, // bottom right
+ 1.0f, 1.0f, 0.0f // top right
+ )
+ var mUVCoords = floatArrayOf(0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f)
+ fun initializeTexture(name: Int, id: Int, width: Int, height: Int) {
+ GLES20.glActiveTexture(name)
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id)
+ GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+ GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST.toFloat())
+ GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+ GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR.toFloat())
+ GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+ GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE.toFloat())
+ GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+ GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE.toFloat())
+ GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE,
+ width, height, 0, GLES20.GL_LUMINANCE,
+ GLES20.GL_UNSIGNED_BYTE, null)
+ }
+
+ fun loadShader(type: Int, shaderCode: String?): Int {
+ val shader = GLES20.glCreateShader(type)
+ GLES20.glShaderSource(shader, shaderCode)
+ GLES20.glCompileShader(shader)
+ return shader
+ }
+ }
+
+ init {
+ val bb = ByteBuffer.allocateDirect(mXYZCoords.size * 4)
+ bb.order(ByteOrder.nativeOrder())
+ mVertexBuffer = bb.asFloatBuffer()
+ mVertexBuffer.put(mXYZCoords)
+ mVertexBuffer.position(0)
+ val tb = ByteBuffer.allocateDirect(mUVCoords.size * 4)
+ tb.order(ByteOrder.nativeOrder())
+ mTextureBuffer = tb.asFloatBuffer()
+ mTextureBuffer.put(mUVCoords)
+ mTextureBuffer.position(0)
+ val dlb = ByteBuffer.allocateDirect(mVertexIndex.size * 2)
+ dlb.order(ByteOrder.nativeOrder())
+ mDrawListBuffer = dlb.asShortBuffer()
+ mDrawListBuffer.put(mVertexIndex)
+ mDrawListBuffer.position(0)
+ }
+ }
+
+ override fun onFrame(frame: Frame) {
+ mRenderer.displayFrame(frame)
+ mView.requestRender()
+ }
+
+ override fun setStyle(key: String, value: String) {
+ if (STYLE_VIDEO_SCALE == key) {
+ if (STYLE_VIDEO_FIT == value) {
+ mRenderer.enableVideoFit(true)
+ } else if (STYLE_VIDEO_FILL == value) {
+ mRenderer.enableVideoFit(false)
+ }
+ }
+ }
+
+ override fun onVideoPropertiesChanged(videoEnabled: Boolean) {
+ mRenderer.disableVideo(!videoEnabled)
+ }
+
+ override fun getView(): View {
+ return mView
+ }
+
+ override fun onPause() {
+ mView.onPause()
+ }
+
+ override fun onResume() {
+ mView.onResume()
+ }
+
+ companion object {
+ private const val THUMBNAIL_SIZE = 90 //in dp
+ }
+
+ init {
+ mView.setEGLContextClientVersion(2)
+ mView.setEGLConfigChooser(8, 8, 8, 8, 16, 0)
+ mView.holder.setFormat(PixelFormat.TRANSLUCENT)
+ mRenderer = MyRenderer()
+ mView.setRenderer(mRenderer)
+ mView.renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/hmg/hmgDr/util/ThumbnailCircleVideoRenderer.kt b/android/app/src/main/kotlin/com/hmg/hmgDr/util/ThumbnailCircleVideoRenderer.kt
new file mode 100644
index 00000000..b9b5a245
--- /dev/null
+++ b/android/app/src/main/kotlin/com/hmg/hmgDr/util/ThumbnailCircleVideoRenderer.kt
@@ -0,0 +1,357 @@
+package com.hmg.hmgDr.util
+
+import android.content.Context
+import android.content.res.Resources
+import android.graphics.PixelFormat
+import android.opengl.GLES20
+import android.opengl.GLSurfaceView
+import android.opengl.Matrix
+import android.view.View
+import com.opentok.android.BaseVideoRenderer
+import java.nio.ByteBuffer
+import java.nio.ByteOrder
+import java.nio.FloatBuffer
+import java.nio.ShortBuffer
+import java.util.concurrent.locks.ReentrantLock
+import javax.microedition.khronos.egl.EGLConfig
+import javax.microedition.khronos.opengles.GL10
+
+
+class ThumbnailCircleVideoRenderer(private val mContext: Context) : BaseVideoRenderer() {
+ private val mView: GLSurfaceView = GLSurfaceView(mContext)
+ private val mRenderer: MyRenderer
+
+ interface ThumbnailCircleVideoRendererMetadataListener {
+ fun onMetadataReady(metadata: ByteArray?)
+ }
+
+ fun setThumbnailCircleVideoRendererMetadataListener(metadataListener: ThumbnailCircleVideoRendererMetadataListener?) {
+ mRenderer.metadataListener = metadataListener
+ }
+
+ internal class MyRenderer : GLSurfaceView.Renderer {
+ var mTextureIds = IntArray(3)
+ var mScaleMatrix = FloatArray(16)
+ private val mVertexBuffer: FloatBuffer
+ private val mTextureBuffer: FloatBuffer
+ private val mDrawListBuffer: ShortBuffer
+ var mVideoFitEnabled = true
+ var mVideoDisabled = false
+ private val mVertexIndex = shortArrayOf(0, 1, 2, 0, 2, 3) // order to draw
+
+ // vertices
+ private val vertexShaderCode = """uniform mat4 uMVPMatrix;attribute vec4 aPosition;
+attribute vec2 aTextureCoord;
+varying vec2 vTextureCoord;
+void main() {
+ gl_Position = uMVPMatrix * aPosition;
+ vTextureCoord = aTextureCoord;
+}
+"""
+ private val fragmentShaderCode = """precision mediump float;
+uniform sampler2D Ytex;
+uniform sampler2D Utex,Vtex;
+uniform vec2 radiusDp;
+varying vec2 vTextureCoord;
+void main(void) {
+ float nx,ny,r,g,b,y,u,v;
+ mediump vec4 txl,ux,vx; nx=vTextureCoord[0];
+ ny=vTextureCoord[1];
+ y=texture2D(Ytex,vec2(nx,ny)).r;
+ u=texture2D(Utex,vec2(nx,ny)).r;
+ v=texture2D(Vtex,vec2(nx,ny)).r;
+ y=1.1643*(y-0.0625);
+ u=u-0.5;
+ v=v-0.5;
+ r=y+1.5958*v;
+ g=y-0.39173*u-0.81290*v;
+ b=y+2.017*u;
+ float radius = 0.5;
+ vec4 color0 = vec4(0.0, 0.0, 0.0, 0.0);
+ vec4 color1 = vec4(r, g, b, 1.0);
+ vec2 st = (gl_FragCoord.xy/radiusDp.xy); float dist = radius - distance(st,vec2(0.5));
+ float t = 1.0;
+ if (dist < 0.0) t = 0.0;
+ gl_FragColor = mix(color0, color1, t);
+}
+"""
+ var mFrameLock = ReentrantLock()
+ var mCurrentFrame: Frame? = null
+ private var mProgram = 0
+ private var mTextureWidth = 0
+ private var mTextureHeight = 0
+ private var mViewportWidth = 0
+ private var mViewportHeight = 0
+ override fun onSurfaceCreated(gl: GL10, config: EGLConfig) {
+ gl.glClearColor(0f, 0f, 0f, 1f)
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+ val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,
+ vertexShaderCode)
+ val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,
+ fragmentShaderCode)
+ mProgram = GLES20.glCreateProgram() // create empty OpenGL ES
+ // Program
+ GLES20.glAttachShader(mProgram, vertexShader) // add the vertex
+ // shader to program
+ GLES20.glAttachShader(mProgram, fragmentShader) // add the fragment
+ // shader to
+ // program
+ GLES20.glLinkProgram(mProgram)
+ val positionHandle = GLES20.glGetAttribLocation(mProgram,
+ "aPosition")
+ val textureHandle = GLES20.glGetAttribLocation(mProgram,
+ "aTextureCoord")
+ GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX,
+ GLES20.GL_FLOAT, false, COORDS_PER_VERTEX * 4,
+ mVertexBuffer)
+ GLES20.glEnableVertexAttribArray(positionHandle)
+ GLES20.glVertexAttribPointer(textureHandle,
+ TEXTURECOORDS_PER_VERTEX, GLES20.GL_FLOAT, false,
+ TEXTURECOORDS_PER_VERTEX * 4, mTextureBuffer)
+ GLES20.glEnableVertexAttribArray(textureHandle)
+ GLES20.glUseProgram(mProgram)
+ var i = GLES20.glGetUniformLocation(mProgram, "Ytex")
+ GLES20.glUniform1i(i, 0) /* Bind Ytex to texture unit 0 */
+ i = GLES20.glGetUniformLocation(mProgram, "Utex")
+ GLES20.glUniform1i(i, 1) /* Bind Utex to texture unit 1 */
+ i = GLES20.glGetUniformLocation(mProgram, "Vtex")
+ GLES20.glUniform1i(i, 2) /* Bind Vtex to texture unit 2 */
+ val radiusDpLocation = GLES20.glGetUniformLocation(mProgram, "radiusDp")
+ val radiusDp = (Resources.getSystem().displayMetrics.density * THUMBNAIL_SIZE).toInt()
+ GLES20.glUniform2f(radiusDpLocation, radiusDp.toFloat(), radiusDp.toFloat())
+ mTextureWidth = 0
+ mTextureHeight = 0
+ }
+
+ fun setupTextures(frame: Frame) {
+ if (mTextureIds[0] != 0) {
+ GLES20.glDeleteTextures(3, mTextureIds, 0)
+ }
+ GLES20.glGenTextures(3, mTextureIds, 0)
+ val w = frame.width
+ val h = frame.height
+ val hw = w + 1 shr 1
+ val hh = h + 1 shr 1
+ initializeTexture(GLES20.GL_TEXTURE0, mTextureIds[0], w, h)
+ initializeTexture(GLES20.GL_TEXTURE1, mTextureIds[1], hw, hh)
+ initializeTexture(GLES20.GL_TEXTURE2, mTextureIds[2], hw, hh)
+ mTextureWidth = frame.width
+ mTextureHeight = frame.height
+ }
+
+ fun updateTextures(frame: Frame) {
+ val width = frame.width
+ val height = frame.height
+ val half_width = width + 1 shr 1
+ val half_height = height + 1 shr 1
+ val y_size = width * height
+ val uv_size = half_width * half_height
+ val bb = frame.buffer
+ // If we are reusing this frame, make sure we reset position and
+ // limit
+ bb.clear()
+ if (bb.remaining() == y_size + uv_size * 2) {
+ bb.position(0)
+ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1)
+ GLES20.glPixelStorei(GLES20.GL_PACK_ALIGNMENT, 1)
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE0)
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIds[0])
+ GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, width,
+ height, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE,
+ bb)
+ bb.position(y_size)
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE1)
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIds[1])
+ GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0,
+ half_width, half_height, GLES20.GL_LUMINANCE,
+ GLES20.GL_UNSIGNED_BYTE, bb)
+ bb.position(y_size + uv_size)
+ GLES20.glActiveTexture(GLES20.GL_TEXTURE2)
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIds[2])
+ GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0,
+ half_width, half_height, GLES20.GL_LUMINANCE,
+ GLES20.GL_UNSIGNED_BYTE, bb)
+ } else {
+ mTextureWidth = 0
+ mTextureHeight = 0
+ }
+ }
+
+ override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) {
+ GLES20.glViewport(0, 0, width, height)
+ mViewportWidth = width
+ mViewportHeight = height
+ }
+
+ var metadataListener: ThumbnailCircleVideoRendererMetadataListener? = null
+ override fun onDrawFrame(gl: GL10) {
+ gl.glClearColor(0f, 0f, 0f, 0f)
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+ mFrameLock.lock()
+ if (mCurrentFrame != null && !mVideoDisabled) {
+ GLES20.glUseProgram(mProgram)
+ if (mTextureWidth != mCurrentFrame!!.width
+ || mTextureHeight != mCurrentFrame!!.height) {
+ setupTextures(mCurrentFrame!!)
+ }
+ updateTextures(mCurrentFrame!!)
+ Matrix.setIdentityM(mScaleMatrix, 0)
+ var scaleX = 1.0f
+ var scaleY = 1.0f
+ val ratio = (mCurrentFrame!!.width.toFloat()
+ / mCurrentFrame!!.height)
+ val vratio = mViewportWidth.toFloat() / mViewportHeight
+ if (mVideoFitEnabled) {
+ if (ratio > vratio) {
+ scaleY = vratio / ratio
+ } else {
+ scaleX = ratio / vratio
+ }
+ } else {
+ if (ratio < vratio) {
+ scaleY = vratio / ratio
+ } else {
+ scaleX = ratio / vratio
+ }
+ }
+ Matrix.scaleM(mScaleMatrix, 0,
+ scaleX * if (mCurrentFrame!!.isMirroredX) -1.0f else 1.0f,
+ scaleY, 1f)
+ metadataListener?.onMetadataReady(mCurrentFrame!!.metadata)
+ val mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram,
+ "uMVPMatrix")
+ GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false,
+ mScaleMatrix, 0)
+ GLES20.glDrawElements(GLES20.GL_TRIANGLES, mVertexIndex.size,
+ GLES20.GL_UNSIGNED_SHORT, mDrawListBuffer)
+ } else {
+ //black frame when video is disabled
+ gl.glClearColor(0f, 0f, 0f, 1f)
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
+ }
+ mFrameLock.unlock()
+ }
+
+ fun displayFrame(frame: Frame?) {
+ mFrameLock.lock()
+ if (mCurrentFrame != null) {
+ mCurrentFrame!!.recycle()
+ }
+ mCurrentFrame = frame
+ mFrameLock.unlock()
+ }
+
+ fun disableVideo(b: Boolean) {
+ mFrameLock.lock()
+ mVideoDisabled = b
+ if (mVideoDisabled) {
+ if (mCurrentFrame != null) {
+ mCurrentFrame!!.recycle()
+ }
+ mCurrentFrame = null
+ }
+ mFrameLock.unlock()
+ }
+
+ fun enableVideoFit(enableVideoFit: Boolean) {
+ mVideoFitEnabled = enableVideoFit
+ }
+
+ companion object {
+ // number of coordinates per vertex in this array
+ const val COORDS_PER_VERTEX = 3
+ const val TEXTURECOORDS_PER_VERTEX = 2
+ var mXYZCoords = floatArrayOf(
+ -1.0f, 1.0f, 0.0f, // top left
+ -1.0f, -1.0f, 0.0f, // bottom left
+ 1.0f, -1.0f, 0.0f, // bottom right
+ 1.0f, 1.0f, 0.0f // top right
+ )
+ var mUVCoords = floatArrayOf(0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f)
+ fun initializeTexture(name: Int, id: Int, width: Int, height: Int) {
+ GLES20.glActiveTexture(name)
+ GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id)
+ GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+ GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST.toFloat())
+ GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+ GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR.toFloat())
+ GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+ GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE.toFloat())
+ GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
+ GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE.toFloat())
+ GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE,
+ width, height, 0, GLES20.GL_LUMINANCE,
+ GLES20.GL_UNSIGNED_BYTE, null)
+ }
+
+ fun loadShader(type: Int, shaderCode: String?): Int {
+ val shader = GLES20.glCreateShader(type)
+ GLES20.glShaderSource(shader, shaderCode)
+ GLES20.glCompileShader(shader)
+ return shader
+ }
+ }
+
+ init {
+ val bb = ByteBuffer.allocateDirect(mXYZCoords.size * 4)
+ bb.order(ByteOrder.nativeOrder())
+ mVertexBuffer = bb.asFloatBuffer()
+ mVertexBuffer.put(mXYZCoords)
+ mVertexBuffer.position(0)
+ val tb = ByteBuffer.allocateDirect(mUVCoords.size * 4)
+ tb.order(ByteOrder.nativeOrder())
+ mTextureBuffer = tb.asFloatBuffer()
+ mTextureBuffer.put(mUVCoords)
+ mTextureBuffer.position(0)
+ val dlb = ByteBuffer.allocateDirect(mVertexIndex.size * 2)
+ dlb.order(ByteOrder.nativeOrder())
+ mDrawListBuffer = dlb.asShortBuffer()
+ mDrawListBuffer.put(mVertexIndex)
+ mDrawListBuffer.position(0)
+ }
+ }
+
+ override fun onFrame(frame: Frame) {
+ mRenderer.displayFrame(frame)
+ mView.requestRender()
+ }
+
+ override fun setStyle(key: String, value: String) {
+ if (STYLE_VIDEO_SCALE == key) {
+ if (STYLE_VIDEO_FIT == value) {
+ mRenderer.enableVideoFit(true)
+ } else if (STYLE_VIDEO_FILL == value) {
+ mRenderer.enableVideoFit(false)
+ }
+ }
+ }
+
+ override fun onVideoPropertiesChanged(videoEnabled: Boolean) {
+ mRenderer.disableVideo(!videoEnabled)
+ }
+
+ override fun getView(): View {
+ return mView
+ }
+
+ override fun onPause() {
+ mView.onPause()
+ }
+
+ override fun onResume() {
+ mView.onResume()
+ }
+
+ companion object {
+ private const val THUMBNAIL_SIZE = 90 //in dp
+ }
+
+ init {
+ mView.setEGLContextClientVersion(2)
+ mView.setEGLConfigChooser(8, 8, 8, 8, 16, 0)
+ mView.holder.setFormat(PixelFormat.TRANSLUCENT)
+ mRenderer = MyRenderer()
+ mView.setRenderer(mRenderer)
+ mView.renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
+ }
+}
diff --git a/android/app/src/main/res/drawable/call.png b/android/app/src/main/res/drawable/call.png
index fc00f4f9..52f8e267 100644
Binary files a/android/app/src/main/res/drawable/call.png and b/android/app/src/main/res/drawable/call.png differ
diff --git a/android/app/src/main/res/drawable/camera_back.png b/android/app/src/main/res/drawable/camera_back.png
new file mode 100644
index 00000000..c3d63ac3
Binary files /dev/null and b/android/app/src/main/res/drawable/camera_back.png differ
diff --git a/android/app/src/main/res/drawable/camera_front.png b/android/app/src/main/res/drawable/camera_front.png
new file mode 100644
index 00000000..332ab0f5
Binary files /dev/null and b/android/app/src/main/res/drawable/camera_front.png differ
diff --git a/android/app/src/main/res/drawable/circle_shape.xml b/android/app/src/main/res/drawable/circle_shape.xml
new file mode 100644
index 00000000..27b49f9b
--- /dev/null
+++ b/android/app/src/main/res/drawable/circle_shape.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/drawable/expand.png b/android/app/src/main/res/drawable/expand.png
new file mode 100644
index 00000000..7020dc2e
Binary files /dev/null and b/android/app/src/main/res/drawable/expand.png differ
diff --git a/android/app/src/main/res/drawable/flip_disapled.png b/android/app/src/main/res/drawable/flip_disapled.png
deleted file mode 100644
index 5226029e..00000000
Binary files a/android/app/src/main/res/drawable/flip_disapled.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable/flip_enabled.png b/android/app/src/main/res/drawable/flip_enabled.png
deleted file mode 100644
index 152dc10e..00000000
Binary files a/android/app/src/main/res/drawable/flip_enabled.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable/ic_mini.xml b/android/app/src/main/res/drawable/ic_mini.xml
new file mode 100644
index 00000000..128a7430
--- /dev/null
+++ b/android/app/src/main/res/drawable/ic_mini.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/android/app/src/main/res/drawable/layout_rounded_bg.xml b/android/app/src/main/res/drawable/layout_rounded_bg.xml
new file mode 100644
index 00000000..ce73e763
--- /dev/null
+++ b/android/app/src/main/res/drawable/layout_rounded_bg.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/mic_disabled.png b/android/app/src/main/res/drawable/mic_disabled.png
index 3603df75..266cb6c7 100644
Binary files a/android/app/src/main/res/drawable/mic_disabled.png and b/android/app/src/main/res/drawable/mic_disabled.png differ
diff --git a/android/app/src/main/res/drawable/mic_enabled.png b/android/app/src/main/res/drawable/mic_enabled.png
index 5d9aa677..ef7617f7 100644
Binary files a/android/app/src/main/res/drawable/mic_enabled.png and b/android/app/src/main/res/drawable/mic_enabled.png differ
diff --git a/android/app/src/main/res/drawable/reducing.png b/android/app/src/main/res/drawable/reducing.png
new file mode 100644
index 00000000..59f2c9e6
Binary files /dev/null and b/android/app/src/main/res/drawable/reducing.png differ
diff --git a/android/app/src/main/res/drawable/shape_capsule.xml b/android/app/src/main/res/drawable/shape_capsule.xml
new file mode 100644
index 00000000..a5dcdd09
--- /dev/null
+++ b/android/app/src/main/res/drawable/shape_capsule.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/drawable/video_disabled.png b/android/app/src/main/res/drawable/video_disabled.png
new file mode 100644
index 00000000..d6ccbe7a
Binary files /dev/null and b/android/app/src/main/res/drawable/video_disabled.png differ
diff --git a/android/app/src/main/res/drawable/video_disanabled.png b/android/app/src/main/res/drawable/video_disanabled.png
deleted file mode 100644
index 5c20c7bd..00000000
Binary files a/android/app/src/main/res/drawable/video_disanabled.png and /dev/null differ
diff --git a/android/app/src/main/res/drawable/video_enabled.png b/android/app/src/main/res/drawable/video_enabled.png
index 23331e30..6fcbe750 100644
Binary files a/android/app/src/main/res/drawable/video_enabled.png and b/android/app/src/main/res/drawable/video_enabled.png differ
diff --git a/android/app/src/main/res/layout/activity_video_call.xml b/android/app/src/main/res/layout/activity_video_call.xml
index 2dcf2ba4..a54e57b3 100644
--- a/android/app/src/main/res/layout/activity_video_call.xml
+++ b/android/app/src/main/res/layout/activity_video_call.xml
@@ -1,169 +1,197 @@
-
+ android:background="@color/text_color"
+ android:orientation="vertical">
+
-
-
+
+
+
+
+ android:layout_alignParentEnd="true"
+ android:background="@drawable/shape_capsule"
+ android:padding="@dimen/padding_space_small">
+
+
+
+
-
+ android:layout_height="0dp"
+ app:layout_constraintBottom_toTopOf="@id/control_panel"
+ app:layout_constraintTop_toBottomOf="@+id/layout_name">
+
+
+
+
+
+
+ android:layout_below="@+id/layout_mini"
+ android:background="@color/remoteBackground">
-
-
-
-
+
-
-
+
-
+
+
+
+
+
+
+
+ android:padding="@dimen/padding_space_big"
+ app:layout_constraintBottom_toBottomOf="parent">
+ android:src="@drawable/call"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+ android:src="@drawable/reducing"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+ android:src="@drawable/video_enabled"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/btn_minimize"
+ app:layout_constraintTop_toTopOf="parent" />
+ android:src="@drawable/mic_enabled"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/btn_camera"
+ app:layout_constraintTop_toTopOf="parent" />
+
+
-
+ android:src="@drawable/audio_enabled"
+ android:visibility="gone"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/btn_mic"
+ app:layout_constraintTop_toTopOf="parent" />
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml
index d1d2a305..f52c2cf2 100644
--- a/android/app/src/main/res/values/colors.xml
+++ b/android/app/src/main/res/values/colors.xml
@@ -5,7 +5,17 @@
#fc3850
#e4e9f2
+ #80757575
+ #00ffffff
+
+
#827b92
#484258
+ #FF2E303A
+
+ #fff
+ #000
+ #389842
+ #d51e26
diff --git a/android/app/src/main/res/values/dimens.xml b/android/app/src/main/res/values/dimens.xml
index 79f3d269..0694f5f4 100644
--- a/android/app/src/main/res/values/dimens.xml
+++ b/android/app/src/main/res/values/dimens.xml
@@ -3,20 +3,39 @@
16dp
16dp
28dp
+ 12dp
24dp
60dp
54dp
+ 52dp
+ 24dp
+
+ 24dp
+ 25dp
88dp
+ 40dp
117dp
+ 50dp
50dp
+ 25dp
100dp
+ 40dp
90dp
-
- 24dp
- 25dp
+
+ 14sp
+ 16sp
+ 22sp
+
+
+ 4dp
+ 8sp
+ 16dp
+ 24dp
+
+
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 74349756..bc694f7c 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -4,5 +4,7 @@
الوقت المتبقي بالثانيه:
Settings
Cancel
+
+ Hello blank fragment
\ No newline at end of file
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
index 24355fae..e13b5b14 100644
--- a/android/app/src/main/res/values/styles.xml
+++ b/android/app/src/main/res/values/styles.xml
@@ -16,4 +16,21 @@
- true
- @null
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
index ea0f0026..badc1b18 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -16,10 +16,12 @@ allprojects {
repositories {
google()
jcenter()
+ mavenCentral()
maven { url 'https://tokbox.bintray.com/maven' }
}
}
+
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
diff --git a/dart b/dart
new file mode 100644
index 00000000..e69de29b
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 2314a2c8..3966a95c 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -46,6 +46,10 @@
Need to upload image
NSSpeechRecognitionUsageDescription
This permission is not needed by the app, but it is required by an underlying API. If you see this dialog, contact us.
+ UIBackgroundModes
+
+ audio
+
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
diff --git a/ios/Runner/VideoCallViewController.swift b/ios/Runner/VideoCallViewController.swift
index 5058fb9e..01a207a8 100644
--- a/ios/Runner/VideoCallViewController.swift
+++ b/ios/Runner/VideoCallViewController.swift
@@ -31,7 +31,7 @@ class VideoCallViewController: UIViewController {
var callBack: ICallProtocol?
var timer = Timer()
- var seconds = 30
+ var seconds = 55
var isUserConnect : Bool = false
var onRectFloat:((Bool)->Void)? = nil
diff --git a/lib/client/base_app_client.dart b/lib/client/base_app_client.dart
index c011a4e1..65c8341c 100644
--- a/lib/client/base_app_client.dart
+++ b/lib/client/base_app_client.dart
@@ -3,6 +3,7 @@ import 'dart:io' show Platform;
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
+import 'package:doctor_app_flutter/core/service/NavigationService.dart';
import 'package:doctor_app_flutter/core/viewModel/authentication_view_model.dart';
import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
@@ -12,6 +13,9 @@ import 'package:flutter/cupertino.dart';
import 'package:http/http.dart' as http;
import 'package:provider/provider.dart';
+import '../locator.dart';
+import '../routes.dart';
+
DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();
Helpers helpers = new Helpers();
@@ -116,7 +120,9 @@ class BaseAppClient {
await Provider.of(AppGlobal.CONTEX,
listen: false)
.logout();
+
Helpers.showErrorToast('Your session expired Please login again');
+ locator().pushNamedAndRemoveUntil(ROOT);
}
if (isAllowAny) {
onFailure(getError(parsed), statusCode);
diff --git a/lib/config/config.dart b/lib/config/config.dart
index 588976ba..eb361798 100644
--- a/lib/config/config.dart
+++ b/lib/config/config.dart
@@ -56,6 +56,8 @@ const ADD_REFERRED_DOCTOR_REMARKS = 'Services/DoctorApplication.svc/REST/AddRefe
const GET_MY_REFERRED_PATIENT = 'Services/DoctorApplication.svc/REST/GtMyReferredPatient';
+const GET_MY_REFERRED_OUT_PATIENT = 'Services/DoctorApplication.svc/REST/GtMyReferredOutPatient';
+
const GET_PENDING_REFERRAL_PATIENT = 'Services/DoctorApplication.svc/REST/PendingReferrals';
const CREATE_REFERRAL_PATIENT = 'Services/DoctorApplication.svc/REST/CreateReferral';
@@ -89,6 +91,7 @@ const CHECK_ACTIVATION_CODE_FOR_DOCTOR_APP = 'Services/DoctorApplication.svc/RES
const GET_DOC_PROFILES = 'Services/Doctors.svc/REST/GetDocProfiles';
const TRANSFERT_TO_ADMIN = 'LiveCareApi/DoctorApp/TransferToAdmin';
+const SEND_SMS_INSTRUCTIONS = 'LiveCareApi/DoctorApp/SendSMSInstruction';
const GET_ALTERNATIVE_SERVICE = 'LiveCareApi/DoctorApp/GetAlternativeServices';
const END_CALL = 'LiveCareApi/DoctorApp/EndCall';
const END_CALL_WITH_CHARGE = 'LiveCareApi/DoctorApp/CompleteCallWithCharge';
@@ -178,6 +181,8 @@ const GET_ECG = "Services/Patients.svc/REST/HIS_GetPatientMuseResults";
const GET_MY_REFERRAL_INPATIENT = "Services/DoctorApplication.svc/REST/GtMyReferralPatient";
+const GET_MY_REFERRAL_OUT_PATIENT = "Services/DoctorApplication.svc/REST/GtMyReferralForOutPatient";
+
const GET_MY_DISCHARGE_PATIENT = "Services/DoctorApplication.svc/REST/GtMyDischargeReferralPatient";
const GET_DISCHARGE_PATIENT = "Services/DoctorApplication.svc/REST/GtMyDischargePatient";
@@ -219,6 +224,9 @@ const GET_PENDING_PATIENT_ER_FOR_DOCTOR_APP = 'Services/DoctorApplication.svc/RE
const DOCTOR_CHECK_HAS_LIVE_CARE = "Services/DoctorApplication.svc/REST/CheckDoctorHasLiveCare";
const LIVE_CARE_IS_LOGIN = "LiveCareApi/DoctorApp/UseIsLogin";
+const ADD_REFERRED_REMARKS_NEW = "Services/DoctorApplication.svc/REST/AddReferredDoctorRemarks_New";
+const GET_SPECIAL_CLINICAL_CARE_LIST = "Services/DoctorApplication.svc/REST/GetSpecialClinicalCareList";
+const GET_SPECIAL_CLINICAL_CARE_MAPPING_LIST = "Services/DoctorApplication.svc/REST/GetSpecialClinicalCareMappingList";
var selectedPatientType = 1;
diff --git a/lib/config/localized_values.dart b/lib/config/localized_values.dart
index d1e67692..4d0436aa 100644
--- a/lib/config/localized_values.dart
+++ b/lib/config/localized_values.dart
@@ -712,7 +712,7 @@ const Map> localizedValues = {
'days': {'en': "Days", 'ar': "أيام"},
'months': {'en': "Months", 'ar': "أشهر"},
'years': {'en': "Years", 'ar': "سنين"},
- 'hr': {'en': "HR", 'ar': "س"},
+ 'hr': {'en': "Hr", 'ar': "س"},
'min': {'en': "Min", 'ar': "د"},
'appointmentNumber': {'en': "Appointment Number", 'ar': "رقم الموعد"},
'referralStatusHold': {'en': "Hold", 'ar': "معلق"},
@@ -1008,4 +1008,6 @@ const Map> localizedValues = {
"allLab": {"en": "All Lab", "ar": "جميع المختبرات"},
"allPrescription": {"en": "All Prescription", "ar": "جميع الوصفات"},
"addPrescription": {"en": "Add prescription", "ar": "إضافة الوصفات"},
+ "edit": {"en": "Edit", "ar": "تعديل"},
+ "summeryReply": {"en": "Summary Reply", "ar": "موجز الرد"},
};
diff --git a/lib/core/enum/PatientType.dart b/lib/core/enum/PatientType.dart
new file mode 100644
index 00000000..96fd9ae5
--- /dev/null
+++ b/lib/core/enum/PatientType.dart
@@ -0,0 +1,4 @@
+enum PatientType{
+ IN_PATIENT,
+ OUT_PATIENT,
+}
\ No newline at end of file
diff --git a/lib/core/model/live_care/AlternativeServicesList.dart b/lib/core/model/live_care/AlternativeServicesList.dart
index fab11b71..11f27b95 100644
--- a/lib/core/model/live_care/AlternativeServicesList.dart
+++ b/lib/core/model/live_care/AlternativeServicesList.dart
@@ -11,6 +11,7 @@ class AlternativeService {
AlternativeService.fromJson(Map json) {
serviceID = json['ServicID'];
serviceName = json['ServiceName'];
+ isSelected = false;
}
Map toJson() {
diff --git a/lib/core/model/patient_muse/PatientSearchRequestModel.dart b/lib/core/model/patient_muse/PatientSearchRequestModel.dart
index 437c5885..c2658c9f 100644
--- a/lib/core/model/patient_muse/PatientSearchRequestModel.dart
+++ b/lib/core/model/patient_muse/PatientSearchRequestModel.dart
@@ -11,20 +11,24 @@ class PatientSearchRequestModel {
int searchType;
String mobileNo;
String identificationNo;
+ int nursingStationID;
+ int clinicID=0;
PatientSearchRequestModel(
- {this.doctorID =0,
- this.firstName ="0",
- this.middleName ="0",
- this.lastName ="0",
- this.patientMobileNumber ="0",
- this.patientIdentificationID ="0",
- this.patientID =0,
- this.searchType =1,
- this.mobileNo="",
- this.identificationNo="0",
- this.from ="0",
- this.to ="0"});
+ {this.doctorID = 0,
+ this.firstName = "0",
+ this.middleName = "0",
+ this.lastName = "0",
+ this.patientMobileNumber = "0",
+ this.patientIdentificationID = "0",
+ this.patientID = 0,
+ this.searchType = 1,
+ this.mobileNo = "",
+ this.identificationNo = "0",
+ this.from = "0",
+ this.to = "0",
+ this.clinicID,
+ this.nursingStationID = 0});
PatientSearchRequestModel.fromJson(Map json) {
doctorID = json['DoctorID'];
@@ -39,6 +43,8 @@ class PatientSearchRequestModel {
searchType = json['SearchType'];
mobileNo = json['MobileNo'];
identificationNo = json['IdentificationNo'];
+ nursingStationID = json['NursingStationID'];
+ clinicID = json['ClinicID'];
}
Map toJson() {
@@ -55,6 +61,9 @@ class PatientSearchRequestModel {
data['SearchType'] = this.searchType;
data['MobileNo'] = this.mobileNo;
data['IdentificationNo'] = this.identificationNo;
+ data['NursingStationID'] = this.nursingStationID;
+ data['ClinicID'] = this.clinicID;
+ data['ProjectID'] = 0;
return data;
}
}
diff --git a/lib/core/model/referral/MyReferralPatientModel.dart b/lib/core/model/referral/MyReferralPatientModel.dart
index 797109dd..ce8a6447 100644
--- a/lib/core/model/referral/MyReferralPatientModel.dart
+++ b/lib/core/model/referral/MyReferralPatientModel.dart
@@ -61,71 +61,74 @@ class MyReferralPatientModel {
String priorityDescription;
String referringClinicDescription;
String referringDoctorName;
+ int referalStatus;
MyReferralPatientModel(
{this.rowID,
- this.projectID,
- this.lineItemNo,
- this.doctorID,
- this.patientID,
- this.doctorName,
- this.doctorNameN,
- this.firstName,
- this.middleName,
- this.lastName,
- this.firstNameN,
- this.middleNameN,
- this.lastNameN,
- this.gender,
- this.dateofBirth,
- this.mobileNumber,
- this.emailAddress,
- this.patientIdentificationNo,
- this.patientType,
- this.admissionNo,
- this.admissionDate,
- this.roomID,
- this.bedID,
- this.nursingStationID,
- this.description,
- this.nationalityName,
- this.nationalityNameN,
- this.clinicDescription,
- this.clinicDescriptionN,
- this.referralDoctor,
- this.referringDoctor,
- this.referralClinic,
- this.referringClinic,
- this.referralStatus,
- this.referralDate,
- this.referringDoctorRemarks,
- this.referredDoctorRemarks,
- this.referralResponseOn,
- this.priority,
- this.frequency,
- this.mAXResponseTime,
- this.episodeID,
- this.appointmentNo,
- this.appointmentDate,
- this.appointmentType,
- this.patientMRN,
- this.createdOn,
- this.clinicID,
- this.nationalityID,
- this.age,
- this.doctorImageURL,
- this.frequencyDescription,
- this.genderDescription,
- this.isDoctorLate,
- this.isDoctorResponse,
- this.nationalityFlagURL,
- this.nursingStationName,
- this.priorityDescription,
- this.referringClinicDescription,
- this.referringDoctorName});
+ this.projectID,
+ this.lineItemNo,
+ this.doctorID,
+ this.patientID,
+ this.doctorName,
+ this.doctorNameN,
+ this.firstName,
+ this.middleName,
+ this.lastName,
+ this.firstNameN,
+ this.middleNameN,
+ this.lastNameN,
+ this.gender,
+ this.dateofBirth,
+ this.mobileNumber,
+ this.emailAddress,
+ this.patientIdentificationNo,
+ this.patientType,
+ this.admissionNo,
+ this.admissionDate,
+ this.roomID,
+ this.bedID,
+ this.nursingStationID,
+ this.description,
+ this.nationalityName,
+ this.nationalityNameN,
+ this.clinicDescription,
+ this.clinicDescriptionN,
+ this.referralDoctor,
+ this.referringDoctor,
+ this.referralClinic,
+ this.referringClinic,
+ this.referralStatus,
+ this.referralDate,
+ this.referringDoctorRemarks,
+ this.referredDoctorRemarks,
+ this.referralResponseOn,
+ this.priority,
+ this.frequency,
+ this.mAXResponseTime,
+ this.episodeID,
+ this.appointmentNo,
+ this.appointmentDate,
+ this.appointmentType,
+ this.patientMRN,
+ this.createdOn,
+ this.clinicID,
+ this.nationalityID,
+ this.age,
+ this.doctorImageURL,
+ this.frequencyDescription,
+ this.genderDescription,
+ this.isDoctorLate,
+ this.isDoctorResponse,
+ this.nationalityFlagURL,
+ this.nursingStationName,
+ this.priorityDescription,
+ this.referringClinicDescription,
+ this.referringDoctorName,
+ this.referalStatus});
MyReferralPatientModel.fromJson(Map json) {
rowID = json['RowID'];
+ referalStatus = json['ReferalStatus'];
projectID = json['ProjectID'];
lineItemNo = json['LineItemNo'];
doctorID = json['DoctorID'];
@@ -158,8 +161,21 @@ class MyReferralPatientModel {
referringDoctor = json['ReferringDoctor'];
referralClinic = json['ReferralClinic'];
referringClinic = json['ReferringClinic'];
- referralStatus = json['ReferralStatus'];
- referralDate = AppDateUtils.convertStringToDate(json['ReferralDate']);
+ referralStatus = json["ReferralStatus"] is String
+ ? json['ReferralStatus'] == "Accepted"
+ ? 46
+ : json['ReferralStatus'] == "Pending"
+ ? 1
+ : 0
+ : json["ReferralStatus"];
+ try {
+ referralDate = AppDateUtils.getDateTimeFromString(json['ReferralDate']);
+ } catch (e) {
+ referralDate = AppDateUtils.convertStringToDate(json['ReferralDate']);
+ } finally {
+ referralDate = DateTime.now();
+ }
+
referringDoctorRemarks = json['ReferringDoctorRemarks'];
referredDoctorRemarks = json['ReferredDoctorRemarks'];
referralResponseOn = json['ReferralResponseOn'];
@@ -190,6 +206,7 @@ class MyReferralPatientModel {
Map toJson() {
final Map data = new Map();
data['RowID'] = this.rowID;
+ data['ReferalStatus'] = this.referalStatus;
data['ProjectID'] = this.projectID;
data['LineItemNo'] = this.lineItemNo;
data['DoctorID'] = this.doctorID;
@@ -253,6 +270,6 @@ class MyReferralPatientModel {
}
get patientName {
- return this.firstName+" "+this.lastName;
+ return this.firstName + " " + this.lastName;
}
}
diff --git a/lib/core/model/referral/MyReferralPatientRequestModel.dart b/lib/core/model/referral/MyReferralPatientRequestModel.dart
new file mode 100644
index 00000000..08b98a99
--- /dev/null
+++ b/lib/core/model/referral/MyReferralPatientRequestModel.dart
@@ -0,0 +1,104 @@
+class MyReferralPatientRequestModel {
+ int channel;
+ int clinicID;
+ int doctorID;
+ int editedBy;
+ String firstName;
+ String from;
+ String iPAdress;
+ bool isLoginForDoctorApp;
+ int languageID;
+ String lastName;
+ String middleName;
+ int patientID;
+ String patientIdentificationID;
+ String patientMobileNumber;
+ bool patientOutSA;
+ int patientTypeID;
+ int projectID;
+ String sessionID;
+ String stamp;
+ String to;
+ String tokenID;
+ double versionID;
+ String vidaAuthTokenID;
+
+ MyReferralPatientRequestModel(
+ {this.channel,
+ this.clinicID,
+ this.doctorID,
+ this.editedBy,
+ this.firstName,
+ this.from,
+ this.iPAdress,
+ this.isLoginForDoctorApp,
+ this.languageID,
+ this.lastName,
+ this.middleName,
+ this.patientID,
+ this.patientIdentificationID,
+ this.patientMobileNumber,
+ this.patientOutSA,
+ this.patientTypeID,
+ this.projectID,
+ this.sessionID,
+ this.stamp,
+ this.to,
+ this.tokenID,
+ this.versionID,
+ this.vidaAuthTokenID});
+
+ MyReferralPatientRequestModel.fromJson(Map json) {
+ channel = json['Channel'];
+ clinicID = json['ClinicID'];
+ doctorID = json['DoctorID'];
+ editedBy = json['EditedBy'];
+ firstName = json['FirstName'];
+ from = json['From'];
+ iPAdress = json['IPAdress'];
+ isLoginForDoctorApp = json['IsLoginForDoctorApp'];
+ languageID = json['LanguageID'];
+ lastName = json['LastName'];
+ middleName = json['MiddleName'];
+ patientID = json['PatientID'];
+ patientIdentificationID = json['PatientIdentificationID'];
+ patientMobileNumber = json['PatientMobileNumber'];
+ patientOutSA = json['PatientOutSA'];
+ patientTypeID = json['PatientTypeID'];
+ projectID = json['ProjectID'];
+ sessionID = json['SessionID'];
+ stamp = json['stamp'];
+ to = json['To'];
+ tokenID = json['TokenID'];
+ versionID = json['VersionID'];
+ vidaAuthTokenID = json['VidaAuthTokenID'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['Channel'] = this.channel;
+ data['ClinicID'] = this.clinicID;
+ data['DoctorID'] = this.doctorID;
+ data['EditedBy'] = this.editedBy;
+ data['FirstName'] = this.firstName;
+ data['From'] = this.from;
+ data['IPAdress'] = this.iPAdress;
+ data['IsLoginForDoctorApp'] = this.isLoginForDoctorApp;
+ data['LanguageID'] = this.languageID;
+ data['LastName'] = this.lastName;
+ data['MiddleName'] = this.middleName;
+ data['PatientID'] = this.patientID;
+ data['PatientIdentificationID'] = this.patientIdentificationID;
+ data['PatientMobileNumber'] = this.patientMobileNumber;
+ data['PatientOutSA'] = this.patientOutSA;
+ data['PatientTypeID'] = this.patientTypeID;
+ data['ProjectID'] = this.projectID;
+ data['SessionID'] = this.sessionID;
+ data['stamp'] = this.stamp;
+ data['To'] = this.to;
+ data['TokenID'] = this.tokenID;
+ data['VersionID'] = this.versionID;
+ data['VidaAuthTokenID'] = this.vidaAuthTokenID;
+ return data;
+ }
+}
diff --git a/lib/core/model/referral/add_referred_remarks_request.dart b/lib/core/model/referral/add_referred_remarks_request.dart
new file mode 100644
index 00000000..14089513
--- /dev/null
+++ b/lib/core/model/referral/add_referred_remarks_request.dart
@@ -0,0 +1,72 @@
+class AddReferredRemarksRequestModel {
+ int projectID;
+ int admissionNo;
+ int lineItemNo;
+ String referredDoctorRemarks;
+ int editedBy;
+ int referalStatus;
+ bool isLoginForDoctorApp;
+ String iPAdress;
+ bool patientOutSA;
+ String tokenID;
+ int languageID;
+ double versionID;
+ int channel;
+ String sessionID;
+ int deviceTypeID;
+
+ AddReferredRemarksRequestModel(
+ {this.projectID,
+ this.admissionNo,
+ this.lineItemNo,
+ this.referredDoctorRemarks,
+ this.editedBy,
+ this.referalStatus,
+ this.isLoginForDoctorApp,
+ this.iPAdress,
+ this.patientOutSA,
+ this.tokenID,
+ this.languageID,
+ this.versionID,
+ this.channel,
+ this.sessionID,
+ this.deviceTypeID});
+
+ AddReferredRemarksRequestModel.fromJson(Map json) {
+ projectID = json['ProjectID'];
+ admissionNo = json['AdmissionNo'];
+ lineItemNo = json['LineItemNo'];
+ referredDoctorRemarks = json['ReferredDoctorRemarks'];
+ editedBy = json['EditedBy'];
+ referalStatus = json['ReferalStatus'];
+ isLoginForDoctorApp = json['IsLoginForDoctorApp'];
+ iPAdress = json['IPAdress'];
+ patientOutSA = json['PatientOutSA'];
+ tokenID = json['TokenID'];
+ languageID = json['LanguageID'];
+ versionID = json['VersionID'];
+ channel = json['Channel'];
+ sessionID = json['SessionID'];
+ deviceTypeID = json['DeviceTypeID'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['ProjectID'] = this.projectID;
+ data['AdmissionNo'] = this.admissionNo;
+ data['LineItemNo'] = this.lineItemNo;
+ data['ReferredDoctorRemarks'] = this.referredDoctorRemarks;
+ data['EditedBy'] = this.editedBy;
+ data['ReferalStatus'] = this.referalStatus;
+ data['IsLoginForDoctorApp'] = this.isLoginForDoctorApp;
+ data['IPAdress'] = this.iPAdress;
+ data['PatientOutSA'] = this.patientOutSA;
+ data['TokenID'] = this.tokenID;
+ data['LanguageID'] = this.languageID;
+ data['VersionID'] = this.versionID;
+ data['Channel'] = this.channel;
+ data['SessionID'] = this.sessionID;
+ data['DeviceTypeID'] = this.deviceTypeID;
+ return data;
+ }
+}
diff --git a/lib/core/service/NavigationService.dart b/lib/core/service/NavigationService.dart
new file mode 100644
index 00000000..26191ffc
--- /dev/null
+++ b/lib/core/service/NavigationService.dart
@@ -0,0 +1,18 @@
+import 'package:flutter/material.dart';
+
+class NavigationService {
+ final GlobalKey navigatorKey =
+ new GlobalKey();
+ Future navigateTo(String routeName,{Object arguments}) {
+ return navigatorKey.currentState.pushNamed(routeName,arguments: arguments);
+ }
+
+ Future pushReplacementNamed(String routeName,{Object arguments}) {
+ return navigatorKey.currentState.pushReplacementNamed(routeName,arguments: arguments);
+ }
+
+
+ Future pushNamedAndRemoveUntil(String routeName) {
+ return navigatorKey.currentState.pushNamedAndRemoveUntil(routeName,(asd)=>false);
+ }
+}
\ No newline at end of file
diff --git a/lib/core/service/VideoCallService.dart b/lib/core/service/VideoCallService.dart
new file mode 100644
index 00000000..f72544a0
--- /dev/null
+++ b/lib/core/service/VideoCallService.dart
@@ -0,0 +1,89 @@
+import 'package:doctor_app_flutter/config/config.dart';
+import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
+import 'package:doctor_app_flutter/core/service/base/base_service.dart';
+import 'package:doctor_app_flutter/core/service/patient/LiveCarePatientServices.dart';
+import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart';
+import 'package:doctor_app_flutter/models/livecare/end_call_req.dart';
+import 'package:doctor_app_flutter/models/livecare/session_status_model.dart';
+import 'package:doctor_app_flutter/models/livecare/start_call_res.dart';
+import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
+import 'package:doctor_app_flutter/util/VideoChannel.dart';
+import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
+import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
+import 'package:flutter/cupertino.dart';
+
+import '../../locator.dart';
+import '../../routes.dart';
+import 'NavigationService.dart';
+
+class VideoCallService extends BaseService{
+
+ StartCallRes startCallRes;
+ PatiantInformtion patient;
+ LiveCarePatientServices _liveCarePatientServices = locator();
+
+ openVideo(StartCallRes startModel,PatiantInformtion patientModel,VoidCallback onCallConnected, VoidCallback onCallDisconnected)async{
+ this.startCallRes = startModel;
+ this.patient = patientModel;
+ DoctorProfileModel doctorProfile = await getDoctorProfile(isGetProfile: true);
+ await VideoChannel.openVideoCallScreen(
+ kToken: startCallRes.openTokenID,//"T1==cGFydG5lcl9pZD00NzI0Nzk1NCZzaWc9NGIyZDljOTY3YjFiNWU1YzUzNzFmMjIyNjJmNmEzY2Y5NzZjOTdlYzpzZXNzaW9uX2lkPTFfTVg0ME56STBOemsxTkg1LU1UWXlNekEyTlRRMU9EVXhObjVrVFRoMFlVdFJXaXRYTWpadFZGZHFhSGxZVGpOdE1UVi1mZyZjcmVhdGVfdGltZT0xNjIzMDY1NDk1Jm5vbmNlPTAuMjM2Mjk0NTIwMTkyOTA4OTcmcm9sZT1wdWJsaXNoZXImZXhwaXJlX3RpbWU9MTYyNTY1NzQ5NCZpbml0aWFsX2xheW91dF9jbGFzc19saXN0PQ==",
+ kSessionId:startCallRes.openSessionID,//1_MX40NzI0Nzk1NH5-MTYyMzA2NTQ1ODUxNn5kTTh0YUtRWitXMjZtVFdqaHlYTjNtMTV-fg
+ kApiKey: '46209962',//'47247954'
+ vcId: patient.vcId,
+ patientName: patient.fullName ?? (patient.firstName != null ? "${patient.firstName} ${patient.lastName}" : "-"),
+ tokenID: await sharedPref.getString(TOKEN),
+ generalId: GENERAL_ID,
+ doctorId: doctorProfile.doctorID,
+ onFailure: (String error) {
+ DrAppToastMsg.showErrorToast(error);
+ },onCallConnected: onCallConnected,
+ onCallEnd: () {
+ WidgetsBinding.instance.addPostFrameCallback((_) async {
+ GifLoaderDialogUtils.showMyDialog(locator().navigatorKey.currentContext);
+ endCall(patient.vcId, false,).then((value) {
+ GifLoaderDialogUtils.hideDialog(locator().navigatorKey.currentContext);
+ if (hasError) {
+ DrAppToastMsg.showErrorToast(error);
+ }else
+ locator().navigateTo(PATIENTS_END_Call,arguments: {
+ "patient": patient,
+ });
+
+ });
+ });
+ },
+ onCallNotRespond: (SessionStatusModel sessionStatusModel) {
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ GifLoaderDialogUtils.showMyDialog(locator().navigatorKey.currentContext);
+ endCall(patient.vcId, sessionStatusModel.sessionStatus == 3,).then((value) {
+ GifLoaderDialogUtils.hideDialog(locator().navigatorKey.currentContext);
+ if (hasError) {
+ DrAppToastMsg.showErrorToast(error);
+ } else {
+ locator().navigateTo(PATIENTS_END_Call,arguments: {
+ "patient": patient,
+ });
+ }
+
+ });
+
+ });
+ });
+
+ }
+ Future endCall(int vCID, bool isPatient) async {
+ hasError = false;
+ await getDoctorProfile(isGetProfile: true);
+ EndCallReq endCallReq = new EndCallReq();
+ endCallReq.doctorId = doctorProfile.doctorID;
+ endCallReq.generalid = 'Cs2020@2016\$2958';
+ endCallReq.vCID = vCID;
+ endCallReq.isDestroy = isPatient;
+ await _liveCarePatientServices.endCall(endCallReq);
+ if (_liveCarePatientServices.hasError) {
+ error = _liveCarePatientServices.error;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/lib/core/service/home/dasboard_service.dart b/lib/core/service/home/dasboard_service.dart
index b35d24f2..ad3ec887 100644
--- a/lib/core/service/home/dasboard_service.dart
+++ b/lib/core/service/home/dasboard_service.dart
@@ -1,10 +1,12 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/service/base/base_service.dart';
import 'package:doctor_app_flutter/models/dashboard/dashboard_model.dart';
+import 'package:doctor_app_flutter/models/dashboard/get_special_clinical_care_List_Respose_Model.dart';
class DashboardService extends BaseService {
List _dashboardItemsList = [];
List get dashboardItemsList => _dashboardItemsList;
+
bool hasVirtualClinic = false;
String sServiceID;
@@ -24,8 +26,6 @@ class DashboardService extends BaseService {
super.error = error;
},
body: {
- // "VidaAuthTokenID":
- // "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyODA0IiwianRpIjoiZDYxZmM5MTQtZWFhYy00YjQ4LTgyMmEtMmE3OTNlZDMzZGYwIiwiZW1haWwiOiJNb2hhbWVkLlJlc3dhbkBjbG91ZHNvbHV0aW9uLXNhLmNvbSIsImlkIjoiMjgwNCIsIk5hbWUiOiJNVUhBTU1BRCBBWkFNIiwiRW1wbG95ZWVJZCI6IjE0ODUiLCJGYWNpbGl0eUdyb3VwSWQiOiIwMTAyNjYiLCJGYWNpbGl0eUlkIjoiMTUiLCJQaGFyYW1jeUZhY2lsaXR5SWQiOiI1NSIsIklTX1BIQVJNQUNZX0NPTk5FQ1RFRCI6IlRydWUiLCJEb2N0b3JJZCI6IjE0ODUiLCJTRVNTSU9OSUQiOiIyMTU3NTgwOCIsIkNsaW5pY0lkIjoiMyIsInJvbGUiOlsiU0VDVVJJVFkgQURNSU5JU1RSQVRPUlMiLCJTRVRVUCBBRE1JTklTVFJBVE9SUyIsIkNFTydTIiwiRVhFQ1VUSVZFIERJUkVDVE9SUyIsIk1BTkFHRVJTIiwiU1VQRVJWSVNPUlMiLCJDTElFTlQgU0VSVklDRVMgQ09PUkRJTkFUT1JTIiwiQ0xJRU5UIFNFUlZJQ0VTIFNVUEVSVklTT1JTIiwiQ0xJRU5UIFNFUlZJQ0VTIE1BTkdFUlMiLCJIRUFEIE5VUlNFUyIsIkRPQ1RPUlMiLCJDSElFRiBPRiBNRURJQ0FMIFNUQUZGUyIsIkJJTy1NRURJQ0FMIFRFQ0hOSUNJQU5TIiwiQklPLU1FRElDQUwgRU5HSU5FRVJTIiwiQklPLU1FRElDQUwgREVQQVJUTUVOVCBIRUFEUyIsIklUIEhFTFAgREVTSyIsIkFETUlOSVNUUkFUT1JTIiwiTEFCIEFETUlOSVNUUkFUT1IiLCJMQUIgVEVDSE5JQ0lBTiIsIkJVU0lORVNTIE9GRklDRSBTVEFGRiIsIkZJTkFOQ0UgQUNDT1VOVEFOVFMiLCJQSEFSTUFDWSBTVEFGRiIsIkFDQ09VTlRTIFNUQUZGIiwiTEFCIFJFQ0VQVElPTklTVCIsIkVSIE5VUlNFIiwiSU5QQVRJRU5UIEJJTExJTkcgU1VQRVJWSVNPUiIsIkxEUi1PUiBOVVJTRVMiLCJBRE1JU1NJT04gU1RBRkYiLCJIRUxQIERFU0sgQURNSU4iLCJBUFBST1ZBTCBTVEFGRiIsIklOUEFUSUVOVCBCSUxMSU5HIENPT1JESU5BVE9SIiwiQklMTElORyBTVEFGRiIsIkNPTlNFTlQgIiwiQ29uc2VudCAtIERlbnRhbCIsIldFQkVNUiJdLCJuYmYiOjE2MDgwMjg0NzQsImV4cCI6MTYwODg5MjQ3NCwiaWF0IjoxNjA4MDI4NDc0fQ.8OJcy6vUuPnNTi_qSjip8YCrFdaRLtJKbNKXcMtnQxk"
},
);
}
@@ -48,4 +48,5 @@ class DashboardService extends BaseService {
},
);
}
+
}
diff --git a/lib/core/service/home/scan_qr_service.dart b/lib/core/service/home/scan_qr_service.dart
new file mode 100644
index 00000000..bc6c8820
--- /dev/null
+++ b/lib/core/service/home/scan_qr_service.dart
@@ -0,0 +1,41 @@
+import 'package:doctor_app_flutter/config/config.dart';
+import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
+import 'package:doctor_app_flutter/core/service/base/base_service.dart';
+import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
+
+class ScanQrService extends BaseService {
+ List myInPatientList = List();
+ List inPatientList = List();
+
+ Future getInPatient(PatientSearchRequestModel requestModel, bool isMyInpatient) async {
+ hasError = false;
+ await getDoctorProfile();
+
+ if (isMyInpatient) {
+ requestModel.doctorID = doctorProfile.doctorID;
+ } else {
+ requestModel.doctorID = 0;
+ }
+
+ await baseAppClient.post(
+ GET_PATIENT_IN_PATIENT_LIST,
+ onSuccess: (dynamic response, int statusCode) {
+ inPatientList.clear();
+ myInPatientList.clear();
+
+ response['List_MyInPatient'].forEach((v) {
+ PatiantInformtion patient = PatiantInformtion.fromJson(v);
+ inPatientList.add(patient);
+ if (patient.doctorId == doctorProfile.doctorID) {
+ myInPatientList.add(patient);
+ }
+ });
+ },
+ onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ },
+ body: requestModel.toJson(),
+ );
+ }
+}
diff --git a/lib/core/service/patient/LiveCarePatientServices.dart b/lib/core/service/patient/LiveCarePatientServices.dart
index ed09bbb9..29b120ec 100644
--- a/lib/core/service/patient/LiveCarePatientServices.dart
+++ b/lib/core/service/patient/LiveCarePatientServices.dart
@@ -1,4 +1,3 @@
-import 'dart:collection';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/model/live_care/AlternativeServicesList.dart';
@@ -19,7 +18,7 @@ class LiveCarePatientServices extends BaseService {
bool _isFinished = false;
- bool _isLive = false;
+ bool _isLive = true;
bool get isFinished => _isFinished;
@@ -75,7 +74,7 @@ class LiveCarePatientServices extends BaseService {
}, body: startCallReq.toJson(), isLiveCare: _isLive);
}
- Future endCallWithCharge(int vcID, String altServiceList) async {
+ Future endCallWithCharge(int vcID, List altServiceList) async {
hasError = false;
await baseAppClient.post(END_CALL_WITH_CHARGE, onSuccess: (dynamic response, int statusCode) {
endCallResponse = response;
@@ -85,6 +84,7 @@ class LiveCarePatientServices extends BaseService {
}, body: {
"VC_ID": vcID,
"AltServiceList": altServiceList,
+ "generalid":GENERAL_ID
}, isLiveCare: _isLive);
}
@@ -102,8 +102,23 @@ class LiveCarePatientServices extends BaseService {
}, isLiveCare: _isLive);
}
+ Future sendSMSInstruction(int vcID) async {
+ hasError = false;
+ await baseAppClient.post(SEND_SMS_INSTRUCTIONS,
+ onSuccess: (dynamic response, int statusCode) {
+ transferToAdminResponse = response;
+ }, onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ }, body: {
+ "VC_ID": vcID, "generalid": GENERAL_ID
+ }, isLiveCare: _isLive);
+ }
+
Future isLogin({LiveCareUserLoginRequestModel isLoginRequestModel, int loginStatus}) async {
hasError = false;
+ await getDoctorProfile( );
+ isLoginRequestModel.doctorId = super.doctorProfile.doctorID;
await baseAppClient.post(LIVE_CARE_IS_LOGIN, onSuccess: (response, statusCode) async {
isLoginResponse = response;
}, onFailure: (String error, int statusCode) {
@@ -126,6 +141,7 @@ class LiveCarePatientServices extends BaseService {
super.error = error;
}, body: {
"VC_ID": vcID,
- }, isLiveCare: _isLive);
+ "generalid": GENERAL_ID
+ }, isLiveCare: _isLive);
}
}
diff --git a/lib/core/service/patient/MyReferralPatientService.dart b/lib/core/service/patient/MyReferralPatientService.dart
index 536e68a7..87fcdd23 100644
--- a/lib/core/service/patient/MyReferralPatientService.dart
+++ b/lib/core/service/patient/MyReferralPatientService.dart
@@ -1,5 +1,7 @@
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/model/referral/MyReferralPatientModel.dart';
+import 'package:doctor_app_flutter/core/model/referral/MyReferralPatientRequestModel.dart';
+import 'package:doctor_app_flutter/core/model/referral/add_referred_remarks_request.dart';
import 'package:doctor_app_flutter/core/service/base/base_service.dart';
import 'package:doctor_app_flutter/models/doctor/request_add_referred_doctor_remarks.dart';
@@ -8,22 +10,21 @@ class MyReferralInPatientService extends BaseService {
Future getMyReferralPatientService() async {
hasError = false;
- Map body = Map();
await getDoctorProfile();
- body['DoctorID'] = doctorProfile.doctorID;
- body['FirstName'] = "0";
- body['MiddleName'] = "0";
- body['LastName'] = "0";
- body['PatientMobileNumber'] = "0";
- body['PatientIdentificationID'] = "0";
- body['PatientID'] = 0;
- body['From'] = "0";
- body['To'] = "0";
- body['stamp'] = DateTime.now().toIso8601String();
- body['IsLoginForDoctorApp'] = true;
- body['IPAdress'] = "11.11.11.11";
- body['PatientOutSA'] = false;
- body['PatientTypeID'] = 1;
+
+ MyReferralPatientRequestModel myReferralPatientRequestModel = MyReferralPatientRequestModel(
+ doctorID: doctorProfile.doctorID,
+ firstName: "0",
+ middleName: "0",
+ lastName: "0",
+ patientMobileNumber: "0",
+ patientIdentificationID: "0",
+ patientID: 0,
+ from: "0",
+ to: "0",
+ stamp: DateTime.now().toIso8601String(),
+ isLoginForDoctorApp: true,
+ patientTypeID: 1);
myReferralPatients.clear();
await baseAppClient.post(
GET_MY_REFERRAL_INPATIENT,
@@ -38,22 +39,53 @@ class MyReferralInPatientService extends BaseService {
hasError = true;
super.error = error;
},
- body: body,
+ body: myReferralPatientRequestModel.toJson(),
+ );
+ }
+
+ Future getMyReferralOutPatientService() async {
+ hasError = false;
+ await getDoctorProfile();
+
+ MyReferralPatientRequestModel myReferralPatientRequestModel = MyReferralPatientRequestModel(
+ doctorID: doctorProfile.doctorID,
+ firstName: "0",
+ middleName: "0",
+ lastName: "0",
+ patientMobileNumber: "0",
+ patientIdentificationID: "0",
+ patientID: 0,
+ from: "0",
+ to: "0",
+ stamp: DateTime.now().toIso8601String(),
+ isLoginForDoctorApp: true,
+ patientTypeID: 1);
+ myReferralPatients.clear();
+ await baseAppClient.post(
+ GET_MY_REFERRAL_OUT_PATIENT,
+ onSuccess: (dynamic response, int statusCode) {
+ if (response['List_MyOutPatientReferral'] != null) {
+ response['List_MyOutPatientReferral'].forEach((v) {
+ myReferralPatients.add(MyReferralPatientModel.fromJson(v));
+ });
+ }
+ },
+ onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ },
+ body: myReferralPatientRequestModel.toJson(),
);
}
- Future replay(
- String referredDoctorRemarks, MyReferralPatientModel referral) async {
+ Future replay(String referredDoctorRemarks, MyReferralPatientModel referral) async {
hasError = false;
await getDoctorProfile();
- RequestAddReferredDoctorRemarks _requestAddReferredDoctorRemarks =
- RequestAddReferredDoctorRemarks();
+ RequestAddReferredDoctorRemarks _requestAddReferredDoctorRemarks = RequestAddReferredDoctorRemarks();
_requestAddReferredDoctorRemarks.projectID = referral.projectID;
- _requestAddReferredDoctorRemarks.admissionNo =
- referral.admissionNo.toString();
+ _requestAddReferredDoctorRemarks.admissionNo = referral.admissionNo.toString();
_requestAddReferredDoctorRemarks.lineItemNo = referral.lineItemNo;
- _requestAddReferredDoctorRemarks.referredDoctorRemarks =
- referredDoctorRemarks;
+ _requestAddReferredDoctorRemarks.referredDoctorRemarks = referredDoctorRemarks;
_requestAddReferredDoctorRemarks.editedBy = doctorProfile.doctorID;
_requestAddReferredDoctorRemarks.patientID = referral.patientID;
_requestAddReferredDoctorRemarks.referringDoctor = referral.referringDoctor;
@@ -67,4 +99,32 @@ class MyReferralInPatientService extends BaseService {
},
);
}
+
+ Future replayReferred(String referredDoctorRemarks, MyReferralPatientModel referral, int referalStatus) async {
+ hasError = false;
+ await getDoctorProfile();
+ AddReferredRemarksRequestModel _requestAddReferredDoctorRemarks = AddReferredRemarksRequestModel(
+ editedBy: doctorProfile.doctorID,
+ projectID: doctorProfile.projectID,
+ referredDoctorRemarks: referredDoctorRemarks,
+ referalStatus: referalStatus);
+ _requestAddReferredDoctorRemarks.projectID = referral.projectID;
+ _requestAddReferredDoctorRemarks.admissionNo = int.parse(referral.admissionNo);
+ _requestAddReferredDoctorRemarks.lineItemNo = referral.lineItemNo;
+ _requestAddReferredDoctorRemarks.referredDoctorRemarks = referredDoctorRemarks;
+ _requestAddReferredDoctorRemarks.editedBy = doctorProfile.doctorID;
+ _requestAddReferredDoctorRemarks.referalStatus = referalStatus;
+
+ // _requestAddReferredDoctorRemarks.patientID = referral.patientID;
+ // _requestAddReferredDoctorRemarks.referringDoctor = referral.referringDoctor;
+ await baseAppClient.post(
+ ADD_REFERRED_REMARKS_NEW,
+ body: _requestAddReferredDoctorRemarks.toJson(),
+ onSuccess: (dynamic body, int statusCode) {},
+ onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ },
+ );
+ }
}
diff --git a/lib/core/service/patient/patient-doctor-referral-service.dart b/lib/core/service/patient/patient-doctor-referral-service.dart
index c83c74c9..81529590 100644
--- a/lib/core/service/patient/patient-doctor-referral-service.dart
+++ b/lib/core/service/patient/patient-doctor-referral-service.dart
@@ -157,6 +157,36 @@ class PatientReferralService extends LookupService {
);
}
+ Future getMyReferredOutPatient() async {
+ hasError = false;
+ RequestMyReferralPatientModel _requestMyReferralPatient =
+ RequestMyReferralPatientModel();
+ DoctorProfileModel doctorProfile = await getDoctorProfile();
+
+ await baseAppClient.post(
+ GET_MY_REFERRED_OUT_PATIENT,
+ onSuccess: (dynamic response, int statusCode) {
+ listMyReferredPatientModel.clear();
+
+ response['List_MyReferredOutPatient'].forEach((v) {
+ MyReferredPatientModel item = MyReferredPatientModel.fromJson(v);
+ if (doctorProfile != null) {
+ item.isReferralDoctorSameBranch =
+ doctorProfile.projectID == item.projectID;
+ } else {
+ item.isReferralDoctorSameBranch = false;
+ }
+ listMyReferredPatientModel.add(item);
+ });
+ },
+ onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ },
+ body: _requestMyReferralPatient.toJson(),
+ );
+ }
+
Future getPendingReferralList() async {
hasError = false;
DoctorProfileModel doctorProfile = await getDoctorProfile();
diff --git a/lib/core/service/patient/patient_service.dart b/lib/core/service/patient/patient_service.dart
index e15cc8d1..25e9481b 100644
--- a/lib/core/service/patient/patient_service.dart
+++ b/lib/core/service/patient/patient_service.dart
@@ -4,6 +4,7 @@ import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
import 'package:doctor_app_flutter/core/model/note/CreateNoteModel.dart';
import 'package:doctor_app_flutter/core/model/note/note_model.dart';
import 'package:doctor_app_flutter/core/model/note/update_note_model.dart';
+import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
import 'package:doctor_app_flutter/core/service/base/base_service.dart';
import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart';
import 'package:doctor_app_flutter/models/patient/get_clinic_by_project_id_request.dart';
@@ -12,6 +13,7 @@ import 'package:doctor_app_flutter/models/patient/get_list_stp_referral_frequenc
import 'package:doctor_app_flutter/models/patient/lab_orders/lab_orders_res_model.dart';
import 'package:doctor_app_flutter/models/patient/lab_result/lab_result.dart';
import 'package:doctor_app_flutter/models/patient/lab_result/lab_result_req_model.dart';
+import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/models/patient/prescription/prescription_report.dart';
import 'package:doctor_app_flutter/models/patient/prescription/prescription_report_for_in_patient.dart';
import 'package:doctor_app_flutter/models/patient/prescription/prescription_res_model.dart';
@@ -22,20 +24,19 @@ import 'package:doctor_app_flutter/models/patient/vital_sign/vital_sign_res_mode
class PatientService extends BaseService {
List _patientVitalSignList = [];
List patientVitalSignOrderdSubList = [];
+ List inPatientList = List();
+ List myInPatientList = List();
List get patientVitalSignList => _patientVitalSignList;
List _patientLabResultOrdersList = [];
- List get patientLabResultOrdersList =>
- _patientLabResultOrdersList;
+ List get patientLabResultOrdersList => _patientLabResultOrdersList;
- List get patientPrescriptionsList =>
- _patientPrescriptionsList;
+ List get patientPrescriptionsList => _patientPrescriptionsList;
List _patientPrescriptionsList = [];
- List get prescriptionReportForInPatientList =>
- _prescriptionReportForInPatientList;
+ List get prescriptionReportForInPatientList => _prescriptionReportForInPatientList;
List _prescriptionReportForInPatientList = [];
List _patientRadiologyList = [];
@@ -79,12 +80,9 @@ class PatientService extends BaseService {
get referalFrequancyList => _referalFrequancyList;
- DoctorsByClinicIdRequest _doctorsByClinicIdRequest =
- DoctorsByClinicIdRequest();
- STPReferralFrequencyRequest _referralFrequencyRequest =
- STPReferralFrequencyRequest();
- ClinicByProjectIdRequest _clinicByProjectIdRequest =
- ClinicByProjectIdRequest();
+ DoctorsByClinicIdRequest _doctorsByClinicIdRequest = DoctorsByClinicIdRequest();
+ STPReferralFrequencyRequest _referralFrequencyRequest = STPReferralFrequencyRequest();
+ ClinicByProjectIdRequest _clinicByProjectIdRequest = ClinicByProjectIdRequest();
ReferToDoctorRequest _referToDoctorRequest;
Future getPatientList(patient, patientType, {isView}) async {
@@ -138,6 +136,38 @@ class PatientService extends BaseService {
return Future.value(localRes);
}
+ Future getInPatient(PatientSearchRequestModel requestModel, bool isMyInpatient) async {
+ hasError = false;
+ await getDoctorProfile();
+
+ if (isMyInpatient) {
+ requestModel.doctorID = doctorProfile.doctorID;
+ } else {
+ requestModel.doctorID = 0;
+ }
+
+ await baseAppClient.post(
+ GET_PATIENT_IN_PATIENT_LIST,
+ onSuccess: (dynamic response, int statusCode) {
+ inPatientList.clear();
+ myInPatientList.clear();
+
+ response['List_MyInPatient'].forEach((v) {
+ PatiantInformtion patient = PatiantInformtion.fromJson(v);
+ inPatientList.add(patient);
+ if (patient.doctorId == doctorProfile.doctorID) {
+ myInPatientList.add(patient);
+ }
+ });
+ },
+ onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ },
+ body: requestModel.toJson(),
+ );
+ }
+
Future getLabResultOrders(patient) async {
hasError = false;
await baseAppClient.post(
@@ -181,8 +211,7 @@ class PatientService extends BaseService {
onSuccess: (dynamic response, int statusCode) {
_prescriptionReportForInPatientList = [];
response['List_PrescriptionReportForInPatient'].forEach((v) {
- prescriptionReportForInPatientList
- .add(PrescriptionReportForInPatient.fromJson(v));
+ prescriptionReportForInPatientList.add(PrescriptionReportForInPatient.fromJson(v));
});
},
onFailure: (String error, int statusCode) {
diff --git a/lib/core/service/patient/referred_patient_service.dart b/lib/core/service/patient/referred_patient_service.dart
deleted file mode 100644
index 0af9b077..00000000
--- a/lib/core/service/patient/referred_patient_service.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-import 'package:doctor_app_flutter/config/config.dart';
-import 'package:doctor_app_flutter/core/service/base/base_service.dart';
-import 'package:doctor_app_flutter/models/doctor/verify_referral_doctor_remarks.dart';
-import 'package:doctor_app_flutter/models/patient/my_referral/my_referred_patient_model.dart';
-import 'package:doctor_app_flutter/models/patient/request_my_referral_patient_model.dart';
-
-class ReferredPatientService extends BaseService {
- List _listMyReferredPatientModel = [];
-
- List get listMyReferredPatientModel =>
- _listMyReferredPatientModel;
-
- RequestMyReferralPatientModel _requestMyReferralPatient =
- RequestMyReferralPatientModel();
- VerifyReferralDoctorRemarks _verifyreferraldoctorremarks =
- VerifyReferralDoctorRemarks();
-
- Future getMyReferredPatient() async {
- await baseAppClient.post(
- GET_MY_REFERRED_PATIENT,
- onSuccess: (dynamic response, int statusCode) {
- _listMyReferredPatientModel.clear();
- response['List_MyReferredPatient'].forEach((v) {
- listMyReferredPatientModel.add(MyReferredPatientModel.fromJson(v));
- });
- // print(response['List_MyReferredPatient']);
- },
- onFailure: (String error, int statusCode) {
- hasError = true;
- super.error = error;
- },
- body: _requestMyReferralPatient.toJson(),
- );
- }
-
-}
diff --git a/lib/core/service/special_clinics/special_clinic_service.dart b/lib/core/service/special_clinics/special_clinic_service.dart
new file mode 100644
index 00000000..49237331
--- /dev/null
+++ b/lib/core/service/special_clinics/special_clinic_service.dart
@@ -0,0 +1,57 @@
+import 'package:doctor_app_flutter/config/config.dart';
+import 'package:doctor_app_flutter/core/service/base/base_service.dart';
+import 'package:doctor_app_flutter/models/dashboard/dashboard_model.dart';
+import 'package:doctor_app_flutter/models/dashboard/get_special_clinical_care_List_Respose_Model.dart';
+import 'package:doctor_app_flutter/models/dashboard/get_special_clinical_care_mapping_List_Respose_Model.dart';
+
+class SpecialClinicsService extends BaseService {
+
+
+ List _specialClinicalCareList = [];
+ List get specialClinicalCareList => _specialClinicalCareList;
+
+ List _specialClinicalCareMappingList = [];
+ List get specialClinicalCareMappingList => _specialClinicalCareMappingList;
+ Future getSpecialClinicalCareList() async {
+ hasError = false;
+ await baseAppClient.post(
+ GET_SPECIAL_CLINICAL_CARE_LIST,
+ onSuccess: (dynamic response, int statusCode) {
+
+ _specialClinicalCareList.clear();
+ response['List_SpecialClinicalCareList'].forEach((v) {
+ _specialClinicalCareList.add(GetSpecialClinicalCareListResponseModel.fromJson(v));
+ });},
+ onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ },
+ body: {
+ },
+ );
+ }
+
+
+ Future getSpecialClinicalCareMappingList(int clinicId) async {
+ hasError = false;
+ await baseAppClient.post(
+ GET_SPECIAL_CLINICAL_CARE_MAPPING_LIST,
+ onSuccess: (dynamic response, int statusCode) {
+
+ _specialClinicalCareMappingList.clear();
+ response['List_SpecialClinicalCareMappingList'].forEach((v) {
+ _specialClinicalCareMappingList.add(GetSpecialClinicalCareMappingListResponseModel.fromJson(v));
+ });},
+ onFailure: (String error, int statusCode) {
+ hasError = true;
+ super.error = error;
+ },
+ body: {
+ "ClinicID": clinicId,
+ "DoctorID":0,
+ "EditedBy":0
+ },
+ );
+ }
+
+}
diff --git a/lib/core/viewModel/LiveCarePatientViewModel.dart b/lib/core/viewModel/LiveCarePatientViewModel.dart
index a3d82907..378013bd 100644
--- a/lib/core/viewModel/LiveCarePatientViewModel.dart
+++ b/lib/core/viewModel/LiveCarePatientViewModel.dart
@@ -101,13 +101,13 @@ class LiveCarePatientViewModel extends BaseViewModel {
Future endCallWithCharge(int vcID, bool isConfirmed) async {
setState(ViewState.BusyLocal);
- String selectedServicesString = "";
+ List selectedServices = [];
if (isConfirmed) {
- selectedServicesString = getSelectedAlternativeServices();
+ selectedServices = getSelectedAlternativeServices();
}
await _liveCarePatientServices.endCallWithCharge(
- vcID, selectedServicesString);
+ vcID, selectedServices);
if (_liveCarePatientServices.hasError) {
error = _liveCarePatientServices.error;
setState(ViewState.ErrorLocal);
@@ -117,14 +117,14 @@ class LiveCarePatientViewModel extends BaseViewModel {
}
}
- String getSelectedAlternativeServices() {
+ List getSelectedAlternativeServices() {
List selectedServices = List();
for (AlternativeService service in alternativeServicesList) {
if (service.isSelected) {
selectedServices.add(service.serviceID);
}
}
- return selectedServices.toString();
+ return selectedServices;
}
Future getAlternativeServices(int vcID) async {
@@ -150,6 +150,18 @@ class LiveCarePatientViewModel extends BaseViewModel {
}
}
+ Future sendSMSInstruction(int vcID) async {
+ setState(ViewState.BusyLocal);
+ await _liveCarePatientServices.sendSMSInstruction(vcID);
+ if (_liveCarePatientServices.hasError) {
+ error = _liveCarePatientServices.error;
+ setState(ViewState.ErrorLocal);
+ } else {
+ await getPendingPatientERForDoctorApp();
+ setState(ViewState.Idle);
+ }
+ }
+
searchData(String str) {
var strExist = str.length > 0 ? true : false;
if (strExist) {
diff --git a/lib/core/viewModel/PatientMedicalReportViewModel.dart b/lib/core/viewModel/PatientMedicalReportViewModel.dart
index 999a0530..293cf587 100644
--- a/lib/core/viewModel/PatientMedicalReportViewModel.dart
+++ b/lib/core/viewModel/PatientMedicalReportViewModel.dart
@@ -25,12 +25,24 @@ class PatientMedicalReportViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
+ bool hasOnHold(){
+ bool hasHold = false;
+ medicalReportList.forEach((element) {
+ if(element.status == 1){
+ hasHold = true;
+ }
+ });
+
+ return hasHold;
+
+ }
+
Future getMedicalReportTemplate() async {
- setState(ViewState.Busy);
+ setState(ViewState.BusyLocal);
await _service.getMedicalReportTemplate();
if (_service.hasError) {
error = _service.error;
- setState(ViewState.Error);
+ setState(ViewState.ErrorLocal);
} else
setState(ViewState.Idle);
}
diff --git a/lib/core/viewModel/PatientSearchViewModel.dart b/lib/core/viewModel/PatientSearchViewModel.dart
index a0cd68d9..e0ee8948 100644
--- a/lib/core/viewModel/PatientSearchViewModel.dart
+++ b/lib/core/viewModel/PatientSearchViewModel.dart
@@ -4,6 +4,8 @@ import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
import 'package:doctor_app_flutter/core/service/patient/out_patient_service.dart';
import 'package:doctor_app_flutter/core/service/patient/patientInPatientService.dart';
+import 'package:doctor_app_flutter/core/service/special_clinics/special_clinic_service.dart';
+import 'package:doctor_app_flutter/models/dashboard/get_special_clinical_care_mapping_List_Respose_Model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
@@ -12,8 +14,10 @@ import 'base_view_model.dart';
class PatientSearchViewModel extends BaseViewModel {
OutPatientService _outPatientService = locator();
+ SpecialClinicsService _specialClinicsService = locator();
List get patientList => _outPatientService.patientList;
+ List get specialClinicalCareMappingList => _specialClinicsService.specialClinicalCareMappingList;
List filterData = [];
@@ -143,15 +147,22 @@ class PatientSearchViewModel extends BaseViewModel {
List filteredInPatientItems = List();
Future getInPatientList(PatientSearchRequestModel requestModel,
- {bool isMyInpatient = false}) async {
+ {bool isMyInpatient = false, bool isLocalBusy = false}) async {
await getDoctorProfile();
- setState(ViewState.Busy);
-
+ if(isLocalBusy) {
+ setState(ViewState.BusyLocal);
+ } else{
+ setState(ViewState.Busy);
+ }
if (inPatientList.length == 0)
await _inPatientService.getInPatientList(requestModel, false);
if (_inPatientService.hasError) {
error = _inPatientService.error;
+ if(isLocalBusy) {
+ setState(ViewState.ErrorLocal);
+ } else{
setState(ViewState.Error);
+ }
} else {
// setDefaultInPatientList();
setState(ViewState.Idle);
@@ -166,6 +177,9 @@ class PatientSearchViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
+
+
+
void clearPatientList() {
_inPatientService.inPatientList = [];
_inPatientService.myInPatientList = [];
@@ -195,4 +209,25 @@ class PatientSearchViewModel extends BaseViewModel {
notifyListeners();
}
}
+
+
+ getSpecialClinicalCareMappingList(clinicId,
+ {bool isLocalBusy = false}) async {
+ if (isLocalBusy) {
+ setState(ViewState.BusyLocal);
+ } else {
+ setState(ViewState.Busy);
+ }
+ await _specialClinicsService.getSpecialClinicalCareMappingList(clinicId);
+ if (_specialClinicsService.hasError) {
+ error = _specialClinicsService.error;
+ if (isLocalBusy) {
+ setState(ViewState.ErrorLocal);
+ } else {
+ setState(ViewState.Error);
+ }
+ } else {
+ setState(ViewState.Idle);
+ }
+ }
}
diff --git a/lib/core/viewModel/authentication_view_model.dart b/lib/core/viewModel/authentication_view_model.dart
index 58df9331..9da1933a 100644
--- a/lib/core/viewModel/authentication_view_model.dart
+++ b/lib/core/viewModel/authentication_view_model.dart
@@ -254,8 +254,8 @@ class AuthenticationViewModel extends BaseViewModel {
/// add token to shared preferences in case of send activation code is success
setDataAfterSendActivationSuccess(SendActivationCodeForDoctorAppResponseModel sendActivationCodeForDoctorAppResponseModel) {
- print("VerificationCode : " +
- sendActivationCodeForDoctorAppResponseModel.verificationCode);
+ print("VerificationCode : " + sendActivationCodeForDoctorAppResponseModel.verificationCode);
+ // DrAppToastMsg.showSuccesToast("VerificationCode : " + sendActivationCodeForDoctorAppResponseModel.verificationCode);
sharedPref.setString(VIDA_AUTH_TOKEN_ID,
sendActivationCodeForDoctorAppResponseModel.vidaAuthTokenID);
sharedPref.setString(VIDA_REFRESH_TOKEN_ID,
diff --git a/lib/core/viewModel/dashboard_view_model.dart b/lib/core/viewModel/dashboard_view_model.dart
index bbbef0b6..f35a4a2a 100644
--- a/lib/core/viewModel/dashboard_view_model.dart
+++ b/lib/core/viewModel/dashboard_view_model.dart
@@ -2,8 +2,10 @@ import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/service/home/dasboard_service.dart';
+import 'package:doctor_app_flutter/core/service/special_clinics/special_clinic_service.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/models/dashboard/dashboard_model.dart';
+import 'package:doctor_app_flutter/models/dashboard/get_special_clinical_care_List_Respose_Model.dart';
import 'package:doctor_app_flutter/models/doctor/clinic_model.dart';
import 'package:doctor_app_flutter/models/doctor/profile_req_Model.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
@@ -14,6 +16,7 @@ import 'base_view_model.dart';
class DashboardViewModel extends BaseViewModel {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
DashboardService _dashboardService = locator();
+ SpecialClinicsService _specialClinicsService = locator();
List get dashboardItemsList =>
_dashboardService.dashboardItemsList;
@@ -22,6 +25,9 @@ class DashboardViewModel extends BaseViewModel {
String get sServiceID => _dashboardService.sServiceID;
+ List get specialClinicalCareList => _specialClinicsService.specialClinicalCareList;
+
+
Future setFirebaseNotification(ProjectViewModel projectsProvider,
AuthenticationViewModel authProvider) async {
setState(ViewState.Busy);
@@ -64,6 +70,16 @@ class DashboardViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
+ Future getSpecialClinicalCareList() async {
+ setState(ViewState.Busy);
+ await _specialClinicsService.getSpecialClinicalCareList();
+ if (_specialClinicsService.hasError) {
+ error = _specialClinicsService.error;
+ setState(ViewState.Error);
+ } else
+ setState(ViewState.Idle);
+ }
+
Future changeClinic(
int clinicId, AuthenticationViewModel authProvider) async {
setState(ViewState.BusyLocal);
@@ -85,4 +101,17 @@ class DashboardViewModel extends BaseViewModel {
return value.toString();
}
+
+
+ GetSpecialClinicalCareListResponseModel getSpecialClinic(clinicId){
+ GetSpecialClinicalCareListResponseModel special ;
+ specialClinicalCareList.forEach((element) {
+ if(element.clinicID == 1){
+ special = element;
+ }
+ });
+
+ return special;
+
+ }
}
diff --git a/lib/core/viewModel/patient-referral-viewmodel.dart b/lib/core/viewModel/patient-referral-viewmodel.dart
index a414c200..0351db77 100644
--- a/lib/core/viewModel/patient-referral-viewmodel.dart
+++ b/lib/core/viewModel/patient-referral-viewmodel.dart
@@ -2,6 +2,7 @@ import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/referral/DischargeReferralPatient.dart';
import 'package:doctor_app_flutter/core/model/referral/MyReferralPatientModel.dart';
+import 'package:doctor_app_flutter/core/model/referral/add_referred_remarks_request.dart';
import 'package:doctor_app_flutter/core/service/patient/DischargedPatientService.dart';
import 'package:doctor_app_flutter/core/service/patient/MyReferralPatientService.dart';
import 'package:doctor_app_flutter/core/service/patient/ReferralService.dart';
@@ -18,16 +19,14 @@ import 'package:flutter/cupertino.dart';
import '../../locator.dart';
class PatientReferralViewModel extends BaseViewModel {
- PatientReferralService _referralPatientService =
- locator();
+ PatientReferralService _referralPatientService = locator();
ReferralService _referralService = locator();
- MyReferralInPatientService _myReferralService =
- locator();
+ MyReferralInPatientService _myReferralService = locator();
+
+ DischargedPatientService _dischargedPatientService = locator();
- DischargedPatientService _dischargedPatientService =
- locator();
List get myDischargeReferralPatient =>
_dischargedPatientService.myDischargeReferralPatients;
@@ -35,28 +34,21 @@ class PatientReferralViewModel extends BaseViewModel {
List get clinicsList => _referralPatientService.clinicsList;
- List get referralFrequencyList =>
- _referralPatientService.frequencyList;
+ List get referralFrequencyList => _referralPatientService.frequencyList;
List doctorsList = [];
- List get clinicDoctorsList =>
- _referralPatientService.doctorsList;
+ List get clinicDoctorsList => _referralPatientService.doctorsList;
- List get myReferralPatients =>
- _myReferralService.myReferralPatients;
+ List get myReferralPatients => _myReferralService.myReferralPatients;
- List get listMyReferredPatientModel =>
- _referralPatientService.listMyReferredPatientModel;
+ List get listMyReferredPatientModel => _referralPatientService.listMyReferredPatientModel;
- List get pendingReferral =>
- _referralPatientService.pendingReferralList;
+ List get pendingReferral => _referralPatientService.pendingReferralList;
- List get patientReferral =>
- _referralPatientService.patientReferralList;
+ List get patientReferral => _referralPatientService.patientReferralList;
- List get patientArrivalList =>
- _referralPatientService.patientArrivalList;
+ List get patientArrivalList => _referralPatientService.patientArrivalList;
Future getPatientReferral(PatiantInformtion patient) async {
setState(ViewState.Busy);
@@ -105,8 +97,7 @@ class PatientReferralViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
- Future getClinicDoctors(
- PatiantInformtion patient, int clinicId, int branchId) async {
+ Future getClinicDoctors(PatiantInformtion patient, int clinicId, int branchId) async {
setState(ViewState.BusyLocal);
await _referralPatientService.getDoctorsList(patient, clinicId, branchId);
if (_referralPatientService.hasError) {
@@ -124,17 +115,17 @@ class PatientReferralViewModel extends BaseViewModel {
Future getDoctorBranch() async {
DoctorProfileModel doctorProfile = await getDoctorProfile();
if (doctorProfile != null) {
- dynamic _selectedBranch = {
- "facilityId": doctorProfile.projectID,
- "facilityName": doctorProfile.projectName
- };
+ dynamic _selectedBranch = {"facilityId": doctorProfile.projectID, "facilityName": doctorProfile.projectName};
return _selectedBranch;
}
return null;
}
- Future getMyReferredPatient() async {
- setState(ViewState.Busy);
+ Future getMyReferredPatient({bool isFirstTime = true}) async {
+ if (isFirstTime)
+ setState(ViewState.Busy);
+ else
+ setState(ViewState.BusyLocal);
await _referralPatientService.getMyReferredPatient();
if (_referralPatientService.hasError) {
error = _referralPatientService.error;
@@ -143,6 +134,19 @@ class PatientReferralViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
+ Future getMyReferredOutPatient({bool isFirstTime = true}) async {
+ if (isFirstTime)
+ setState(ViewState.Busy);
+ else
+ setState(ViewState.BusyLocal);
+ await _referralPatientService.getMyReferredOutPatient();
+ if (_referralPatientService.hasError) {
+ error = _referralPatientService.error;
+ setState(ViewState.Error);
+ } else
+ setState(ViewState.Idle);
+ }
+
MyReferredPatientModel getReferredPatientItem(int index) {
return listMyReferredPatientModel[index];
}
@@ -157,18 +161,39 @@ class PatientReferralViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
- Future getMyReferralPatientService() async {
- setState(ViewState.Busy);
+ Future getMyReferralPatientService({bool localBusy = false}) async {
+ if (localBusy)
+ setState(ViewState.BusyLocal);
+ else
+ setState(ViewState.Busy);
await _myReferralService.getMyReferralPatientService();
if (_myReferralService.hasError) {
error = _myReferralService.error;
- setState(ViewState.Error);
+ if (localBusy)
+ setState(ViewState.ErrorLocal);
+ else
+ setState(ViewState.Error);
} else
setState(ViewState.Idle);
}
- Future replay(
- String referredDoctorRemarks, MyReferralPatientModel referral) async {
+ Future getMyReferralOutPatientService({bool localBusy = false}) async {
+ if (localBusy)
+ setState(ViewState.BusyLocal);
+ else
+ setState(ViewState.Busy);
+ await _myReferralService.getMyReferralOutPatientService();
+ if (_myReferralService.hasError) {
+ error = _myReferralService.error;
+ if (localBusy)
+ setState(ViewState.ErrorLocal);
+ else
+ setState(ViewState.Error);
+ } else
+ setState(ViewState.Idle);
+ }
+
+ Future replay(String referredDoctorRemarks, MyReferralPatientModel referral) async {
setState(ViewState.Busy);
await _myReferralService.replay(referredDoctorRemarks, referral);
if (_myReferralService.hasError) {
@@ -178,8 +203,7 @@ class PatientReferralViewModel extends BaseViewModel {
getMyReferralPatientService();
}
- Future responseReferral(
- PendingReferral pendingReferral, bool isAccepted) async {
+ Future responseReferral(PendingReferral pendingReferral, bool isAccepted) async {
setState(ViewState.Busy);
await _referralPatientService.responseReferral(pendingReferral, isAccepted);
if (_referralPatientService.hasError) {
@@ -189,11 +213,10 @@ class PatientReferralViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
- Future makeReferral(PatiantInformtion patient, String isoStringDate,
- int projectID, int clinicID, int doctorID, String remarks) async {
+ Future makeReferral(PatiantInformtion patient, String isoStringDate, int projectID, int clinicID, int doctorID,
+ String remarks) async {
setState(ViewState.Busy);
- await _referralPatientService.makeReferral(
- patient, isoStringDate, projectID, clinicID, doctorID, remarks);
+ await _referralPatientService.makeReferral(patient, isoStringDate, projectID, clinicID, doctorID, remarks);
if (_referralPatientService.hasError) {
error = _referralPatientService.error;
setState(ViewState.Error);
@@ -217,7 +240,7 @@ class PatientReferralViewModel extends BaseViewModel {
patientID: patient.patientId,
roomID: patient.roomId,
referralClinic: clinicID,
- admissionNo: patient.appointmentNo,
+ admissionNo: int.parse(patient.admissionNo),
referralDoctor: doctorID,
patientTypeID: patient.patientType,
referringDoctorRemarks: remarks,
@@ -233,12 +256,10 @@ class PatientReferralViewModel extends BaseViewModel {
}
}
- Future getPatientDetails(
- String fromDate, String toDate, int patientMrn, int appointmentNo) async {
+ Future getPatientDetails(String fromDate, String toDate, int patientMrn, int appointmentNo) async {
setState(ViewState.Busy);
- await _referralPatientService.getPatientArrivalList(toDate,
- fromDate: fromDate, patientMrn: patientMrn);
+ await _referralPatientService.getPatientArrivalList(toDate, fromDate: fromDate, patientMrn: patientMrn);
if (_referralPatientService.hasError) {
error = _referralPatientService.error;
setState(ViewState.Error);
@@ -257,8 +278,7 @@ class PatientReferralViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
- Future verifyReferralDoctorRemarks(
- MyReferredPatientModel referredPatient) async {
+ Future verifyReferralDoctorRemarks(MyReferredPatientModel referredPatient) async {
setState(ViewState.Busy);
await _referralPatientService.verifyReferralDoctorRemarks(referredPatient);
if (_referralPatientService.hasError) {
@@ -297,8 +317,7 @@ class PatientReferralViewModel extends BaseViewModel {
}
}
- PatiantInformtion getPatientFromReferral(
- MyReferredPatientModel referredPatient) {
+ PatiantInformtion getPatientFromReferral(MyReferredPatientModel referredPatient) {
PatiantInformtion patient = PatiantInformtion();
patient.doctorId = referredPatient.doctorID;
patient.doctorName = referredPatient.doctorName;
@@ -323,8 +342,7 @@ class PatientReferralViewModel extends BaseViewModel {
return patient;
}
- PatiantInformtion getPatientFromReferralO(
- MyReferralPatientModel referredPatient) {
+ PatiantInformtion getPatientFromReferralO(MyReferralPatientModel referredPatient) {
PatiantInformtion patient = PatiantInformtion();
patient.doctorId = referredPatient.doctorID;
patient.doctorName = referredPatient.doctorName;
@@ -349,8 +367,7 @@ class PatientReferralViewModel extends BaseViewModel {
return patient;
}
- PatiantInformtion getPatientFromDischargeReferralPatient(
- DischargeReferralPatient referredPatient) {
+ PatiantInformtion getPatientFromDischargeReferralPatient(DischargeReferralPatient referredPatient) {
PatiantInformtion patient = PatiantInformtion();
patient.doctorId = referredPatient.doctorID;
patient.doctorName = referredPatient.doctorName;
@@ -369,10 +386,19 @@ class PatientReferralViewModel extends BaseViewModel {
patient.roomId = referredPatient.roomID;
patient.bedId = referredPatient.bedID;
patient.nationalityName = referredPatient.nationalityName;
- patient.nationalityFlagURL =
- ''; // TODO from backend referredPatient.nationalityFlagURL;
+ patient.nationalityFlagURL = ''; // TODO from backend referredPatient.nationalityFlagURL;
patient.age = referredPatient.age;
patient.clinicDescription = referredPatient.clinicDescription;
return patient;
}
+
+ Future replayReferred(String referredDoctorRemarks, MyReferralPatientModel referral, int referalStatus) async {
+ setState(ViewState.Busy);
+ await _myReferralService.replayReferred(referredDoctorRemarks, referral, referalStatus);
+ if (_myReferralService.hasError) {
+ error = _myReferralService.error;
+ setState(ViewState.ErrorLocal);
+ } else
+ getMyReferralPatientService();
+ }
}
diff --git a/lib/core/viewModel/patient_view_model.dart b/lib/core/viewModel/patient_view_model.dart
index de40afde..5bc6250f 100644
--- a/lib/core/viewModel/patient_view_model.dart
+++ b/lib/core/viewModel/patient_view_model.dart
@@ -2,9 +2,11 @@ import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/note/CreateNoteModel.dart';
import 'package:doctor_app_flutter/core/model/note/note_model.dart';
import 'package:doctor_app_flutter/core/model/note/update_note_model.dart';
+import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
import 'package:doctor_app_flutter/core/service/patient/patient_service.dart';
import 'package:doctor_app_flutter/models/patient/lab_orders/lab_orders_res_model.dart';
import 'package:doctor_app_flutter/models/patient/lab_result/lab_result.dart';
+import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/models/patient/prescription/prescription_report.dart';
import 'package:doctor_app_flutter/models/patient/prescription/prescription_report_for_in_patient.dart';
import 'package:doctor_app_flutter/models/patient/prescription/prescription_res_model.dart';
@@ -17,51 +19,43 @@ import 'base_view_model.dart';
class PatientViewModel extends BaseViewModel {
PatientService _patientService = locator();
- List get patientVitalSignList =>
- _patientService.patientVitalSignList;
+ List get inPatientList => _patientService.inPatientList;
- List get patientVitalSignOrderdSubList =>
- _patientService.patientVitalSignOrderdSubList;
+ List get patientVitalSignList => _patientService.patientVitalSignList;
- List get patientLabResultOrdersList =>
- _patientService.patientLabResultOrdersList;
+ List get patientVitalSignOrderdSubList => _patientService.patientVitalSignOrderdSubList;
- List get patientPrescriptionsList =>
- _patientService.patientPrescriptionsList;
+ List get patientLabResultOrdersList => _patientService.patientLabResultOrdersList;
+
+ List get patientPrescriptionsList => _patientService.patientPrescriptionsList;
List get prescriptionReportForInPatientList =>
_patientService.prescriptionReportForInPatientList;
- List get prescriptionReport =>
- _patientService.prescriptionReport;
+ List get prescriptionReport => _patientService.prescriptionReport;
- List get patientRadiologyList =>
- _patientService.patientRadiologyList;
+ List get patientRadiologyList => _patientService.patientRadiologyList;
List get labResultList => _patientService.labResultList;
get insuranceApporvalsList => _patientService.insuranceApporvalsList;
- List get patientProgressNoteList =>
- _patientService.patientProgressNoteList;
+ List get patientProgressNoteList => _patientService.patientProgressNoteList;
List get clinicsList => _patientService.clinicsList;
List get doctorsList => _patientService.doctorsList;
- List get referralFrequencyList =>
- _patientService.referalFrequancyList;
+ List get referralFrequencyList => _patientService.referalFrequancyList;
- Future getPatientList(patient, patientType,
- {bool isBusyLocal = false, isView}) async {
+ Future getPatientList(patient, patientType, {bool isBusyLocal = false, isView}) async {
var localRes;
if (isBusyLocal) {
setState(ViewState.BusyLocal);
} else {
setState(ViewState.Busy);
}
- localRes = await _patientService.getPatientList(patient, patientType,
- isView: isView);
+ localRes = await _patientService.getPatientList(patient, patientType, isView: isView);
if (_patientService.hasError) {
error = _patientService.error;
@@ -210,16 +204,12 @@ class PatientViewModel extends BaseViewModel {
}
List getDoctorNameList() {
- var doctorNamelist = _patientService.doctorsList
- .map((value) => value['DoctorName'].toString())
- .toList();
+ var doctorNamelist = _patientService.doctorsList.map((value) => value['DoctorName'].toString()).toList();
return doctorNamelist;
}
List getClinicNameList() {
- var clinicsNameslist = _patientService.clinicsList
- .map((value) => value['ClinicDescription'].toString())
- .toList();
+ var clinicsNameslist = _patientService.clinicsList.map((value) => value['ClinicDescription'].toString()).toList();
return clinicsNameslist;
}
@@ -234,9 +224,8 @@ class PatientViewModel extends BaseViewModel {
}
List getReferralNamesList() {
- var referralNamesList = _patientService.referalFrequancyList
- .map((value) => value['Description'].toString())
- .toList();
+ var referralNamesList =
+ _patientService.referalFrequancyList.map((value) => value['Description'].toString()).toList();
return referralNamesList;
}
@@ -281,4 +270,18 @@ class PatientViewModel extends BaseViewModel {
} else
setState(ViewState.Idle);
}
+
+ Future getInPatientList(PatientSearchRequestModel requestModel, {bool isMyInpatient = false}) async {
+ await getDoctorProfile();
+ setState(ViewState.Busy);
+
+ await _patientService.getInPatient(requestModel, false);
+ if (_patientService.hasError) {
+ error = _patientService.error;
+ setState(ViewState.ErrorLocal);
+ } else {
+ // setDefaultInPatientList();
+ setState(ViewState.Idle);
+ }
+ }
}
diff --git a/lib/core/viewModel/referred_view_model.dart b/lib/core/viewModel/referred_view_model.dart
deleted file mode 100644
index 173aa60a..00000000
--- a/lib/core/viewModel/referred_view_model.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-import 'package:doctor_app_flutter/core/enum/viewstate.dart';
-import 'package:doctor_app_flutter/core/service/patient/referred_patient_service.dart';
-import 'package:doctor_app_flutter/models/patient/my_referral/my_referred_patient_model.dart';
-
-import '../../locator.dart';
-import 'base_view_model.dart';
-
-class ReferredPatientViewModel extends BaseViewModel {
- ReferredPatientService _referralPatientService =
- locator();
-
- List get listMyReferredPatientModel =>
- _referralPatientService.listMyReferredPatientModel;
-
- Future getMyReferredPatient() async {
- setState(ViewState.Busy);
- await _referralPatientService.getMyReferredPatient();
- if (_referralPatientService.hasError) {
- error = _referralPatientService.error;
- setState(ViewState.Error);
- } else
- setState(ViewState.Idle);
- }
-}
diff --git a/lib/core/viewModel/scan_qr_view_model.dart b/lib/core/viewModel/scan_qr_view_model.dart
new file mode 100644
index 00000000..86e975e3
--- /dev/null
+++ b/lib/core/viewModel/scan_qr_view_model.dart
@@ -0,0 +1,26 @@
+import 'package:doctor_app_flutter/core/enum/viewstate.dart';
+import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
+import 'package:doctor_app_flutter/core/service/home/scan_qr_service.dart';
+import 'package:doctor_app_flutter/core/viewModel/base_view_model.dart';
+import 'package:doctor_app_flutter/locator.dart';
+import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
+
+class ScanQrViewModel extends BaseViewModel {
+ ScanQrService _scanQrService = locator();
+ List get inPatientList => _scanQrService.inPatientList;
+
+ Future getInPatientList(PatientSearchRequestModel requestModel, {bool isMyInpatient = false}) async {
+ await getDoctorProfile();
+ setState(ViewState.Busy);
+
+ await _scanQrService.getInPatient(requestModel, true);
+ if (_scanQrService.hasError) {
+ error = _scanQrService.error;
+
+ setState(ViewState.ErrorLocal);
+ } else {
+ // setDefaultInPatientList();
+ setState(ViewState.Idle);
+ }
+ }
+}
diff --git a/lib/landing_page.dart b/lib/landing_page.dart
index cd7a8171..5bce4f71 100644
--- a/lib/landing_page.dart
+++ b/lib/landing_page.dart
@@ -4,6 +4,7 @@ import 'package:doctor_app_flutter/screens/home/home_screen.dart';
import 'package:doctor_app_flutter/screens/qr_reader/QR_reader_screen.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/app_drawer_widget.dart';
+import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/bottom_nav_bar.dart';
import 'package:doctor_app_flutter/widgets/shared/user-guid/app_showcase_widget.dart';
import 'package:flutter/cupertino.dart';
@@ -33,7 +34,7 @@ class _LandingPageState extends State {
@override
Widget build(BuildContext context) {
- return Scaffold(
+ return AppScaffold(
appBar: currentTab != 0
? AppBar(
elevation: 0,
diff --git a/lib/locator.dart b/lib/locator.dart
index 66ec9161..d74fad8b 100644
--- a/lib/locator.dart
+++ b/lib/locator.dart
@@ -1,42 +1,46 @@
import 'package:doctor_app_flutter/core/service/authentication_service.dart';
+import 'package:doctor_app_flutter/core/service/home/scan_qr_service.dart';
import 'package:doctor_app_flutter/core/viewModel/dashboard_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/hospitals_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/medical_file_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/patient_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/prescription_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/procedure_View_model.dart';
+import 'package:doctor_app_flutter/core/viewModel/scan_qr_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/sick_leave_view_model.dart';
import 'package:get_it/get_it.dart';
+import 'core/service/NavigationService.dart';
+import 'core/service/VideoCallService.dart';
import 'core/service/home/dasboard_service.dart';
+import 'core/service/home/doctor_reply_service.dart';
+import 'core/service/home/schedule_service.dart';
+import 'core/service/hospitals/hospitals_service.dart';
import 'core/service/patient/DischargedPatientService.dart';
import 'core/service/patient/LiveCarePatientServices.dart';
-import 'core/service/patient/patient_service.dart';
-import 'core/service/patient_medical_file/insurance/InsuranceCardService.dart';
import 'core/service/patient/MyReferralPatientService.dart';
import 'core/service/patient/PatientMuseService.dart';
import 'core/service/patient/ReferralService.dart';
+import 'core/service/patient/out_patient_service.dart';
+import 'core/service/patient/patient-doctor-referral-service.dart';
+import 'core/service/patient/patientInPatientService.dart';
+import 'core/service/patient/patient_service.dart';
+import 'core/service/patient/referral_patient_service.dart';
+import 'core/service/patient_medical_file/admission_request/patient-admission-request-service.dart';
+import 'core/service/patient_medical_file/insurance/InsuranceCardService.dart';
+import 'core/service/patient_medical_file/lab_order/labs_service.dart';
import 'core/service/patient_medical_file/medical_report/PatientMedicalReportService.dart';
import 'core/service/patient_medical_file/medical_report/medical_file_service.dart';
+import 'core/service/patient_medical_file/prescription/medicine_service.dart';
import 'core/service/patient_medical_file/prescription/prescription_service.dart';
+import 'core/service/patient_medical_file/prescription/prescriptions_service.dart';
import 'core/service/patient_medical_file/procedure/procedure_service.dart';
+import 'core/service/patient_medical_file/radiology/radiology_service.dart';
import 'core/service/patient_medical_file/sick_leave/sickleave_service.dart';
import 'core/service/patient_medical_file/soap/SOAP_service.dart';
-import 'core/service/home/doctor_reply_service.dart';
-import 'core/service/hospitals/hospitals_service.dart';
-import 'core/service/patient_medical_file/lab_order/labs_service.dart';
-import 'core/service/patient_medical_file/prescription/medicine_service.dart';
-import 'core/service/patient_medical_file/admission_request/patient-admission-request-service.dart';
-import 'core/service/patient/patient-doctor-referral-service.dart';
import 'core/service/patient_medical_file/ucaf/patient-ucaf-service.dart';
import 'core/service/patient_medical_file/vital_sign/patient-vital-signs-service.dart';
-import 'core/service/patient/out_patient_service.dart';
-import 'core/service/patient/patientInPatientService.dart';
-import 'core/service/patient_medical_file/prescription/prescriptions_service.dart';
-import 'core/service/patient_medical_file/radiology/radiology_service.dart';
-import 'core/service/patient/referral_patient_service.dart';
-import 'core/service/patient/referred_patient_service.dart';
-import 'core/service/home/schedule_service.dart';
+import 'core/service/special_clinics/special_clinic_service.dart';
import 'core/viewModel/DischargedPatientViewModel.dart';
import 'core/viewModel/InsuranceViewModel.dart';
import 'core/viewModel/LiveCarePatientViewModel.dart';
@@ -54,7 +58,6 @@ import 'core/viewModel/patient-vital-sign-viewmodel.dart';
import 'core/viewModel/prescriptions_view_model.dart';
import 'core/viewModel/radiology_view_model.dart';
import 'core/viewModel/referral_view_model.dart';
-import 'core/viewModel/referred_view_model.dart';
import 'core/viewModel/schedule_view_model.dart';
GetIt locator = GetIt.instance;
@@ -65,7 +68,6 @@ void setupLocator() {
locator.registerLazySingleton(() => DoctorReplyService());
locator.registerLazySingleton(() => ScheduleService());
locator.registerLazySingleton(() => ReferralPatientService());
- locator.registerLazySingleton(() => ReferredPatientService());
locator.registerLazySingleton(() => MedicineService());
locator.registerLazySingleton(() => PatientService());
locator.registerLazySingleton(() => DashboardService());
@@ -92,12 +94,15 @@ void setupLocator() {
locator.registerLazySingleton(() => HospitalsService());
locator.registerLazySingleton(() => PatientMedicalReportService());
locator.registerLazySingleton(() => LiveCarePatientServices());
+ locator.registerLazySingleton(() => NavigationService());
+ locator.registerLazySingleton(() => ScanQrService());
+ locator.registerLazySingleton(() => SpecialClinicsService());
+ locator.registerLazySingleton(() => VideoCallService());
/// View Model
locator.registerFactory(() => DoctorReplayViewModel());
locator.registerFactory(() => ScheduleViewModel());
locator.registerFactory(() => ReferralPatientViewModel());
- locator.registerFactory(() => ReferredPatientViewModel());
locator.registerFactory(() => MedicineViewModel());
locator.registerFactory(() => PatientViewModel());
locator.registerFactory(() => DashboardViewModel());
@@ -120,4 +125,5 @@ void setupLocator() {
locator.registerFactory(() => HospitalViewModel());
locator.registerFactory(() => LiveCarePatientViewModel());
locator.registerFactory(() => PatientMedicalReportViewModel());
+ locator.registerFactory(() => ScanQrViewModel());
}
diff --git a/lib/main.dart b/lib/main.dart
index a95378e5..c29429b0 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -11,6 +11,7 @@ import 'package:provider/provider.dart';
import './config/size_config.dart';
import './routes.dart';
import 'config/config.dart';
+import 'core/service/NavigationService.dart';
import 'core/viewModel/authentication_view_model.dart';
import 'locator.dart';
@@ -66,6 +67,7 @@ class MyApp extends StatelessWidget {
dividerColor: Colors.grey[350],
backgroundColor: Color.fromRGBO(255, 255, 255, 1),
),
+ navigatorKey: locator().navigatorKey,
initialRoute: INIT_ROUTE,
routes: routes,
debugShowCheckedModeBanner: false,
diff --git a/lib/models/dashboard/get_special_clinical_care_List_Respose_Model.dart b/lib/models/dashboard/get_special_clinical_care_List_Respose_Model.dart
new file mode 100644
index 00000000..ec19abb0
--- /dev/null
+++ b/lib/models/dashboard/get_special_clinical_care_List_Respose_Model.dart
@@ -0,0 +1,32 @@
+class GetSpecialClinicalCareListResponseModel {
+ int projectID;
+ int clinicID;
+ String clinicDescription;
+ String clinicDescriptionN;
+ bool isActive;
+
+ GetSpecialClinicalCareListResponseModel(
+ {this.projectID,
+ this.clinicID,
+ this.clinicDescription,
+ this.clinicDescriptionN,
+ this.isActive});
+
+ GetSpecialClinicalCareListResponseModel.fromJson(Map json) {
+ projectID = json['ProjectID'];
+ clinicID = json['ClinicID'];
+ clinicDescription = json['ClinicDescription'];
+ clinicDescriptionN = json['ClinicDescriptionN'];
+ isActive = json['IsActive'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['ProjectID'] = this.projectID;
+ data['ClinicID'] = this.clinicID;
+ data['ClinicDescription'] = this.clinicDescription;
+ data['ClinicDescriptionN'] = this.clinicDescriptionN;
+ data['IsActive'] = this.isActive;
+ return data;
+ }
+}
diff --git a/lib/models/dashboard/get_special_clinical_care_mapping_List_Respose_Model.dart b/lib/models/dashboard/get_special_clinical_care_mapping_List_Respose_Model.dart
new file mode 100644
index 00000000..287f40f1
--- /dev/null
+++ b/lib/models/dashboard/get_special_clinical_care_mapping_List_Respose_Model.dart
@@ -0,0 +1,37 @@
+class GetSpecialClinicalCareMappingListResponseModel {
+ int mappingProjectID;
+ int clinicID;
+ int nursingStationID;
+ bool isActive;
+ int projectID;
+ String description;
+
+ GetSpecialClinicalCareMappingListResponseModel(
+ {this.mappingProjectID,
+ this.clinicID,
+ this.nursingStationID,
+ this.isActive,
+ this.projectID,
+ this.description});
+
+ GetSpecialClinicalCareMappingListResponseModel.fromJson(
+ Map json) {
+ mappingProjectID = json['MappingProjectID'];
+ clinicID = json['ClinicID'];
+ nursingStationID = json['NursingStationID'];
+ isActive = json['IsActive'];
+ projectID = json['ProjectID'];
+ description = json['Description'];
+ }
+
+ Map toJson() {
+ final Map data = new Map();
+ data['MappingProjectID'] = this.mappingProjectID;
+ data['ClinicID'] = this.clinicID;
+ data['NursingStationID'] = this.nursingStationID;
+ data['IsActive'] = this.isActive;
+ data['ProjectID'] = this.projectID;
+ data['Description'] = this.description;
+ return data;
+ }
+}
diff --git a/lib/models/livecare/start_call_req.dart b/lib/models/livecare/start_call_req.dart
index 1ad04480..b3ceabb5 100644
--- a/lib/models/livecare/start_call_req.dart
+++ b/lib/models/livecare/start_call_req.dart
@@ -1,56 +1,56 @@
class StartCallReq {
- int vCID;
- bool isrecall;
- String tokenID;
- String generalid;
+ String clincName;
+ int clinicId;
+ String docSpec;
+ String docotrName;
int doctorId;
+ String generalid;
bool isOutKsa;
+ bool isrecall;
String projectName;
- String docotrName;
- String clincName;
- String docSpec;
- int clinicId;
+ String tokenID;
+ int vCID;
StartCallReq(
- {this.vCID,
- this.isrecall,
- this.tokenID,
- this.generalid,
- this.doctorId,
- this.isOutKsa,
- this.projectName,
- this.docotrName,
- this.clincName,
- this.docSpec,
- this.clinicId});
+ {this.clincName,
+ this.clinicId,
+ this.docSpec,
+ this.docotrName,
+ this.doctorId,
+ this.generalid,
+ this.isOutKsa,
+ this.isrecall,
+ this.projectName,
+ this.tokenID,
+ this.vCID});
StartCallReq.fromJson(Map json) {
- vCID = json['VC_ID'];
- isrecall = json['isrecall'];
- tokenID = json['TokenID'];
- generalid = json['generalid'];
+ clincName = json['clincName'];
+ clinicId = json['ClinicId'];
+ docSpec = json['Doc_Spec'];
+ docotrName = json['DocotrName'];
doctorId = json['DoctorId'];
+ generalid = json['generalid'];
isOutKsa = json['IsOutKsa'];
+ isrecall = json['isrecall'];
projectName = json['projectName'];
- docotrName = json['DocotrName'];
- clincName = json['clincName'];
- docSpec = json['Doc_Spec'];
- clinicId = json['ClinicId'];
+ tokenID = json['TokenID'];
+ vCID = json['VC_ID'];
}
Map toJson() {
final Map data = new Map();
- data['VC_ID'] = this.vCID;
- data['isrecall'] = this.isrecall;
- data['TokenID'] = this.tokenID;
- data['generalid'] = this.generalid;
+ data['clincName'] = this.clincName;
+ data['ClinicId'] = this.clinicId;
+ data['Doc_Spec'] = this.docSpec;
+ data['DocotrName'] = this.docotrName;
data['DoctorId'] = this.doctorId;
+ data['generalid'] = this.generalid;
data['IsOutKsa'] = this.isOutKsa;
+ data['isrecall'] = this.isrecall;
data['projectName'] = this.projectName;
- data['DocotrName'] = this.docotrName;
- data['clincName'] = this.clincName;
- data['Doc_Spec'] = this.docSpec;
- data['ClinicId'] = this.clinicId;
+ data['TokenID'] = this.tokenID;
+ data['VC_ID'] = this.vCID;
return data;
}
-}
+}
\ No newline at end of file
diff --git a/lib/models/patient/my_referral/my_referred_patient_model.dart b/lib/models/patient/my_referral/my_referred_patient_model.dart
index 44a427f7..b353e587 100644
--- a/lib/models/patient/my_referral/my_referred_patient_model.dart
+++ b/lib/models/patient/my_referral/my_referred_patient_model.dart
@@ -166,8 +166,9 @@ class MyReferredPatientModel {
referringDoctor = json['ReferringDoctor'];
referralClinic = json['ReferralClinic'];
referringClinic = json['ReferringClinic'];
- referralStatus = json['ReferralStatus'];
- referralDate = json['ReferralDate'];
+ createdOn = json['CreatedOn'];
+ referralStatus = json["ReferralStatus"] is String?json['ReferralStatus']== "Accepted"?46:json['ReferralStatus']=="Pending"?1:0 : json['ReferralStatus'];
+ referralDate = json['ReferralDate'] ?? createdOn;
referringDoctorRemarks = json['ReferringDoctorRemarks'];
referredDoctorRemarks = json['ReferredDoctorRemarks'];
referralResponseOn = json['ReferralResponseOn'];
@@ -179,7 +180,6 @@ class MyReferredPatientModel {
appointmentDate = json['AppointmentDate'];
appointmentType = json['AppointmentType'];
patientMRN = json['PatientMRN'];
- createdOn = json['CreatedOn'];
clinicID = json['ClinicID'];
nationalityID = json['NationalityID'];
age = json['Age'];
diff --git a/lib/models/patient/patiant_info_model.dart b/lib/models/patient/patiant_info_model.dart
index 71d46dc9..29dc6198 100644
--- a/lib/models/patient/patiant_info_model.dart
+++ b/lib/models/patient/patiant_info_model.dart
@@ -224,10 +224,13 @@ class PatiantInformtion {
isSigned: json['isSigned'],
medicationOrders: json['medicationOrders'],
nationality: json['nationality'] ?? json['NationalityNameN'],
- patientMRN: json['patientMRN'] ?? json['PatientMRN']?? (
- json["PatientID"] != null ?
- int.parse(json["PatientID"].toString())
- : int.parse(json["patientID"].toString())),
+ patientMRN: json['patientMRN'] ??
+ json['PatientMRN'] ??
+ (json["PatientID"] != null
+ ? int?.parse(json["PatientID"].toString())
+ : json["patientID"] != null ? int?.parse(
+ json["patientID"].toString()) : json["patientId"] != null ? int
+ ?.parse(json["patientId"].toString()) : ''),
visitType: json['visitType'] ?? json['visitType'] ?? json['visitType'],
nationalityFlagURL:
json['NationalityFlagURL'] ?? json['NationalityFlagURL'],
diff --git a/lib/routes.dart b/lib/routes.dart
index 33aa5636..0826c76e 100644
--- a/lib/routes.dart
+++ b/lib/routes.dart
@@ -1,4 +1,5 @@
import 'package:doctor_app_flutter/root_page.dart';
+import 'package:doctor_app_flutter/screens/live_care/end_call_screen.dart';
import 'package:doctor_app_flutter/screens/medical-file/health_summary_page.dart';
import 'package:doctor_app_flutter/screens/patients/ECGPage.dart';
import 'package:doctor_app_flutter/screens/patients/insurance_approval_screen_patient.dart';
@@ -37,6 +38,7 @@ const String LOGIN = 'login';
const String VERIFICATION_METHODS = 'verification-methods';
const String PATIENTS = 'patients/patients';
const String PATIENTS_PROFILE = 'patients/patients-profile';
+const String PATIENTS_END_Call = 'patients/patients-profile/endCall';
const String IN_PATIENTS_PROFILE = 'inpatients/patients-profile';
const String LAB_RESULT = 'patients/lab_result';
const String HEALTH_SUMMARY = 'patients/health-summary';
@@ -88,6 +90,7 @@ var routes = {
PATIENT_MEDICAL_REPORT: (_) => MedicalReportPage(),
PATIENT_MEDICAL_REPORT_INSERT: (_) => AddVerifyMedicalReport(),
PATIENT_MEDICAL_REPORT_DETAIL: (_) => MedicalReportDetailPage(),
+ PATIENTS_END_Call: (_) => EndCallScreen(),
CREATE_EPISODE: (_) => UpdateSoapIndex(
isUpdate: true,
),
diff --git a/lib/screens/home/home_patient_card.dart b/lib/screens/home/home_patient_card.dart
index bdaac7a7..b388a7e2 100644
--- a/lib/screens/home/home_patient_card.dart
+++ b/lib/screens/home/home_patient_card.dart
@@ -10,6 +10,7 @@ class HomePatientCard extends StatelessWidget {
final String text;
final Color textColor;
final Function onTap;
+ final double iconSize;
HomePatientCard({
@required this.backgroundColor,
@@ -18,6 +19,7 @@ class HomePatientCard extends StatelessWidget {
@required this.text,
@required this.textColor,
@required this.onTap,
+ this.iconSize = 30,
});
@override
@@ -34,14 +36,13 @@ class HomePatientCard extends StatelessWidget {
Expanded(
child: Stack(
children: [
- Positioned(
- bottom: 0.1,
- right: 0.5,
- width: 23.0,
- height: 25.0,
+ Container(
+ margin: EdgeInsets.only(top: 18, left: 10),
+ color:Colors.transparent,
+
child: Icon(
cardIcon,
- size: 60,
+ size: iconSize * 2,
color: backgroundIconColor,
),
),
@@ -52,7 +53,7 @@ class HomePatientCard extends StatelessWidget {
children: [
Icon(
cardIcon,
- size: 30,
+ size: iconSize,
color: textColor,
),
SizedBox(
diff --git a/lib/screens/home/home_screen.dart b/lib/screens/home/home_screen.dart
index 85ea3506..d448083f 100644
--- a/lib/screens/home/home_screen.dart
+++ b/lib/screens/home/home_screen.dart
@@ -69,6 +69,7 @@ class _HomeScreenState extends State {
await model.getDashboard();
await model.getDoctorProfile(isGetProfile: true);
await model.checkDoctorHasLiveCare();
+ // await model.getSpecialClinicalCareList();
},
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
@@ -287,7 +288,7 @@ class _HomeScreenState extends State {
child: ListView(
scrollDirection: Axis.horizontal,
children: [
- ...homePatientsCardsWidget(model),
+ ...homePatientsCardsWidget(model, projectsProvider),
])),
SizedBox(
height: 20,
@@ -305,7 +306,7 @@ class _HomeScreenState extends State {
);
}
- List homePatientsCardsWidget(DashboardViewModel model) {
+ List homePatientsCardsWidget(DashboardViewModel model,projectsProvider) {
colorIndex = 0;
List backgroundColors = List(3);
@@ -329,6 +330,7 @@ class _HomeScreenState extends State {
backgroundIconColor: backgroundIconColors[colorIndex],
cardIcon: DoctorApp.livecare,
textColor: textColors[colorIndex],
+ iconSize: 21,
text:
"${TranslationBase.of(context).liveCare}\n${TranslationBase.of(context).patients}",
onTap: () {
@@ -353,7 +355,8 @@ class _HomeScreenState extends State {
Navigator.push(
context,
FadePage(
- page: PatientInPatientScreen(),
+ page: PatientInPatientScreen(specialClinic: model.getSpecialClinic(clinicId??projectsProvider
+ .doctorClinicsList[0].clinicID),),
),
);
},
diff --git a/lib/screens/live_care/end_call_screen.dart b/lib/screens/live_care/end_call_screen.dart
index ee1a036d..d3db12b6 100644
--- a/lib/screens/live_care/end_call_screen.dart
+++ b/lib/screens/live_care/end_call_screen.dart
@@ -13,7 +13,7 @@ import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/PatientProfileButton.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
@@ -25,7 +25,7 @@ import 'package:hexcolor/hexcolor.dart';
class EndCallScreen extends StatefulWidget {
final PatiantInformtion patient;
- const EndCallScreen({Key key, this.patient}) : super(key: key);
+ const EndCallScreen({Key key, this.patient,}) : super(key: key);
@override
_EndCallScreenState createState() => _EndCallScreenState();
@@ -33,7 +33,7 @@ class EndCallScreen extends StatefulWidget {
class _EndCallScreenState extends State {
bool isInpatient = false;
-
+ PatiantInformtion patient;
bool isDischargedPatient = false;
bool isSearchAndOut = false;
String patientType;
@@ -42,16 +42,32 @@ class _EndCallScreenState extends State {
String to;
LiveCarePatientViewModel liveCareModel;
+ @override
+ void initState() {
+ super.initState();
+ if(widget.patient!=null)
+ patient = widget.patient;
+ }
+
+ @override
+ void didChangeDependencies() {
+ super.didChangeDependencies();
+ final routeArgs = ModalRoute.of(context).settings.arguments as Map;
+ if(routeArgs.containsKey('patient'))
+ patient = routeArgs['patient'];
+ }
@override
Widget build(BuildContext context) {
final List cardsList = [
PatientProfileCardModel(TranslationBase.of(context).resume,
TranslationBase.of(context).theCall, '', 'patient/vital_signs.png',
- isInPatient: isInpatient, onTap: () async {
+ isInPatient: isInpatient,
+ color: Colors.green[800],
+ onTap: () async {
GifLoaderDialogUtils.showMyDialog(context);
await liveCareModel
- .startCall(isReCall: false, vCID: widget.patient.vcId)
+ .startCall(isReCall: false, vCID: patient.vcId)
.then((value) async {
await liveCareModel.getDoctorProfile();
GifLoaderDialogUtils.hideDialog(context);
@@ -62,7 +78,8 @@ class _EndCallScreenState extends State {
kToken: liveCareModel.startCallRes.openTokenID,
kSessionId: liveCareModel.startCallRes.openSessionID,
kApiKey: '46209962',
- vcId: widget.patient.vcId,
+ vcId: patient.vcId,
+ patientName: patient.fullName ?? (patient.firstName != null ? "${patient.firstName} ${patient.lastName}" : "-"),
tokenID: await liveCareModel.getToken(),
generalId: GENERAL_ID,
doctorId: liveCareModel.doctorProfile.doctorID,
@@ -73,7 +90,7 @@ class _EndCallScreenState extends State {
GifLoaderDialogUtils.showMyDialog(context);
GifLoaderDialogUtils.showMyDialog(context);
await liveCareModel.endCall(
- widget.patient.vcId,
+ patient.vcId,
false,
);
GifLoaderDialogUtils.hideDialog(context);
@@ -86,7 +103,7 @@ class _EndCallScreenState extends State {
GifLoaderDialogUtils.showMyDialog(context);
GifLoaderDialogUtils.showMyDialog(context);
await liveCareModel.endCall(
- widget.patient.vcId,
+ patient.vcId,
sessionStatusModel.sessionStatus == 3,
);
GifLoaderDialogUtils.hideDialog(context);
@@ -105,20 +122,22 @@ class _EndCallScreenState extends State {
TranslationBase.of(context).consultation,
'',
'patient/vital_signs.png',
- isInPatient: isInpatient, onTap: () {
+ isInPatient: isInpatient,
+ color: Colors.red[800],
+ onTap: () {
Helpers.showConfirmationDialog(context,
"${TranslationBase.of(context).areYouSureYouWantTo} ${TranslationBase.of(context).endLC} ${TranslationBase.of(context).consultation} ?",
() async {
Navigator.of(context).pop();
GifLoaderDialogUtils.showMyDialog(context);
- await liveCareModel.getAlternativeServices(widget.patient.vcId);
+ await liveCareModel.getAlternativeServices(patient.vcId);
GifLoaderDialogUtils.hideDialog(context);
if (liveCareModel.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(liveCareModel.error);
} else {
showAlternativesDialog(context, liveCareModel, (bool isConfirmed) async {
GifLoaderDialogUtils.showMyDialog(context);
- await liveCareModel.endCallWithCharge(widget.patient.vcId, isConfirmed);
+ await liveCareModel.endCallWithCharge(patient.vcId, isConfirmed);
GifLoaderDialogUtils.hideDialog(context);
if (liveCareModel.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(liveCareModel.error);
@@ -136,10 +155,24 @@ class _EndCallScreenState extends State {
TranslationBase.of(context).instruction,
"",
'patient/health_summary.png',
- onTap: () {},
+ onTap: () {
+ Helpers.showConfirmationDialog(context,
+ "${TranslationBase.of(context).areYouSureYouWantTo} ${TranslationBase.of(context).sendLC} ${TranslationBase.of(context).instruction} ?",
+ () async {
+ Navigator.of(context).pop();
+ GifLoaderDialogUtils.showMyDialog(context);
+ await liveCareModel.sendSMSInstruction(patient.vcId);
+ GifLoaderDialogUtils.hideDialog(context);
+ if (liveCareModel.state == ViewState.ErrorLocal) {
+ DrAppToastMsg.showErrorToast(liveCareModel.error);
+ } else {
+ DrAppToastMsg.showSuccesToast("You successfully sent SMS instructions");
+ }
+ });
+ },
isInPatient: isInpatient,
isDartIcon: true,
- isDisable: true,
+ // isDisable: true,
dartIcon: DoctorApp.send_instruction),
PatientProfileCardModel(
TranslationBase.of(context).transferTo,
@@ -150,7 +183,7 @@ class _EndCallScreenState extends State {
context,
MaterialPageRoute(
builder: (BuildContext context) =>
- LivaCareTransferToAdmin(patient: widget.patient)));
+ LivaCareTransferToAdmin(patient: patient)));
},
isInPatient: isInpatient,
isDartIcon: true,
@@ -166,11 +199,15 @@ class _EndCallScreenState extends State {
appBarTitle: TranslationBase.of(context).patientProfile,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
- widget.patient, arrivalType ?? '7', '1',
+ appBar: PatientProfileAppBar(
+ patient,
+ onPressed: (){
+ Navigator.pop(context);
+
+ },
isInpatient: isInpatient,
- height: (widget.patient.patientStatusType != null &&
- widget.patient.patientStatusType == 43)
+ height: (patient.patientStatusType != null &&
+ patient.patientStatusType == 43)
? 210
: isDischargedPatient
? 240
@@ -213,7 +250,7 @@ class _EndCallScreenState extends State {
staggeredTileBuilder: (int index) => StaggeredTile.fit(1),
itemBuilder: (BuildContext context, int index) =>
PatientProfileButton(
- patient: widget.patient,
+ patient: patient,
patientType: patientType,
arrivalType: arrivalType,
from: from,
@@ -230,6 +267,7 @@ class _EndCallScreenState extends State {
isLoading: cardsList[index].isLoading,
isDartIcon: cardsList[index].isDartIcon,
dartIcon: cardsList[index].dartIcon,
+ color: cardsList[index].color,
),
),
],
@@ -311,6 +349,7 @@ class _EndCallScreenState extends State {
),
AppButton(
onPressed: () {
+ Navigator.of(context).pop();
Navigator.of(context).pop();
okFunction(false);
},
diff --git a/lib/screens/live_care/live-care_transfer_to_admin.dart b/lib/screens/live_care/live-care_transfer_to_admin.dart
index 2d0fb7d7..233f59d8 100644
--- a/lib/screens/live_care/live-care_transfer_to_admin.dart
+++ b/lib/screens/live_care/live-care_transfer_to_admin.dart
@@ -120,7 +120,7 @@ class _LivaCareTransferToAdminState extends State {
() async {
Navigator.of(context).pop();
GifLoaderDialogUtils.showMyDialog(context);
- model.transferToAdmin(widget.patient.vcId, noteController.text);
+ await model.transferToAdmin(widget.patient.vcId, noteController.text);
GifLoaderDialogUtils.hideDialog(context);
if (model.state == ViewState.ErrorLocal) {
DrAppToastMsg.showErrorToast(model.error);
diff --git a/lib/screens/live_care/live_care_patient_screen.dart b/lib/screens/live_care/live_care_patient_screen.dart
index 51757bf0..0b741989 100644
--- a/lib/screens/live_care/live_care_patient_screen.dart
+++ b/lib/screens/live_care/live_care_patient_screen.dart
@@ -6,7 +6,7 @@ import 'package:doctor_app_flutter/core/viewModel/LiveCarePatientViewModel.dart'
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/PatientCard.dart';
+import 'package:doctor_app_flutter/widgets/patients/patient_card/PatientCard.dart';
import 'package:doctor_app_flutter/widgets/shared/app_loader_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
diff --git a/lib/screens/live_care/video_call.dart b/lib/screens/live_care/video_call.dart
index c6f9a885..07de1943 100644
--- a/lib/screens/live_care/video_call.dart
+++ b/lib/screens/live_care/video_call.dart
@@ -66,6 +66,7 @@ class _VideoCallPageState extends State {
//'1_MX40NjgwMzIyNH5-MTU5MzY4MzYzODYwM35ucExWYVRVSm5Hcy9uWGZmM1lOa3czZHV-fg',
kApiKey: '46209962',
vcId: widget.patientData.vcId,
+ patientName: widget.patientData.fullName ?? widget.patientData.firstName != null ? "${widget.patientData.firstName} ${widget.patientData.lastName}" : "-",
tokenID: token, //"hfkjshdf347r8743",
generalId: "Cs2020@2016\$2958",
doctorId: doctorprofile['DoctorID'],
diff --git a/lib/screens/medical-file/health_summary_page.dart b/lib/screens/medical-file/health_summary_page.dart
index ad7f13cb..6b4b066c 100644
--- a/lib/screens/medical-file/health_summary_page.dart
+++ b/lib/screens/medical-file/health_summary_page.dart
@@ -4,7 +4,7 @@ import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/medical-file/medical_file_details.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/doctor_card.dart';
@@ -30,10 +30,8 @@ class _HealthSummaryPageState extends State {
builder:
(BuildContext context, MedicalFileViewModel model, Widget child) =>
AppScaffold(
- appBar: PatientProfileHeaderNewDesignAppBar(
+ appBar: PatientProfileAppBar(
patient,
- patientType.toString() ?? "0",
- arrivalType,
isInpatient: isInpatient,
),
isShowAppBar: true,
diff --git a/lib/screens/medical-file/medical_file_details.dart b/lib/screens/medical-file/medical_file_details.dart
index 9bfde511..b53284a9 100644
--- a/lib/screens/medical-file/medical_file_details.dart
+++ b/lib/screens/medical-file/medical_file_details.dart
@@ -4,7 +4,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient_profile_header_with_appointment_card_app_bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
@@ -102,20 +102,19 @@ class _MedicalFileDetailsState extends State {
builder:
(BuildContext context, MedicalFileViewModel model, Widget child) =>
AppScaffold(
- appBar: PatientProfileHeaderWhitAppointmentAppBar(
- patient: patient,
- patientType: patient.patientType.toString() ?? "0",
- arrivalType: patient.arrivedOn.toString() ?? 0,
+ appBar: PatientProfileAppBar(
+ patient,
doctorName: doctorName,
profileUrl: doctorImage,
clinic: clinicName,
isPrescriptions: true,
isMedicalFile: true,
episode: episode,
- vistDate:
+ visitDate:
'${AppDateUtils.getDayMonthYearDateFormatted(AppDateUtils.getDateTimeFromServerFormat(
vistDate,
), isArabic: projectViewModel.isArabic)}',
+ isAppointmentHeader: true,
),
isShowAppBar: true,
appBarTitle: TranslationBase.of(context).medicalReport.toUpperCase(),
diff --git a/lib/screens/patients/ECGPage.dart b/lib/screens/patients/ECGPage.dart
index 33692628..ba4c108c 100644
--- a/lib/screens/patients/ECGPage.dart
+++ b/lib/screens/patients/ECGPage.dart
@@ -6,7 +6,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:flutter/cupertino.dart';
@@ -31,7 +31,7 @@ class ECGPage extends StatelessWidget {
baseViewModel: model,
isShowAppBar: true,
backgroundColor: Color(0xffF8F8F8),
- appBar: PatientProfileHeaderNewDesignAppBar(patient,arrivalType??'0',patientType),
+ appBar: PatientProfileAppBar(patient),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(8.0),
diff --git a/lib/screens/patients/InPatientPage.dart b/lib/screens/patients/InPatientPage.dart
index 1b42d305..ec2a8107 100644
--- a/lib/screens/patients/InPatientPage.dart
+++ b/lib/screens/patients/InPatientPage.dart
@@ -1,10 +1,12 @@
+import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/viewModel/PatientSearchViewModel.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/PatientCard.dart';
+import 'package:doctor_app_flutter/widgets/patients/patient_card/PatientCard.dart';
+import 'package:doctor_app_flutter/widgets/shared/app_loader_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/error_message.dart';
-import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
+import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_container.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart';
import 'package:flutter/material.dart';
@@ -60,7 +62,7 @@ class _InPatientPageState extends State {
model.filterSearchResults(value);
}),
),
- model.filteredInPatientItems.length > 0
+ model.state == ViewState.Idle?model.filteredInPatientItems.length > 0
? Expanded(
child: Container(
margin: EdgeInsets.symmetric(horizontal: 16.0),
@@ -155,6 +157,13 @@ class _InPatientPageState extends State {
error:
TranslationBase.of(context).noDataAvailable)),
),
+ ): Center(
+ child: Container(
+ height: 300,
+ width: 300,
+ child: Image.asset(
+ "assets/images/progress-loading-red.gif"),
+ ),
),
],
),
diff --git a/lib/screens/patients/PatientsInPatientScreen.dart b/lib/screens/patients/PatientsInPatientScreen.dart
index 60446887..ae0fbb59 100644
--- a/lib/screens/patients/PatientsInPatientScreen.dart
+++ b/lib/screens/patients/PatientsInPatientScreen.dart
@@ -1,17 +1,27 @@
import 'package:doctor_app_flutter/config/size_config.dart';
+import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
import 'package:doctor_app_flutter/core/viewModel/PatientSearchViewModel.dart';
+import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
+import 'package:doctor_app_flutter/models/dashboard/get_special_clinical_care_List_Respose_Model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
+import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
+import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/text_fields_utils.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
import 'DischargedPatientPage.dart';
import 'InPatientPage.dart';
class PatientInPatientScreen extends StatefulWidget {
+ GetSpecialClinicalCareListResponseModel specialClinic;
+
+ PatientInPatientScreen({Key key, this.specialClinic});
+
@override
_PatientInPatientScreenState createState() => _PatientInPatientScreenState();
}
@@ -21,6 +31,9 @@ class _PatientInPatientScreenState extends State
TabController _tabController;
int _activeTab = 0;
+ int selectedMapId;
+
+
@override
void initState() {
super.initState();
@@ -42,15 +55,26 @@ class _PatientInPatientScreenState extends State
@override
Widget build(BuildContext context) {
- final screenSize = MediaQuery.of(context).size;
+ final screenSize = MediaQuery
+ .of(context)
+ .size;
PatientSearchRequestModel requestModel = PatientSearchRequestModel();
+ ProjectViewModel projectsProvider = Provider.of(context);
+
return BaseView(
onModelReady: (model) async {
model.clearPatientList();
+ // if (widget.specialClinic != null) {
+ // await model.getSpecialClinicalCareMappingList(widget.specialClinic.clinicID);
+ // requestModel.nursingStationID =
+ // model.specialClinicalCareMappingList[0].nursingStationID;
+ // requestModel.clinicID = 0;
+ // }
model.getInPatientList(requestModel);
},
- builder: (_, model, w) => AppScaffold(
+ builder: (_, model, w) =>
+ AppScaffold(
baseViewModel: model,
isShowAppBar: false,
body: Column(
@@ -72,12 +96,125 @@ class _PatientInPatientScreenState extends State
),
Expanded(
child: AppText(
- TranslationBase.of(context).inPatient,
+ TranslationBase
+ .of(context)
+ .inPatient,
fontSize: SizeConfig.textMultiplier * 2.8,
fontWeight: FontWeight.bold,
color: Color(0xFF2B353E),
),
),
+ if (model.specialClinicalCareMappingList.isNotEmpty &&
+ widget.specialClinic != null &&
+ _activeTab != 2)
+ Container(
+ width: MediaQuery.of(context).size.width * .3,
+ child: DropdownButtonHideUnderline(
+ child: DropdownButton(
+ dropdownColor: Colors.white,
+ iconEnabledColor: Colors.black,
+ isExpanded: true,
+ value: selectedMapId == null ? model
+ .specialClinicalCareMappingList[0]
+ .nursingStationID : selectedMapId,
+ iconSize: 25,
+ elevation: 16,
+ selectedItemBuilder:
+ (BuildContext context) {
+ return model
+ .specialClinicalCareMappingList
+ .map((item) {
+ return Row(
+ mainAxisSize: MainAxisSize.max,
+ mainAxisAlignment:
+ MainAxisAlignment.end,
+ children: [
+ Column(
+ mainAxisAlignment:
+ MainAxisAlignment
+ .center,
+ children: [
+ Container(
+ padding:
+ EdgeInsets.all(2),
+ margin:
+ EdgeInsets.all(2),
+ decoration:
+ new BoxDecoration(
+ color:
+ Colors.red[800],
+ borderRadius:
+ BorderRadius
+ .circular(
+ 20),
+ ),
+ constraints:
+ BoxConstraints(
+ minWidth: 20,
+ minHeight: 20,
+ ),
+ child: Center(
+ child: AppText(
+ model
+ .specialClinicalCareMappingList
+ .length
+ .toString(),
+ color:
+ Colors.white,
+ fontSize:
+ projectsProvider
+ .isArabic
+ ? 10
+ : 11,
+ textAlign:
+ TextAlign
+ .center,
+ ),
+ )),
+ ],
+ ),
+ AppText(item.description,
+ fontSize: 12,
+ color: Colors.black,
+ fontWeight:
+ FontWeight.bold,
+ textAlign: TextAlign.end),
+ ],
+ );
+ }).toList();
+ },
+ onChanged: (newValue) async {
+ setState(() {
+ selectedMapId = newValue;
+ });
+ model.clearPatientList();
+ GifLoaderDialogUtils.showMyDialog(
+ context);
+
+ PatientSearchRequestModel requestModel = PatientSearchRequestModel(
+ nursingStationID: selectedMapId, clinicID: 0);
+ await model.getInPatientList(requestModel, isLocalBusy: true);
+ GifLoaderDialogUtils.hideDialog(
+ context);
+ if (model.state ==
+ ViewState.ErrorLocal) {
+ DrAppToastMsg.showErrorToast(
+ model.error);
+ }
+ },
+ items: model
+ .specialClinicalCareMappingList
+ .map((item) {
+ return DropdownMenuItem(
+ child: AppText(
+ item.description,
+ textAlign: TextAlign.left,
+ ),
+ value: item.nursingStationID,
+ );
+ }).toList(),
+ )),
+ )
]),
),
),
diff --git a/lib/screens/patients/insurance_approval_screen_patient.dart b/lib/screens/patients/insurance_approval_screen_patient.dart
index 2bffdda5..1ab0734b 100644
--- a/lib/screens/patients/insurance_approval_screen_patient.dart
+++ b/lib/screens/patients/insurance_approval_screen_patient.dart
@@ -4,7 +4,7 @@ import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/patients/insurance_approvals_details.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/doctor_card_insurance.dart';
@@ -44,10 +44,8 @@ class _InsuranceApprovalScreenNewState
: (model) => model.getInsuranceApproval(patient),
builder: (BuildContext context, InsuranceViewModel model, Widget child) =>
AppScaffold(
- appBar: PatientProfileHeaderNewDesignAppBar(
+ appBar: PatientProfileAppBar(
patient,
- patientType.toString() ?? "0",
- patientType,
isInpatient: isInpatient,
),
isShowAppBar: true,
diff --git a/lib/screens/patients/insurance_approvals_details.dart b/lib/screens/patients/insurance_approvals_details.dart
index 92910394..0945df37 100644
--- a/lib/screens/patients/insurance_approvals_details.dart
+++ b/lib/screens/patients/insurance_approvals_details.dart
@@ -5,7 +5,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:flutter/cupertino.dart';
@@ -54,8 +54,8 @@ class _InsuranceApprovalsDetailsState extends State {
AppScaffold(
isShowAppBar: true,
baseViewModel: model,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patient.patientType.toString(), patient.arrivedOn),
+ appBar: PatientProfileAppBar(
+ patient),
body: patient.admissionNo != null
? SingleChildScrollView(
child: Container(
diff --git a/lib/screens/patients/out_patient/out_patient_screen.dart b/lib/screens/patients/out_patient/out_patient_screen.dart
index 30400c65..0a85ff26 100644
--- a/lib/screens/patients/out_patient/out_patient_screen.dart
+++ b/lib/screens/patients/out_patient/out_patient_screen.dart
@@ -1,10 +1,8 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/filter_type.dart';
import 'package:doctor_app_flutter/core/enum/patient_type.dart';
-
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/patient_muse/PatientSearchRequestModel.dart';
-
import 'package:doctor_app_flutter/core/viewModel/PatientSearchViewModel.dart';
import 'package:doctor_app_flutter/core/viewModel/authentication_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
@@ -14,7 +12,7 @@ import 'package:doctor_app_flutter/routes.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/patient_search/patient_search_header.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/PatientCard.dart';
+import 'package:doctor_app_flutter/widgets/patients/patient_card/PatientCard.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/error_message.dart';
diff --git a/lib/screens/patients/patient_search/patient_search_result_screen.dart b/lib/screens/patients/patient_search/patient_search_result_screen.dart
index 02bde8d0..8044e991 100644
--- a/lib/screens/patients/patient_search/patient_search_result_screen.dart
+++ b/lib/screens/patients/patient_search/patient_search_result_screen.dart
@@ -10,13 +10,11 @@ import 'package:doctor_app_flutter/routes.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/patient_search/patient_search_header.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/PatientCard.dart';
+import 'package:doctor_app_flutter/widgets/patients/patient_card/PatientCard.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/error_message.dart';
-import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app_text_form_field.dart';
-import 'package:doctor_app_flutter/widgets/shared/text_fields/text_fields_utils.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';
diff --git a/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart b/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart
index 6890d74f..081f1a6e 100644
--- a/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart
+++ b/lib/screens/patients/profile/UCAF/UCAF-detail-screen.dart
@@ -12,7 +12,7 @@ import 'package:doctor_app_flutter/screens/patients/profile/UCAF/page-stepper-wi
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
@@ -47,8 +47,8 @@ class _UcafDetailScreenState extends State {
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patientType, arrivalType),
+ appBar: PatientProfileAppBar(
+ patient),
appBarTitle: TranslationBase.of(context).ucaf,
body: Column(
children: [
diff --git a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart
index 5f7b91f3..3bbc6637 100644
--- a/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart
+++ b/lib/screens/patients/profile/UCAF/UCAF-input-screen.dart
@@ -7,7 +7,7 @@ import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/profile/UCAF/page-stepper-widget.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
@@ -65,8 +65,8 @@ class _UCAFInputScreenState extends State {
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patientType, arrivalType),
+ appBar: PatientProfileAppBar(
+ patient),
appBarTitle: TranslationBase.of(context).ucaf,
body: model.patientVitalSignsHistory.length > 0 &&
model.patientChiefComplaintList != null &&
diff --git a/lib/screens/patients/profile/admission-request/admission-request-first-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-first-screen.dart
index 08a69907..f0ccaece 100644
--- a/lib/screens/patients/profile/admission-request/admission-request-first-screen.dart
+++ b/lib/screens/patients/profile/admission-request/admission-request-first-screen.dart
@@ -7,7 +7,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
@@ -61,8 +61,8 @@ class _AdmissionRequestThirdScreenState
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patientType, arrivalType),
+ appBar: PatientProfileAppBar(
+ patient),
appBarTitle: TranslationBase.of(context).admissionRequest,
body: GestureDetector(
onTap: () {
diff --git a/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart b/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart
index 120b6adf..563b4827 100644
--- a/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart
+++ b/lib/screens/patients/profile/admission-request/admission-request-third-screen.dart
@@ -8,7 +8,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
@@ -52,8 +52,8 @@ class _AdmissionRequestThirdScreenState
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patientType, arrivalType),
+ appBar: PatientProfileAppBar(
+ patient),
appBarTitle: TranslationBase.of(context).admissionRequest,
body: GestureDetector(
onTap: () {
diff --git a/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart b/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart
index bea487f7..dc79b2be 100644
--- a/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart
+++ b/lib/screens/patients/profile/admission-request/admission-request_second-screen.dart
@@ -10,7 +10,7 @@ import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
@@ -74,8 +74,8 @@ class _AdmissionRequestSecondScreenState
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patientType, arrivalType),
+ appBar: PatientProfileAppBar(
+ patient),
appBarTitle: TranslationBase.of(context).admissionRequest,
body: GestureDetector(
onTap: () {
diff --git a/lib/screens/patients/profile/lab_result/laboratory_result_page.dart b/lib/screens/patients/profile/lab_result/laboratory_result_page.dart
index 5f79038f..e58d4ef5 100644
--- a/lib/screens/patients/profile/lab_result/laboratory_result_page.dart
+++ b/lib/screens/patients/profile/lab_result/laboratory_result_page.dart
@@ -2,7 +2,7 @@ import 'package:doctor_app_flutter/core/model/labs/patient_lab_orders.dart';
import 'package:doctor_app_flutter/core/viewModel/labs_view_model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient_profile_header_with_appointment_card_app_bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@@ -32,31 +32,19 @@ class _LaboratoryResultPageState extends State {
@override
Widget build(BuildContext context) {
return BaseView(
- // onModelReady: (model) => model.getLaboratoryResult(
- // invoiceNo: widget.patientLabOrders.invoiceNo,
- // clinicID: widget.patientLabOrders.clinicID,
- // projectID: widget.patientLabOrders.projectID,
- // orderNo: widget.patientLabOrders.orderNo,
- // patient: widget.patient,
- // isInpatient: widget.patientType == "1"),
onModelReady: (model) => model.getPatientLabResult(
patientLabOrder: widget.patientLabOrders,
patient: widget.patient,
isInpatient: true),
builder: (_, model, w) => AppScaffold(
isShowAppBar: true,
- appBar: PatientProfileHeaderWhitAppointmentAppBar(
- patient: widget.patient,
- patientType: widget.patientType ?? "0",
- arrivalType: widget.arrivalType ?? "0",
- orderNo: widget.patientLabOrders.orderNo,
+ appBar: PatientProfileAppBar(
+ widget.patient,
+ isInpatient:widget.isInpatient,
+ isFromLabResult: true,
appointmentDate: widget.patientLabOrders.orderDate,
- doctorName: widget.patientLabOrders.doctorName,
- branch: widget.patientLabOrders.projectName,
- clinic: widget.patientLabOrders.clinicDescription,
- profileUrl: widget.patientLabOrders.doctorImageURL,
- invoiceNO: widget.patientLabOrders.invoiceNo,
),
+
baseViewModel: model,
body: AppScaffold(
isShowAppBar: false,
diff --git a/lib/screens/patients/profile/lab_result/labs_home_page.dart b/lib/screens/patients/profile/lab_result/labs_home_page.dart
index 0f0367af..7da55967 100644
--- a/lib/screens/patients/profile/lab_result/labs_home_page.dart
+++ b/lib/screens/patients/profile/lab_result/labs_home_page.dart
@@ -7,7 +7,7 @@ import 'package:doctor_app_flutter/screens/procedures/ProcedureType.dart';
import 'package:doctor_app_flutter/screens/procedures/base_add_procedure_tab_page.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/add-order/addNewOrder.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/doctor_card.dart';
@@ -52,10 +52,8 @@ class _LabsHomePageState extends State {
baseViewModel: model,
backgroundColor: Colors.grey[100],
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
+ appBar: PatientProfileAppBar(
patient,
- patient.patientType.toString() ?? '0',
- patientType,
isInpatient: isInpatient,
),
body: SingleChildScrollView(
diff --git a/lib/screens/patients/profile/medical_report/AddVerifyMedicalReport.dart b/lib/screens/patients/profile/medical_report/AddVerifyMedicalReport.dart
index a3fa91e9..a73eb90f 100644
--- a/lib/screens/patients/profile/medical_report/AddVerifyMedicalReport.dart
+++ b/lib/screens/patients/profile/medical_report/AddVerifyMedicalReport.dart
@@ -6,6 +6,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
+import 'package:doctor_app_flutter/widgets/shared/app_loader_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
@@ -40,27 +41,35 @@ class _AddVerifyMedicalReportState extends State {
? TranslationBase.of(context).medicalReportAdd
: TranslationBase.of(context).medicalReportVerify,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
- body: Column(
- children: [
- Expanded(
- child: Container(
- margin: EdgeInsets.all(16),
- child: Column(
- children: [
- Expanded(
- child: SingleChildScrollView(
- child: Container(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
+ body: model.state == ViewState.BusyLocal
+ ? AppLoaderWidget()
+ : Column(
+ children: [
+ Expanded(
+ child: Container(
+ margin: EdgeInsets.all(16),
+ child: Column(
+ children: [
+ Expanded(
+ child: SingleChildScrollView(
+ child: Container(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
- if (model.medicalReportTemplate.length > 0)
+ // if (model.medicalReportTemplate.length > 0)
HtmlRichEditor(
- initialText: model
- .medicalReportTemplate[0]
- .templateTextHtml,
+ initialText: (medicalReport != null
+ ? medicalReport.reportDataHtml
+ : model.medicalReportTemplate
+ .length > 0 ? model
+ .medicalReportTemplate[0] : ""),
+ hint: "Write the medical report ",
height:
- MediaQuery.of(context).size.height *
- 0.75,
+ MediaQuery
+ .of(context)
+ .size
+ .height *
+ 0.75,
),
],
),
diff --git a/lib/screens/patients/profile/medical_report/MedicalReportDetailPage.dart b/lib/screens/patients/profile/medical_report/MedicalReportDetailPage.dart
index 7bf6f1d9..ab24f8e0 100644
--- a/lib/screens/patients/profile/medical_report/MedicalReportDetailPage.dart
+++ b/lib/screens/patients/profile/medical_report/MedicalReportDetailPage.dart
@@ -7,7 +7,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/large_avatar.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart';
@@ -31,10 +31,8 @@ class MedicalReportDetailPage extends StatelessWidget {
baseViewModel: model,
isShowAppBar: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
- appBar: PatientProfileHeaderNewDesignAppBar(
+ appBar: PatientProfileAppBar(
patient,
- patientType,
- arrivalType,
),
body: Container(
child: SingleChildScrollView(
diff --git a/lib/screens/patients/profile/medical_report/MedicalReportPage.dart b/lib/screens/patients/profile/medical_report/MedicalReportPage.dart
index e2da651b..aa9d0b58 100644
--- a/lib/screens/patients/profile/medical_report/MedicalReportPage.dart
+++ b/lib/screens/patients/profile/medical_report/MedicalReportPage.dart
@@ -7,17 +7,17 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
+import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/add-order/addNewOrder.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/large_avatar.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/card_with_bg_widget.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
-import 'package:flutter_html/flutter_html.dart';
import 'package:provider/provider.dart';
import '../../../../routes.dart';
@@ -43,10 +43,8 @@ class MedicalReportPage extends StatelessWidget {
baseViewModel: model,
isShowAppBar: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
- appBar: PatientProfileHeaderNewDesignAppBar(
+ appBar: PatientProfileAppBar(
patient,
- patientType,
- arrivalType,
),
body: SingleChildScrollView(
physics: BouncingScrollPhysics(),
@@ -75,13 +73,18 @@ class MedicalReportPage extends StatelessWidget {
),
AddNewOrder(
onTap: () {
- Navigator.of(context)
- .pushNamed(PATIENT_MEDICAL_REPORT_INSERT, arguments: {
- 'patient': patient,
- 'patientType': patientType,
- 'arrivalType': arrivalType,
- 'type': MedicalReportStatus.ADD
- });
+ if (model.hasOnHold()) {
+ Helpers.showErrorToast(
+ "Please Verified the on hold report to be able to add new one");
+ } else {
+ Navigator.of(context)
+ .pushNamed(PATIENT_MEDICAL_REPORT_INSERT, arguments: {
+ 'patient': patient,
+ 'patientType': patientType,
+ 'arrivalType': arrivalType,
+ 'type': MedicalReportStatus.ADD
+ });
+ }
},
label: TranslationBase.of(context).createNewMedicalReport,
),
@@ -92,7 +95,7 @@ class MedicalReportPage extends StatelessWidget {
onTap: () {
if (model.medicalReportList[index].status == 1) {
Navigator.of(context).pushNamed(
- PATIENT_MEDICAL_REPORT_DETAIL,
+ PATIENT_MEDICAL_REPORT_INSERT,
arguments: {
'patient': patient,
'patientType': patientType,
@@ -101,7 +104,7 @@ class MedicalReportPage extends StatelessWidget {
});
} else {
Navigator.of(context).pushNamed(
- PATIENT_MEDICAL_REPORT_INSERT,
+ PATIENT_MEDICAL_REPORT_DETAIL,
arguments: {
'patient': patient,
'patientType': patientType,
@@ -116,7 +119,7 @@ class MedicalReportPage extends StatelessWidget {
child: CardWithBgWidget(
hasBorder: false,
bgColor: model.medicalReportList[index].status == 1
- ? Colors.red[700]
+ ? Color(0xFFCC9B14)
: Colors.green[700],
widget: Column(
children: [
@@ -132,9 +135,9 @@ class MedicalReportPage extends StatelessWidget {
: TranslationBase.of(context)
.verified,
color: model.medicalReportList[index]
- .status ==
- 1
- ? Colors.red[700]
+ .status ==
+ 1
+ ? Color(0xFFCC9B14)
: Colors.green[700],
fontSize: 1.4 * SizeConfig.textMultiplier,
bold: true,
@@ -226,8 +229,8 @@ class MedicalReportPage extends StatelessWidget {
Icon(
model.medicalReportList[index].status ==
1
- ? EvaIcons.eye
- : DoctorApp.edit_1,
+ ? DoctorApp.edit_1
+ :EvaIcons.eye ,
),
],
),
diff --git a/lib/screens/patients/profile/note/progress_note_screen.dart b/lib/screens/patients/profile/note/progress_note_screen.dart
index be912a60..723ee75f 100644
--- a/lib/screens/patients/profile/note/progress_note_screen.dart
+++ b/lib/screens/patients/profile/note/progress_note_screen.dart
@@ -10,7 +10,7 @@ import 'package:doctor_app_flutter/screens/patients/profile/note/update_note.dar
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/add-order/addNewOrder.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/card_with_bg_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/divider_with_spaces_around.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart';
@@ -88,10 +88,8 @@ class _ProgressNoteState extends State {
.of(context)
.scaffoldBackgroundColor,
// appBarTitle: TranslationBase.of(context).progressNote,
- appBar: PatientProfileHeaderNewDesignAppBar(
+ appBar: PatientProfileAppBar(
patient,
- patient.patientType.toString() ?? '0',
- arrivalType,
isInpatient: true,
),
body: model.patientProgressNoteList == null ||
diff --git a/lib/screens/patients/profile/profile_screen/PatientProfileCardModel.dart b/lib/screens/patients/profile/profile_screen/PatientProfileCardModel.dart
index eb9a3eaa..e4351d91 100644
--- a/lib/screens/patients/profile/profile_screen/PatientProfileCardModel.dart
+++ b/lib/screens/patients/profile/profile_screen/PatientProfileCardModel.dart
@@ -13,6 +13,7 @@ class PatientProfileCardModel {
final bool isSelectInpatient;
final bool isDartIcon;
final IconData dartIcon;
+ final Color color;
PatientProfileCardModel(
this.nameLine1,
@@ -25,6 +26,8 @@ class PatientProfileCardModel {
this.onTap,
this.isDischargedPatient = false,
this.isSelectInpatient = false,
- this.isDartIcon = false,this.dartIcon
+ this.isDartIcon = false,
+ this.dartIcon,
+ this.color,
});
}
diff --git a/lib/screens/patients/profile/profile_screen/patient_profile_screen.dart b/lib/screens/patients/profile/profile_screen/patient_profile_screen.dart
index 5212df0c..36388e87 100644
--- a/lib/screens/patients/profile/profile_screen/patient_profile_screen.dart
+++ b/lib/screens/patients/profile/profile_screen/patient_profile_screen.dart
@@ -2,6 +2,7 @@ import 'dart:async';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
+import 'package:doctor_app_flutter/core/service/VideoCallService.dart';
import 'package:doctor_app_flutter/core/viewModel/LiveCarePatientViewModel.dart';
import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart';
import 'package:doctor_app_flutter/models/SOAP/PostEpisodeReqModel.dart';
@@ -12,10 +13,12 @@ import 'package:doctor_app_flutter/screens/live_care/end_call_screen.dart';
import 'package:doctor_app_flutter/screens/patients/profile/profile_screen/profile_gird_for_InPatient.dart';
import 'package:doctor_app_flutter/screens/patients/profile/profile_screen/profile_gird_for_other.dart';
import 'package:doctor_app_flutter/screens/patients/profile/profile_screen/profile_gird_for_search.dart';
+import 'package:doctor_app_flutter/util/NotificationPermissionUtils.dart';
import 'package:doctor_app_flutter/util/VideoChannel.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
@@ -24,6 +27,7 @@ import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:quiver/async.dart';
+import '../../../../locator.dart';
import '../../../../routes.dart';
class PatientProfileScreen extends StatefulWidget {
@@ -90,6 +94,9 @@ class _PatientProfileScreenState extends State
if(routeArgs.containsKey("isFromLiveCare")) {
isFromLiveCare = routeArgs['isFromLiveCare'];
}
+ if(routeArgs.containsKey("isCallFinished")) {
+ isCallFinished = routeArgs['isCallFinished'];
+ }
if (isInpatient)
_activeTab = 0;
else
@@ -98,7 +105,7 @@ class _PatientProfileScreenState extends State
StreamSubscription callTimer;
callConnected(){
- callTimer = CountdownTimer(Duration(minutes: 1), Duration(seconds: 1)).listen(null)
+ callTimer = CountdownTimer(Duration(minutes: 90), Duration(seconds: 1)).listen(null)
..onDone(() {
callTimer.cancel();
})
@@ -182,51 +189,57 @@ class _PatientProfileScreenState extends State
SizedBox(
height: MediaQuery.of(context).size.height * 0.05,
)
- ],
- ),
- ),
-
],
),
- if (patient.patientStatusType != null &&
- patient.patientStatusType == 43)
- BaseView(
- onModelReady: (model) async {},
- builder: (_, model, w) => Positioned(
- top: 180,
- left: 20,
- right: 20,
- child: Row(
- children: [
- Expanded(child: Container()),
- if (patient.episodeNo == 0)
- AppButton(
- title:
- "${TranslationBase.of(context).createNew}\n${TranslationBase.of(context).episode}",
- color: patient.patientStatusType == 43
- ? Colors.red.shade700
- : Colors.grey.shade700,
- fontColor: Colors.white,
- vPadding: 8,
- radius: 30,
- hPadding: 20,
- fontWeight: FontWeight.normal,
- fontSize: 1.6,
- icon: Image.asset(
- "assets/images/create-episod.png",
- color: Colors.white,
+ ),
+ ],
+ ),
+ if (isFromLiveCare
+ ? patient.episodeNo != null
+ : patient.patientStatusType != null &&
+ patient.patientStatusType == 43)
+ BaseView(
+ onModelReady: (model) async {},
+ builder: (_, model, w) => Positioned(
+ top: 180,
+ left: 20,
+ right: 20,
+ child: Row(
+ children: [
+ Expanded(child: Container()),
+ if (patient.episodeNo == 0)
+ AppButton(
+ title:
+ "${TranslationBase.of(context).createNew}\n${TranslationBase.of(context).episode}",
+ color: isFromLiveCare
+ ? Colors.red.shade700
+ : patient.patientStatusType == 43
+ ? Colors.red.shade700
+ : Colors.grey.shade700,
+ fontColor: Colors.white,
+ vPadding: 8,
+ radius: 30,
+ hPadding: 20,
+ fontWeight: FontWeight.normal,
+ fontSize: 1.6,
+ icon: Image.asset(
+ "assets/images/create-episod.png",
+ color: Colors.white,
height: 30,
),
onPressed: () async {
- if (patient.patientStatusType ==
- 43) {
+ if ((isFromLiveCare &&
+ patient.appointmentNo != null &&
+ patient.appointmentNo != 0) ||
+ patient.patientStatusType ==
+ 43) {
PostEpisodeReqModel
- postEpisodeReqModel =
- PostEpisodeReqModel(
- appointmentNo:
- patient.appointmentNo,
- patientMRN:
- patient.patientMRN);
+ postEpisodeReqModel =
+ PostEpisodeReqModel(
+ appointmentNo:
+ patient.appointmentNo,
+ patientMRN:
+ patient.patientMRN);
GifLoaderDialogUtils.showMyDialog(
context);
await model.postEpisode(
@@ -246,11 +259,18 @@ class _PatientProfileScreenState extends State
if (patient.episodeNo != 0)
AppButton(
title:
- "${TranslationBase.of(context).update}\n${TranslationBase.of(context).episode}",
+ "${TranslationBase
+ .of(context)
+ .update}\n${TranslationBase
+ .of(context)
+ .episode}",
color:
- patient.patientStatusType == 43
- ? Colors.red.shade700
- : Colors.grey.shade700,
+ isFromLiveCare
+ ? Colors.red.shade700
+ : patient.patientStatusType ==
+ 43
+ ? Colors.red.shade700
+ : Colors.grey.shade700,
fontColor: Colors.white,
vPadding: 8,
radius: 30,
@@ -263,8 +283,12 @@ class _PatientProfileScreenState extends State
height: 30,
),
onPressed: () {
- if (patient.patientStatusType ==
- 43) {
+ if ((isFromLiveCare &&
+ patient.appointmentNo !=
+ null &&
+ patient.appointmentNo != 0) ||
+ patient.patientStatusType ==
+ 43) {
Navigator.of(context).pushNamed(
UPDATE_EPISODE,
arguments: {
@@ -309,66 +333,31 @@ class _PatientProfileScreenState extends State
TranslationBase.of(context).initiateCall,
disabled: model.state == ViewState.BusyLocal,
onPressed: () async {
+ // Navigator.push(context, MaterialPageRoute(
+ // builder: (BuildContext context) =>
+ // EndCallScreen(patient:patient)));
+
+
if(isCallFinished) {
Navigator.push(context, MaterialPageRoute(
- builder: (BuildContext context) =>
- EndCallScreen(patient:patient)));
+ builder: (BuildContext context) => EndCallScreen(patient:patient)));
} else {
GifLoaderDialogUtils.showMyDialog(context);
- // await model.startCall( isReCall : false, vCID: patient.vcId);
+ await model.startCall( isReCall : false, vCID: patient.vcId);
if(model.state == ViewState.ErrorLocal) {
GifLoaderDialogUtils.hideDialog(context);
Helpers.showErrorToast(model.error);
} else {
await model.getDoctorProfile();
- // patient.appointmentNo = model.startCallRes.appointmentNo;
+ patient.appointmentNo = model.startCallRes.appointmentNo;
patient.episodeNo = 0;
GifLoaderDialogUtils.hideDialog(context);
- await VideoChannel.openVideoCallScreen(
- kToken: "T1==cGFydG5lcl9pZD00NzI0Nzk1NCZzaWc9NGIyZDljOTY3YjFiNWU1YzUzNzFmMjIyNjJmNmEzY2Y5NzZjOTdlYzpzZXNzaW9uX2lkPTFfTVg0ME56STBOemsxTkg1LU1UWXlNekEyTlRRMU9EVXhObjVrVFRoMFlVdFJXaXRYTWpadFZGZHFhSGxZVGpOdE1UVi1mZyZjcmVhdGVfdGltZT0xNjIzMDY1NDk1Jm5vbmNlPTAuMjM2Mjk0NTIwMTkyOTA4OTcmcm9sZT1wdWJsaXNoZXImZXhwaXJlX3RpbWU9MTYyNTY1NzQ5NCZpbml0aWFsX2xheW91dF9jbGFzc19saXN0PQ==",//model.startCallRes.openTokenID,
- kSessionId:"1_MX40NzI0Nzk1NH5-MTYyMzA2NTQ1ODUxNn5kTTh0YUtRWitXMjZtVFdqaHlYTjNtMTV-fg",// model.startCallRes.openSessionID,
- kApiKey: '47247954',//46209962
- vcId: patient.vcId,
- tokenID: await model.getToken(),
- generalId: GENERAL_ID,
- doctorId: model.doctorProfile.doctorID,
- onFailure: (String error) {
- DrAppToastMsg.showErrorToast(error);
- },
- onCallConnected: callConnected,
- onCallEnd: () {
- var asd="";
- // WidgetsBinding.instance.addPostFrameCallback((_) {
- // GifLoaderDialogUtils.showMyDialog(context);
- // model.endCall(patient.vcId, false,).then((value) {
- // GifLoaderDialogUtils.hideDialog(context);
- // if (model.state == ViewState.ErrorLocal) {
- // DrAppToastMsg.showErrorToast(model.error);
- // }
- // setState(() {
- // isCallFinished = true;
- // });
- // });
- // });
- },
- onCallNotRespond: (SessionStatusModel sessionStatusModel) {
- var asd="";
- // WidgetsBinding.instance.addPostFrameCallback((_) {
- // GifLoaderDialogUtils.showMyDialog(context);
- // model.endCall(patient.vcId, sessionStatusModel.sessionStatus == 3,).then((value) {
- // GifLoaderDialogUtils.hideDialog(context);
- // if (model.state == ViewState.ErrorLocal) {
- // DrAppToastMsg.showErrorToast(model.error);
- // }
- // setState(() {
- // isCallFinished = true;
- // });
- // });
- //
- // });
- });
+ AppPermissionsUtils.requestVideoCallPermission(context: context,onTapGrant: (){
+ locator().openVideo(model.startCallRes, patient, callConnected, callDisconnected);
+ });
+
}
}
diff --git a/lib/screens/patients/profile/radiology/radiology_details_page.dart b/lib/screens/patients/profile/radiology/radiology_details_page.dart
index acc79d19..48bef68a 100644
--- a/lib/screens/patients/profile/radiology/radiology_details_page.dart
+++ b/lib/screens/patients/profile/radiology/radiology_details_page.dart
@@ -3,7 +3,7 @@ import 'package:doctor_app_flutter/core/viewModel/radiology_view_model.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient_profile_header_with_appointment_card_app_bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/secondary_button.dart';
@@ -16,13 +16,15 @@ class RadiologyDetailsPage extends StatelessWidget {
final PatiantInformtion patient;
final String patientType;
final String arrivalType;
+ final bool isInpatient;
RadiologyDetailsPage(
{Key key,
this.finalRadiology,
this.patient,
this.patientType,
- this.arrivalType});
+ this.arrivalType,
+ this.isInpatient = false});
@override
Widget build(BuildContext context) {
@@ -33,16 +35,16 @@ class RadiologyDetailsPage extends StatelessWidget {
lineItem: finalRadiology.invoiceLineItemNo,
invoiceNo: finalRadiology.invoiceNo),
builder: (_, model, widget) => AppScaffold(
- appBar: PatientProfileHeaderWhitAppointmentAppBar(
- patient: patient,
- patientType: patientType ?? "0",
- arrivalType: arrivalType ?? "0",
+ appBar: PatientProfileAppBar(
+ patient,
appointmentDate: finalRadiology.orderDate,
doctorName: finalRadiology.doctorName,
clinic: finalRadiology.clinicDescription,
branch: finalRadiology.projectName,
profileUrl: finalRadiology.doctorImageURL,
invoiceNO: finalRadiology.invoiceNo.toString(),
+ isAppointmentHeader: true,
+
),
isShowAppBar: true,
baseViewModel: model,
diff --git a/lib/screens/patients/profile/radiology/radiology_home_page.dart b/lib/screens/patients/profile/radiology/radiology_home_page.dart
index 9f93df35..3d8d527c 100644
--- a/lib/screens/patients/profile/radiology/radiology_home_page.dart
+++ b/lib/screens/patients/profile/radiology/radiology_home_page.dart
@@ -7,7 +7,7 @@ import 'package:doctor_app_flutter/screens/procedures/ProcedureType.dart';
import 'package:doctor_app_flutter/screens/procedures/base_add_procedure_tab_page.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/add-order/addNewOrder.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/doctor_card.dart';
@@ -50,10 +50,8 @@ class _RadiologyHomePageState extends State {
isShowAppBar: true,
backgroundColor: Colors.grey[100],
// appBarTitle: TranslationBase.of(context).radiology,
- appBar: PatientProfileHeaderNewDesignAppBar(
+ appBar: PatientProfileAppBar(
patient,
- patient.patientType.toString() ?? '0',
- arrivalType,
isInpatient: isInpatient,
),
baseViewModel: model,
@@ -210,6 +208,7 @@ class _RadiologyHomePageState extends State {
finalRadiology:
model.radiologyList[index],
patient: patient,
+ isInpatient:isInpatient
),
),
);
diff --git a/lib/screens/patients/profile/referral/AddReplayOnReferralPatient.dart b/lib/screens/patients/profile/referral/AddReplayOnReferralPatient.dart
index f54a18ac..56ff85c4 100644
--- a/lib/screens/patients/profile/referral/AddReplayOnReferralPatient.dart
+++ b/lib/screens/patients/profile/referral/AddReplayOnReferralPatient.dart
@@ -1,7 +1,7 @@
import 'package:doctor_app_flutter/config/config.dart';
-import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/referral/MyReferralPatientModel.dart';
+import 'package:doctor_app_flutter/core/model/referral/add_referred_remarks_request.dart';
import 'package:doctor_app_flutter/core/provider/robot_provider.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
@@ -19,30 +19,40 @@ import 'package:permission_handler/permission_handler.dart';
import 'package:speech_to_text/speech_recognition_error.dart';
import 'package:speech_to_text/speech_to_text.dart' as stt;
+import 'ReplySummeryOnReferralPatient.dart';
+
class AddReplayOnReferralPatient extends StatefulWidget {
final PatientReferralViewModel patientReferralViewModel;
final MyReferralPatientModel myReferralInPatientModel;
+ final AddReferredRemarksRequestModel myReferralInPatientRequestModel;
+ final bool isEdited;
const AddReplayOnReferralPatient(
- {Key key, this.patientReferralViewModel, this.myReferralInPatientModel})
+ {Key key,
+ this.patientReferralViewModel,
+ this.myReferralInPatientModel,
+ this.isEdited,
+ this.myReferralInPatientRequestModel})
: super(key: key);
@override
- _AddReplayOnReferralPatientState createState() =>
- _AddReplayOnReferralPatientState();
+ _AddReplayOnReferralPatientState createState() => _AddReplayOnReferralPatientState();
}
-class _AddReplayOnReferralPatientState
- extends State {
+class _AddReplayOnReferralPatientState extends State {
bool isSubmitted = false;
+ int replay = 1;
+ int reject = 2;
stt.SpeechToText speech = stt.SpeechToText();
var reconizedWord;
var event = RobotProvider();
TextEditingController replayOnReferralController = TextEditingController();
+
@override
void initState() {
requestPermissions();
super.initState();
+ replayOnReferralController.text = widget.myReferralInPatientModel.referredDoctorRemarks ?? "";
}
@override
@@ -50,116 +60,206 @@ class _AddReplayOnReferralPatientState
return AppScaffold(
isShowAppBar: false,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
- body: SingleChildScrollView(
- child: Container(
- height: MediaQuery.of(context).size.height * 1.0,
- child: Padding(
- padding: EdgeInsets.all(0.0),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- BottomSheetTitle(title: 'Replay'),
- SizedBox(
- height: 10.0,
- ),
- Center(
- child: FractionallySizedBox(
- widthFactor: 0.9,
- child: Column(
- children: [
- Stack(
- children: [
- AppTextFieldCustom(
- hintText: 'Replay your responses here',
- controller: replayOnReferralController,
- maxLines: 35,
- minLines: 25,
- hasBorder: true,
- validationError:
- replayOnReferralController.text.isEmpty &&
- isSubmitted
- ? TranslationBase.of(context).emptyMessage
- : null,
- ),
- Positioned(
- top: 0, //MediaQuery.of(context).size.height * 0,
- right: 15,
- child: IconButton(
- icon: Icon(
- DoctorApp.speechtotext,
- color: Colors.black,
- size: 35,
- ),
- onPressed: () {
- onVoiceText();
- },
+ body: Column(
+ children: [
+ Expanded(
+ child: SingleChildScrollView(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ BottomSheetTitle(title: 'Reply'),
+ SizedBox(
+ height: 10.0,
+ ),
+ Center(
+ child: FractionallySizedBox(
+ widthFactor: 0.9,
+ child: Column(
+ children: [
+ Stack(
+ children: [
+ AppTextFieldCustom(
+ hintText: 'Reply your responses here',
+ controller: replayOnReferralController,
+ maxLines: 35,
+ minLines: 25,
+ hasBorder: true,
+ validationError: replayOnReferralController.text.isEmpty && isSubmitted
+ ? TranslationBase.of(context).emptyMessage
+ : null,
),
- )
- ],
- ),
- ],
+ Positioned(
+ top: 0,
+ //MediaQuery.of(context).size.height * 0,
+ right: 15,
+ child: IconButton(
+ icon: Icon(
+ DoctorApp.speechtotext,
+ color: Colors.black,
+ size: 35,
+ ),
+ onPressed: () {
+ onVoiceText();
+ },
+ ),
+ )
+ ],
+ ),
+ ],
+ ),
),
),
- ),
- ],
+ ],
+ ),
),
),
- ),
- ),
- bottomSheet: Container(
- height: replayOnReferralController.text.isNotEmpty ? 130 : 70,
- margin: EdgeInsets.all(SizeConfig.widthMultiplier * 5),
- child: Column(
- children: [
- replayOnReferralController.text.isEmpty
- ? SizedBox()
- : Container(
- margin: EdgeInsets.all(5),
- child: Expanded(
+ Container(
+ // height: replayOnReferralController.text.isNotEmpty ? 130 : 70,
+ // margin: EdgeInsets.all(SizeConfig.widthMultiplier * 5),
+ child: Column(
+ children: [
+ replayOnReferralController.text.isEmpty
+ ? SizedBox()
+ : Container(
+ margin: EdgeInsets.all(16),
child: AppButton(
- title: TranslationBase.of(context).clearText,
- onPressed: () {
- setState(() {
- replayOnReferralController.text = '';
- });
- },
- )),
+ title: TranslationBase.of(context).clearText,
+ onPressed: () {
+ setState(() {
+ replayOnReferralController.text = '';
+ });
+ },
+ ),
+ ),
+ Container(
+ margin: EdgeInsets.fromLTRB(16, 0, 16, 16),
+ child: Row(
+ children: [
+ Expanded(
+ child: AppButton(
+ onPressed: () async {
+ if (replayOnReferralController.text.isNotEmpty) {
+ GifLoaderDialogUtils.showMyDialog(context);
+ await widget.patientReferralViewModel.replayReferred(
+ replayOnReferralController.text.trim(), widget.myReferralInPatientModel, reject);
+ if (widget.patientReferralViewModel.state == ViewState.ErrorLocal) {
+ Helpers.showErrorToast(widget.patientReferralViewModel.error);
+ } else {
+ GifLoaderDialogUtils.hideDialog(context);
+ DrAppToastMsg.showSuccesToast("Has been rejected");
+ Navigator.of(context).pop();
+ Navigator.of(context).pop();
+
+ // Navigator.push(
+ // context,
+ // FadePage(
+ // page: ReplySummeryOnReferralPatient(
+ // widget.myReferralInPatientModel, replayOnReferralController.text.trim()),
+ // ),
+ // );
+ }
+ } else {
+ Helpers.showErrorToast("You can't add empty reply");
+ setState(() {
+ isSubmitted = false;
+ });
+ }
+ },
+ title: TranslationBase.of(context).reject,
+ fontColor: Colors.white,
+ color: Colors.red[600],
+ ),
+ ),
+ SizedBox(
+ width: 4,
+ ),
+ Expanded(
+ child: AppButton(
+ onPressed: () async {
+ setState(() {
+ isSubmitted = true;
+ });
+ if (replayOnReferralController.text.isNotEmpty) {
+ GifLoaderDialogUtils.showMyDialog(context);
+ await widget.patientReferralViewModel.replayReferred(
+ replayOnReferralController.text.trim(), widget.myReferralInPatientModel, replay);
+ if (widget.patientReferralViewModel.state == ViewState.ErrorLocal) {
+ Helpers.showErrorToast(widget.patientReferralViewModel.error);
+ } else {
+ GifLoaderDialogUtils.hideDialog(context);
+ DrAppToastMsg.showSuccesToast("Your Reply Added Successfully");
+ Navigator.of(context).pop();
+ Navigator.of(context).pop();
+
+ // Navigator.push(
+ // context,
+ // FadePage(
+ // page: ReplySummeryOnReferralPatient(
+ // widget.myReferralInPatientModel, replayOnReferralController.text.trim()),
+ // ),
+ // );
+ }
+ } else {
+ Helpers.showErrorToast("You can't add empty reply");
+ setState(() {
+ isSubmitted = false;
+ });
+ }
+ },
+ title: TranslationBase.of(context).noteConfirm,
+ fontColor: Colors.white,
+ color: Colors.green[600],
+ ),
+ ),
+ ],
),
- Container(
- margin: EdgeInsets.all(5),
- child: AppButton(
- title: 'Submit Replay',
- color: Color(0xff359846),
- fontWeight: FontWeight.w700,
- onPressed: () async {
- setState(() {
- isSubmitted = true;
- });
- if (replayOnReferralController.text.isNotEmpty) {
- GifLoaderDialogUtils.showMyDialog(context);
- await widget.patientReferralViewModel.replay(
- replayOnReferralController.text.trim(),
- widget.myReferralInPatientModel);
- if (widget.patientReferralViewModel.state ==
- ViewState.ErrorLocal) {
- Helpers.showErrorToast(
- widget.patientReferralViewModel.error);
- } else {
- GifLoaderDialogUtils.hideDialog(context);
- DrAppToastMsg.showSuccesToast(
- "Your Replay Added Successfully");
- Navigator.of(context).pop();
- Navigator.of(context).pop();
- }
- } else {
- Helpers.showErrorToast("You can't add empty replay");
- setState(() {
- isSubmitted = false;
- });
- }
- })),
- ],
- ),
+ ),
+ // Container(
+ // margin: EdgeInsets.all(5),
+ // child: AppButton(
+ // title: 'Submit Reply',
+ // color: Color(0xff359846),
+ // fontWeight: FontWeight.w700,
+ // onPressed: () async {
+ // setState(() {
+ // isSubmitted = true;
+ // });
+ // if (replayOnReferralController.text.isNotEmpty) {
+ // GifLoaderDialogUtils.showMyDialog(context);
+ // await widget.patientReferralViewModel.replay(
+ // replayOnReferralController.text.trim(),
+ // widget.myReferralInPatientModel);
+ // if (widget.patientReferralViewModel.state ==
+ // ViewState.ErrorLocal) {
+ // Helpers.showErrorToast(
+ // widget.patientReferralViewModel.error);
+ // } else {
+ // GifLoaderDialogUtils.hideDialog(context);
+ // DrAppToastMsg.showSuccesToast(
+ // "Your Reply Added Successfully");
+ // Navigator.of(context).pop();
+ // Navigator.of(context).pop();
+ //
+ // Navigator.push(
+ // context,
+ // FadePage(
+ // page: ReplySummeryOnReferralPatient(
+ // widget.myReferralInPatientModel,
+ // replayOnReferralController.text.trim()),
+ // ),
+ // );
+ // }
+ // } else {
+ // Helpers.showErrorToast("You can't add empty reply");
+ // setState(() {
+ // isSubmitted = false;
+ // });
+ // }
+ // })),
+ ],
+ ),
+ ),
+ ],
),
);
}
@@ -167,8 +267,7 @@ class _AddReplayOnReferralPatientState
onVoiceText() async {
new SpeechToText(context: context).showAlertDialog(context);
var lang = TranslationBase.of(AppGlobal.CONTEX).locale.languageCode;
- bool available = await speech.initialize(
- onStatus: statusListener, onError: errorListener);
+ bool available = await speech.initialize(onStatus: statusListener, onError: errorListener);
if (available) {
speech.listen(
onResult: resultListener,
diff --git a/lib/screens/patients/profile/referral/ReplySummeryOnReferralPatient.dart b/lib/screens/patients/profile/referral/ReplySummeryOnReferralPatient.dart
new file mode 100644
index 00000000..2a48e079
--- /dev/null
+++ b/lib/screens/patients/profile/referral/ReplySummeryOnReferralPatient.dart
@@ -0,0 +1,119 @@
+import 'package:doctor_app_flutter/config/size_config.dart';
+import 'package:doctor_app_flutter/core/model/referral/MyReferralPatientModel.dart';
+import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
+import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
+import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
+import 'package:doctor_app_flutter/screens/base/base_view.dart';
+import 'package:doctor_app_flutter/util/date-utils.dart';
+import 'package:doctor_app_flutter/util/helpers.dart';
+import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
+import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
+import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
+import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
+import 'package:flutter/material.dart';
+
+import '../../../../routes.dart';
+
+class ReplySummeryOnReferralPatient extends StatefulWidget {
+ final MyReferralPatientModel referredPatient;
+ final String doctorReply;
+
+ ReplySummeryOnReferralPatient(this.referredPatient, this.doctorReply);
+
+ @override
+ _ReplySummeryOnReferralPatientState createState() =>
+ _ReplySummeryOnReferralPatientState(this.referredPatient);
+}
+
+class _ReplySummeryOnReferralPatientState
+ extends State {
+ final MyReferralPatientModel referredPatient;
+
+ _ReplySummeryOnReferralPatientState(this.referredPatient);
+
+ @override
+ Widget build(BuildContext context) {
+ return BaseView(
+ builder: (_, model, w) => AppScaffold(
+ baseViewModel: model,
+ isShowAppBar: true,
+ appBarTitle: TranslationBase.of(context).summeryReply,
+ body: Container(
+ child: Column(
+ children: [
+
+ Expanded(
+ child: SingleChildScrollView(
+ child: Container(
+ width: double.infinity,
+ margin:
+ EdgeInsets.symmetric(horizontal: 16, vertical: 16),
+ padding: EdgeInsets.symmetric(
+ horizontal: 16, vertical: 16),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ shape: BoxShape.rectangle,
+ borderRadius: BorderRadius.all(Radius.circular(8)),
+ border: Border.fromBorderSide(BorderSide(
+ color: Colors.white,
+ width: 1.0,
+ )),
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AppText(
+ TranslationBase.of(context).reply,
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w700,
+ fontSize: 2.4 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ AppText(
+ widget.doctorReply ?? '',
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w600,
+ fontSize: 1.8 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ SizedBox(
+ height: 8,
+ ),
+ ],
+ ),
+ ),
+ ),
+ ),
+ Container(
+ margin:
+ EdgeInsets.symmetric(horizontal: 16, vertical: 16),
+ child: Row(
+ children: [
+ Expanded(
+ child: AppButton(
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ title: TranslationBase.of(context).cancel,
+ fontColor: Colors.white,
+ color: Colors.red[600],
+ ),
+ ),
+ SizedBox(width: 4,),
+ Expanded(
+ child: AppButton(
+ onPressed: () {},
+ title: TranslationBase.of(context).noteConfirm,
+ fontColor: Colors.white,
+ color: Colors.green[600],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ ));
+ }
+}
diff --git a/lib/screens/patients/profile/referral/my-referral-inpatient-screen.dart b/lib/screens/patients/profile/referral/my-referral-inpatient-screen.dart
index fcbd11b7..3ebd7896 100644
--- a/lib/screens/patients/profile/referral/my-referral-inpatient-screen.dart
+++ b/lib/screens/patients/profile/referral/my-referral-inpatient-screen.dart
@@ -1,16 +1,20 @@
+import 'package:doctor_app_flutter/core/enum/PatientType.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/profile/referral/referral_patient_detail_in-paint.dart';
+import 'package:doctor_app_flutter/screens/patients/profile/referral/referred-patient-screen.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/patient-referral-item-widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
+import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class MyReferralInPatientScreen extends StatelessWidget {
+ PatientType patientType = PatientType.IN_PATIENT;
@override
Widget build(BuildContext context) {
@@ -20,72 +24,90 @@ class MyReferralInPatientScreen extends StatelessWidget {
baseViewModel: model,
isShowAppBar: false,
appBarTitle: TranslationBase.of(context).referPatient,
- body: model.myReferralPatients.isEmpty
- ? Center(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- SizedBox(
- height: 100,
+ body: Column(
+ children: [
+ Container(
+ margin: EdgeInsets.only(top: 70),
+ child: PatientTypeRadioWidget(
+ (patientType) async {
+ this.patientType = patientType;
+ GifLoaderDialogUtils.showMyDialog(context);
+ if (patientType == PatientType.IN_PATIENT) {
+ await model.getMyReferralPatientService(localBusy: true);
+ } else {
+ await model.getMyReferralOutPatientService(localBusy: true);
+ }
+ GifLoaderDialogUtils.hideDialog(context);
+ },
+ ),
+ ),
+ model.myReferralPatients.isEmpty
+ ? Center(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ SizedBox(
+ height: 100,
+ ),
+ Image.asset('assets/images/no-data.png'),
+ Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: AppText(
+ TranslationBase.of(context).referralEmptyMsg,
+ color: Theme.of(context).errorColor,
+ ),
+ )
+ ],
),
- Image.asset('assets/images/no-data.png'),
- Padding(
- padding: const EdgeInsets.all(8.0),
- child: AppText(
- TranslationBase.of(context).referralEmptyMsg,
- color: Theme.of(context).errorColor,
- ),
- )
- ],
- ),
- )
- : SingleChildScrollView(
- child: Container(
- margin: EdgeInsets.only(top: 70),
- // color: Colors.white,
- // height: MediaQuery.of(context).size.height,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- // SizedBox(height: 50),
- ...List.generate(
- model.myReferralPatients.length,
- (index) => InkWell(
- onTap: () {
- Navigator.push(
- context,
- FadePage(
- page: ReferralPatientDetailScreen(model.myReferralPatients[index],model),
+ )
+ : Expanded(
+ child: SingleChildScrollView(
+ child: Container(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ ...List.generate(
+ model.myReferralPatients.length,
+ (index) => InkWell(
+ onTap: () {
+ Navigator.push(
+ context,
+ FadePage(
+ page: ReferralPatientDetailScreen(model.myReferralPatients[index], model),
+ ),
+ );
+ },
+ child: PatientReferralItemWidget(
+ referralStatus: model.getReferralStatusNameByCode(
+ model.myReferralPatients[index].referralStatus, context),
+ referralStatusCode: model.myReferralPatients[index].referralStatus,
+ patientName: model.myReferralPatients[index].patientName,
+ patientGender: model.myReferralPatients[index].gender,
+ referredDate: AppDateUtils.getDayMonthYearDateFormatted(
+ model.myReferralPatients[index].referralDate),
+ referredTime: AppDateUtils.getTimeHHMMA(model.myReferralPatients[index].referralDate),
+ patientID: "${model.myReferralPatients[index].patientID}",
+ isSameBranch: false,
+ isReferral: true,
+ isReferralClinic: true,
+ referralClinic: "${model.myReferralPatients[index].referringClinicDescription}",
+ remark: model.myReferralPatients[index].referringDoctorRemarks,
+ nationality: model.myReferralPatients[index].nationalityName,
+ nationalityFlag: model.myReferralPatients[index].nationalityFlagURL,
+ doctorAvatar: model.myReferralPatients[index].doctorImageURL,
+ referralDoctorName: model.myReferralPatients[index].referringDoctorName,
+ clinicDescription: model.myReferralPatients[index].referringClinicDescription,
+ infoIcon: Icon(FontAwesomeIcons.arrowRight, size: 25, color: Colors.black),
+ ),
),
- );
- },
- child: PatientReferralItemWidget(
- referralStatus: model.getReferralStatusNameByCode(model.myReferralPatients[index].referralStatus,context),
- referralStatusCode: model.myReferralPatients[index].referralStatus,
- patientName: model.myReferralPatients[index].patientName,
- patientGender: model.myReferralPatients[index].gender,
- referredDate: AppDateUtils.getDayMonthYearDateFormatted(model.myReferralPatients[index].referralDate),
- referredTime: AppDateUtils.getTimeHHMMA(model.myReferralPatients[index].referralDate),
- patientID: "${model.myReferralPatients[index].patientID}",
- isSameBranch: false,
- isReferral: true,
- isReferralClinic: true,
- referralClinic:"${model.myReferralPatients[index].referringClinicDescription}",
- remark: model.myReferralPatients[index].referringDoctorRemarks,
- nationality: model.myReferralPatients[index].nationalityName,
- nationalityFlag: model.myReferralPatients[index].nationalityFlagURL,
- doctorAvatar: model.myReferralPatients[index].doctorImageURL,
- referralDoctorName: model.myReferralPatients[index].referringDoctorName,
- clinicDescription: model.myReferralPatients[index].referringClinicDescription,
- infoIcon: Icon(FontAwesomeIcons.arrowRight,
- size: 25, color: Colors.black),
- ),
+ ),
+ ],
),
),
- ],
+ ),
),
- ),
- ),
+ ],
+ ),
),
);
}
diff --git a/lib/screens/patients/profile/referral/refer-patient-screen-in-patient.dart b/lib/screens/patients/profile/referral/refer-patient-screen-in-patient.dart
index 658ad895..66fd22fd 100644
--- a/lib/screens/patients/profile/referral/refer-patient-screen-in-patient.dart
+++ b/lib/screens/patients/profile/referral/refer-patient-screen-in-patient.dart
@@ -8,7 +8,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
@@ -136,10 +136,8 @@ class _PatientMakeInPatientReferralScreenState extends State {
baseViewModel: model,
appBarTitle: TranslationBase.of(context).referPatient,
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patientType, arrivalType),
+ appBar: PatientProfileAppBar(
+ patient),
body: SingleChildScrollView(
child: Container(
child: Column(
diff --git a/lib/screens/patients/profile/referral/referral_patient_detail_in-paint.dart b/lib/screens/patients/profile/referral/referral_patient_detail_in-paint.dart
index a949036b..66e01364 100644
--- a/lib/screens/patients/profile/referral/referral_patient_detail_in-paint.dart
+++ b/lib/screens/patients/profile/referral/referral_patient_detail_in-paint.dart
@@ -19,8 +19,8 @@ import 'AddReplayOnReferralPatient.dart';
class ReferralPatientDetailScreen extends StatelessWidget {
final MyReferralPatientModel referredPatient;
final PatientReferralViewModel patientReferralViewModel;
- ReferralPatientDetailScreen(
- this.referredPatient, this.patientReferralViewModel);
+
+ ReferralPatientDetailScreen(this.referredPatient, this.patientReferralViewModel);
@override
Widget build(BuildContext context) {
@@ -51,8 +51,7 @@ class ReferralPatientDetailScreen extends StatelessWidget {
),
Expanded(
child: AppText(
- (Helpers.capitalize(
- "${referredPatient.firstName} ${referredPatient.lastName}")),
+ (Helpers.capitalize("${referredPatient.firstName} ${referredPatient.lastName}")),
fontSize: SizeConfig.textMultiplier * 2.5,
fontWeight: FontWeight.bold,
fontFamily: 'Poppins',
@@ -69,18 +68,14 @@ class ReferralPatientDetailScreen extends StatelessWidget {
),
InkWell(
onTap: () {
- PatiantInformtion patient = model
- .getPatientFromReferralO(referredPatient);
- Navigator.of(context)
- .pushNamed(PATIENTS_PROFILE, arguments: {
+ PatiantInformtion patient = model.getPatientFromReferralO(referredPatient);
+ Navigator.of(context).pushNamed(PATIENTS_PROFILE, arguments: {
"patient": patient,
"patientType": "1",
"isInpatient": true,
"arrivalType": "1",
- "from": AppDateUtils.convertDateToFormat(
- DateTime.now(), 'yyyy-MM-dd'),
- "to": AppDateUtils.convertDateToFormat(
- DateTime.now(), 'yyyy-MM-dd'),
+ "from": AppDateUtils.convertDateToFormat(DateTime.now(), 'yyyy-MM-dd'),
+ "to": AppDateUtils.convertDateToFormat(DateTime.now(), 'yyyy-MM-dd'),
});
},
child: Icon(
@@ -97,18 +92,14 @@ class ReferralPatientDetailScreen extends StatelessWidget {
children: [
InkWell(
onTap: () {
- PatiantInformtion patient = model
- .getPatientFromReferralO(referredPatient);
- Navigator.of(context)
- .pushNamed(PATIENTS_PROFILE, arguments: {
+ PatiantInformtion patient = model.getPatientFromReferralO(referredPatient);
+ Navigator.of(context).pushNamed(PATIENTS_PROFILE, arguments: {
"patient": patient,
"patientType": "1",
"isInpatient": true,
"arrivalType": "1",
- "from": AppDateUtils.convertDateToFormat(
- DateTime.now(), 'yyyy-MM-dd'),
- "to": AppDateUtils.convertDateToFormat(
- DateTime.now(), 'yyyy-MM-dd'),
+ "from": AppDateUtils.convertDateToFormat(DateTime.now(), 'yyyy-MM-dd'),
+ "to": AppDateUtils.convertDateToFormat(DateTime.now(), 'yyyy-MM-dd'),
});
},
child: Padding(
@@ -143,8 +134,7 @@ class ReferralPatientDetailScreen extends StatelessWidget {
child: Column(
children: [
Row(
- mainAxisAlignment:
- MainAxisAlignment.spaceBetween,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
AppText(
"${model.getReferralStatusNameByCode(referredPatient.referralStatus, context)}",
@@ -153,7 +143,7 @@ class ReferralPatientDetailScreen extends StatelessWidget {
fontWeight: FontWeight.w700,
color: referredPatient.referralStatus == 1
? Color(0xffc4aa54)
- : referredPatient.referralStatus == 46
+ : referredPatient.referralStatus == 46 || referredPatient.referralStatus == 2
? Colors.green[700]
: Colors.red[700],
),
@@ -169,28 +159,23 @@ class ReferralPatientDetailScreen extends StatelessWidget {
],
),
Row(
- mainAxisAlignment:
- MainAxisAlignment.spaceBetween,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
- mainAxisAlignment:
- MainAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.start,
children: [
AppText(
- TranslationBase.of(context)
- .fileNumber,
+ TranslationBase.of(context).fileNumber,
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
- fontSize:
- 1.7 * SizeConfig.textMultiplier,
+ fontSize: 1.7 * SizeConfig.textMultiplier,
color: Color(0XFF575757),
),
AppText(
"${referredPatient.patientID}",
fontFamily: 'Poppins',
fontWeight: FontWeight.w700,
- fontSize:
- 1.8 * SizeConfig.textMultiplier,
+ fontSize: 1.8 * SizeConfig.textMultiplier,
color: Color(0XFF2E303A),
),
],
@@ -207,94 +192,79 @@ class ReferralPatientDetailScreen extends StatelessWidget {
],
),
Row(
- mainAxisAlignment:
- MainAxisAlignment.spaceBetween,
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
child: Column(
children: [
Row(
- mainAxisAlignment:
- MainAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
"${TranslationBase.of(context).refClinic}: ",
fontFamily: 'Poppins',
fontWeight: FontWeight.w600,
- fontSize: 1.7 *
- SizeConfig.textMultiplier,
- color: Color(0XFF575757),
- ),
- AppText(
- referredPatient
- .referringClinicDescription,
- fontFamily: 'Poppins',
- fontWeight: FontWeight.w700,
- fontSize: 1.8 *
- SizeConfig.textMultiplier,
- color: Color(0XFF2E303A),
- ),
- ],
- ),
- Row(
- mainAxisAlignment:
- MainAxisAlignment.start,
- crossAxisAlignment:
- CrossAxisAlignment.start,
- children: [
- AppText(
- TranslationBase.of(context)
- .frequency +
- ": ",
- fontFamily: 'Poppins',
- fontWeight: FontWeight.w600,
- fontSize: 1.7 *
- SizeConfig.textMultiplier,
+ fontSize: 1.7 * SizeConfig.textMultiplier,
color: Color(0XFF575757),
),
Expanded(
child: AppText(
- referredPatient
- .frequencyDescription,
+ referredPatient.referringClinicDescription,
fontFamily: 'Poppins',
fontWeight: FontWeight.w700,
- fontSize: 1.8 *
- SizeConfig.textMultiplier,
+ fontSize: 1.8 * SizeConfig.textMultiplier,
color: Color(0XFF2E303A),
),
),
],
),
+ if (referredPatient.frequency != null)
+ Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AppText(
+ TranslationBase.of(context).frequency + ": ",
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w600,
+ fontSize: 1.7 * SizeConfig.textMultiplier,
+ color: Color(0XFF575757),
+ ),
+ Expanded(
+ child: AppText(
+ referredPatient.frequencyDescription ?? '',
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w700,
+ fontSize: 1.8 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ ),
+ ],
+ ),
],
),
),
Row(
children: [
AppText(
- referredPatient.nationalityName !=
- null
+ referredPatient.nationalityName != null
? referredPatient.nationalityName
: "",
fontWeight: FontWeight.bold,
color: Color(0xFF2E303A),
- fontSize:
- 1.4 * SizeConfig.textMultiplier,
+ fontSize: 1.4 * SizeConfig.textMultiplier,
),
- referredPatient.nationalityFlagURL !=
- null
+ referredPatient.nationalityFlagURL != null
? ClipRRect(
- borderRadius:
- BorderRadius.circular(20.0),
+ borderRadius: BorderRadius.circular(20.0),
child: Image.network(
- referredPatient
- .nationalityFlagURL,
+ referredPatient.nationalityFlagURL,
height: 25,
width: 30,
- errorBuilder: (BuildContext
- context,
- Object exception,
- StackTrace stackTrace) {
+ errorBuilder:
+ (BuildContext context, Object exception, StackTrace stackTrace) {
return Text('No Image');
},
))
@@ -303,63 +273,60 @@ class ReferralPatientDetailScreen extends StatelessWidget {
)
],
),
- Row(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- AppText(
- TranslationBase.of(context).priority +
- ": ",
- fontFamily: 'Poppins',
- fontWeight: FontWeight.w600,
- fontSize: 1.7 * SizeConfig.textMultiplier,
- color: Color(0XFF575757),
- ),
- Expanded(
- child: AppText(
- referredPatient.priorityDescription,
+ if (referredPatient.priorityDescription != null)
+ Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AppText(
+ TranslationBase.of(context).priority + ": ",
fontFamily: 'Poppins',
- fontWeight: FontWeight.w700,
- fontSize:
- 1.8 * SizeConfig.textMultiplier,
- color: Color(0XFF2E303A),
+ fontWeight: FontWeight.w600,
+ fontSize: 1.7 * SizeConfig.textMultiplier,
+ color: Color(0XFF575757),
),
- ),
- ],
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- AppText(
- TranslationBase.of(context)
- .maxResponseTime +
- ": ",
- fontFamily: 'Poppins',
- fontWeight: FontWeight.w600,
- fontSize: 1.7 * SizeConfig.textMultiplier,
- color: Color(0XFF575757),
- ),
- Expanded(
- child: AppText(
- AppDateUtils.convertDateFromServerFormat(
- referredPatient.mAXResponseTime,
- "dd MMM,yyyy"),
+ Expanded(
+ child: AppText(
+ referredPatient.priorityDescription ?? '',
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w700,
+ fontSize: 1.8 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ ),
+ ],
+ ),
+ if (referredPatient.mAXResponseTime != null)
+ Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AppText(
+ TranslationBase.of(context).maxResponseTime + ": ",
fontFamily: 'Poppins',
- fontWeight: FontWeight.w700,
- fontSize:
- 1.8 * SizeConfig.textMultiplier,
- color: Color(0XFF2E303A),
+ fontWeight: FontWeight.w600,
+ fontSize: 1.7 * SizeConfig.textMultiplier,
+ color: Color(0XFF575757),
),
- ),
- ],
- ),
+ Expanded(
+ child: AppText(
+ referredPatient.mAXResponseTime != null
+ ? AppDateUtils.convertDateFromServerFormat(
+ referredPatient.mAXResponseTime, "dd MMM,yyyy")
+ : '',
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w700,
+ fontSize: 1.8 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ ),
+ ],
+ ),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
- margin:
- EdgeInsets.only(left: 10, right: 0),
+ margin: EdgeInsets.only(left: 10, right: 0),
child: Image.asset(
'assets/images/patient/ic_ref_arrow_up.png',
height: 50,
@@ -367,26 +334,17 @@ class ReferralPatientDetailScreen extends StatelessWidget {
),
),
Container(
- margin: EdgeInsets.only(
- left: 0,
- top: 25,
- right: 0,
- bottom: 0),
- padding: EdgeInsets.only(
- left: 4.0, right: 4.0),
- child: referredPatient.doctorImageURL !=
- null
+ margin: EdgeInsets.only(left: 0, top: 25, right: 0, bottom: 0),
+ padding: EdgeInsets.only(left: 4.0, right: 4.0),
+ child: referredPatient.doctorImageURL != null
? ClipRRect(
- borderRadius:
- BorderRadius.circular(20.0),
+ borderRadius: BorderRadius.circular(20.0),
child: Image.network(
referredPatient.doctorImageURL,
height: 25,
width: 30,
errorBuilder:
- (BuildContext context,
- Object exception,
- StackTrace stackTrace) {
+ (BuildContext context, Object exception, StackTrace stackTrace) {
return Text('No Image');
},
))
@@ -402,30 +360,22 @@ class ReferralPatientDetailScreen extends StatelessWidget {
Expanded(
flex: 4,
child: Container(
- margin: EdgeInsets.only(
- left: 10,
- top: 30,
- right: 10,
- bottom: 0),
+ margin: EdgeInsets.only(left: 10, top: 30, right: 10, bottom: 0),
child: Column(
- crossAxisAlignment:
- CrossAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
AppText(
"${TranslationBase.of(context).dr} ${referredPatient.referringDoctorName}",
fontFamily: 'Poppins',
fontWeight: FontWeight.w800,
- fontSize: 1.5 *
- SizeConfig.textMultiplier,
+ fontSize: 1.5 * SizeConfig.textMultiplier,
color: Colors.black,
),
AppText(
- referredPatient
- .referringClinicDescription,
+ referredPatient.referringClinicDescription,
fontFamily: 'Poppins',
fontWeight: FontWeight.w700,
- fontSize: 1.3 *
- SizeConfig.textMultiplier,
+ fontSize: 1.3 * SizeConfig.textMultiplier,
color: Color(0XFF2E303A),
),
],
@@ -445,67 +395,110 @@ class ReferralPatientDetailScreen extends StatelessWidget {
),
Expanded(
child: SingleChildScrollView(
- child: Container(
- width: double.infinity,
- margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
- padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
- decoration: BoxDecoration(
- color: Colors.white,
- shape: BoxShape.rectangle,
- borderRadius: BorderRadius.all(Radius.circular(8)),
- border: Border.fromBorderSide(BorderSide(
- color: Colors.white,
- width: 1.0,
- )),
- ),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- AppText(
- TranslationBase.of(context).remarks,
- fontFamily: 'Poppins',
- fontWeight: FontWeight.w700,
- fontSize: 2.4 * SizeConfig.textMultiplier,
- color: Color(0XFF2E303A),
+ child: Column(
+ children: [
+ Container(
+ width: double.infinity,
+ margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
+ padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ shape: BoxShape.rectangle,
+ borderRadius: BorderRadius.all(Radius.circular(8)),
+ border: Border.fromBorderSide(BorderSide(
+ color: Colors.white,
+ width: 1.0,
+ )),
),
- AppText(
- referredPatient.referringDoctorRemarks,
- fontFamily: 'Poppins',
- fontWeight: FontWeight.w600,
- fontSize: 1.8 * SizeConfig.textMultiplier,
- color: Color(0XFF2E303A),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AppText(
+ TranslationBase.of(context).remarks,
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w700,
+ fontSize: 2.4 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ AppText(
+ referredPatient.referringDoctorRemarks ?? '',
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w600,
+ fontSize: 1.8 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ SizedBox(
+ height: 8,
+ ),
+ ],
),
- SizedBox(
- height: 8,
+ ),
+ if (referredPatient.referredDoctorRemarks.isNotEmpty)
+ Container(
+ width: double.infinity,
+ margin: EdgeInsets.symmetric(horizontal: 16, vertical: 0),
+ padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ shape: BoxShape.rectangle,
+ borderRadius: BorderRadius.all(Radius.circular(8)),
+ border: Border.fromBorderSide(BorderSide(
+ color: Colors.white,
+ width: 1.0,
+ )),
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ AppText(
+ TranslationBase.of(context).reply,
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w700,
+ fontSize: 2.4 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ AppText(
+ referredPatient.referredDoctorRemarks ?? '',
+ fontFamily: 'Poppins',
+ fontWeight: FontWeight.w600,
+ fontSize: 1.8 * SizeConfig.textMultiplier,
+ color: Color(0XFF2E303A),
+ ),
+ SizedBox(
+ height: 8,
+ ),
+ ],
+ ),
),
- ],
- ),
+ ],
),
),
),
- Container(
- margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
- child: AppButton(
- title: TranslationBase.of(context).replay,
- color: Colors.red[700],
- fontColor: Colors.white,
- fontWeight: FontWeight.w700,
- fontSize: 1.8,
- hPadding: 8,
- vPadding: 12,
- onPressed: () async {
- Navigator.push(
- context,
- SlideUpPageRoute(
- widget: AddReplayOnReferralPatient(
- patientReferralViewModel: patientReferralViewModel,
- myReferralInPatientModel: referredPatient,
+ if (referredPatient.referralStatus == 1)
+ Container(
+ margin: EdgeInsets.symmetric(horizontal: 16, vertical: 16),
+ child: AppButton(
+ title: TranslationBase.of(context).replay,
+ color: Colors.red[700],
+ fontColor: Colors.white,
+ fontWeight: FontWeight.w700,
+ fontSize: 1.8,
+ hPadding: 8,
+ vPadding: 12,
+ onPressed: () async {
+ Navigator.push(
+ context,
+ SlideUpPageRoute(
+ widget: AddReplayOnReferralPatient(
+ patientReferralViewModel: patientReferralViewModel,
+ myReferralInPatientModel: referredPatient,
+ isEdited: referredPatient.referredDoctorRemarks.isNotEmpty,
+ ),
),
- ),
- );
- },
+ );
+ },
+ ),
),
- ),
],
),
),
diff --git a/lib/screens/patients/profile/referral/referred-patient-screen.dart b/lib/screens/patients/profile/referral/referred-patient-screen.dart
index dc2bf798..c95a28d8 100644
--- a/lib/screens/patients/profile/referral/referred-patient-screen.dart
+++ b/lib/screens/patients/profile/referral/referred-patient-screen.dart
@@ -1,3 +1,4 @@
+import 'package:doctor_app_flutter/core/enum/PatientType.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/profile/referral/referred_patient_detail_in-paint.dart';
@@ -6,12 +7,15 @@ import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/patient-referral-item-widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
+import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class ReferredPatientScreen extends StatelessWidget {
- // previous design page is: MyReferredPatient
+
+ PatientType patientType = PatientType.IN_PATIENT;
+
@override
Widget build(BuildContext context) {
return BaseView(
@@ -20,103 +24,172 @@ class ReferredPatientScreen extends StatelessWidget {
baseViewModel: model,
isShowAppBar: false,
appBarTitle: TranslationBase.of(context).referredPatient,
- body: model.listMyReferredPatientModel == null ||
- model.listMyReferredPatientModel.length == 0
- ? Center(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Container(
- height: 100,
+ body: Column(
+ children: [
+ Container(
+ margin: EdgeInsets.only(top: 70),
+ child: PatientTypeRadioWidget(
+ (patientType) async {
+ this.patientType = patientType;
+ GifLoaderDialogUtils.showMyDialog(context);
+ if (patientType == PatientType.IN_PATIENT) {
+ await model.getMyReferredPatient(isFirstTime: false);
+ } else {
+ await model.getMyReferredOutPatient(isFirstTime: false);
+ }
+ GifLoaderDialogUtils.hideDialog(context);
+ },
+ ),
+ ),
+ model.listMyReferredPatientModel == null ||
+ model.listMyReferredPatientModel.length == 0
+ ? Center(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Container(
+ height: 100,
+ ),
+ Image.asset('assets/images/no-data.png'),
+ Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: AppText(
+ TranslationBase.of(context).referralEmptyMsg,
+ color: Theme.of(context).errorColor,
+ ),
+ )
+ ],
),
- Image.asset('assets/images/no-data.png'),
- Padding(
- padding: const EdgeInsets.all(8.0),
- child: AppText(
- TranslationBase.of(context).referralEmptyMsg,
- color: Theme.of(context).errorColor,
- ),
- )
- ],
- ),
- )
- : SingleChildScrollView(
- // DoctorApplication.svc/REST/GtMyReferredPatient
- child: Container(
- margin: EdgeInsets.only(top: 70),
- child: Column(
- children: [
- // const Divider(
- // color: Color(0xffCCCCCC),
- // height: 1,
- // thickness: 2,
- // indent: 0,
- // endIndent: 0,
- // ),
- ...List.generate(
- model.listMyReferredPatientModel.length,
- (index) => InkWell(
- onTap: () {
- Navigator.push(
- context,
- FadePage(
- page: ReferredPatientDetailScreen(
- model.getReferredPatientItem(index)),
+ )
+ : Expanded(
+ child: SingleChildScrollView(
+ // DoctorApplication.svc/REST/GtMyReferredPatient
+ child: Container(
+ child: Column(
+ children: [
+ ...List.generate(
+ model.listMyReferredPatientModel.length,
+ (index) => InkWell(
+ onTap: () {
+ Navigator.push(
+ context,
+ FadePage(
+ page: ReferredPatientDetailScreen(
+ model.getReferredPatientItem(index)),
+ ),
+ );
+ },
+ child: PatientReferralItemWidget(
+ referralStatus: model
+ .getReferredPatientItem(index)
+ .referralStatusDesc,
+ referralStatusCode: model
+ .getReferredPatientItem(index)
+ .referralStatus,
+ patientName:
+ "${model.getReferredPatientItem(index).firstName} ${model.getReferredPatientItem(index).middleName} ${model.getReferredPatientItem(index).lastName}",
+ patientGender:
+ model.getReferredPatientItem(index).gender,
+ referredDate:
+ AppDateUtils.convertDateFromServerFormat(
+ model
+ .getReferredPatientItem(index)
+ .referralDate,
+ "dd/MM/yyyy"),
+ referredTime:
+ AppDateUtils.convertDateFromServerFormat(
+ model
+ .getReferredPatientItem(index)
+ .referralDate,
+ "hh:mm a"),
+ patientID:
+ "${model.getReferredPatientItem(index).patientID}",
+ isSameBranch: model
+ .getReferredPatientItem(index)
+ .isReferralDoctorSameBranch,
+ isReferral: false,
+ remark: model
+ .getReferredPatientItem(index)
+ .referringDoctorRemarks,
+ nationality: model
+ .getReferredPatientItem(index)
+ .nationalityName,
+ nationalityFlag: model
+ .getReferredPatientItem(index)
+ .nationalityFlagURL,
+ doctorAvatar: model
+ .getReferredPatientItem(index)
+ .doctorImageURL,
+ referralDoctorName:
+ "${TranslationBase.of(context).dr} ${model.getReferredPatientItem(index).referralDoctorName}",
+ clinicDescription: model
+ .getReferredPatientItem(index)
+ .referralClinicDescription,
+ infoIcon: Icon(FontAwesomeIcons.arrowRight,
+ size: 25, color: Colors.black),
+ ),
),
- );
- },
- child: PatientReferralItemWidget(
- referralStatus:model.getReferredPatientItem(index).referralStatusDesc,
- referralStatusCode: model
- .getReferredPatientItem(index)
- .referralStatus,
- patientName:
- "${model.getReferredPatientItem(index).firstName} ${model.getReferredPatientItem(index).middleName} ${model.getReferredPatientItem(index).lastName}",
- patientGender:
- model.getReferredPatientItem(index).gender,
- referredDate: AppDateUtils.convertDateFromServerFormat(
- model
- .getReferredPatientItem(index)
- .referralDate,
- "dd/MM/yyyy"),
- referredTime: AppDateUtils.convertDateFromServerFormat(
- model
- .getReferredPatientItem(index)
- .referralDate,
- "hh:mm a"),
- patientID:
- "${model.getReferredPatientItem(index).patientID}",
- isSameBranch: model
- .getReferredPatientItem(index)
- .isReferralDoctorSameBranch,
- isReferral: false,
- remark: model
- .getReferredPatientItem(index)
- .referringDoctorRemarks,
- nationality: model
- .getReferredPatientItem(index)
- .nationalityName,
- nationalityFlag: model
- .getReferredPatientItem(index)
- .nationalityFlagURL,
- doctorAvatar: model
- .getReferredPatientItem(index)
- .doctorImageURL,
- referralDoctorName:
- "${TranslationBase.of(context).dr} ${model.getReferredPatientItem(index).referralDoctorName}",
- clinicDescription: model
- .getReferredPatientItem(index)
- .referralClinicDescription,
- infoIcon: Icon(FontAwesomeIcons.arrowRight,
- size: 25, color: Colors.black),
- ),
+ ),
+ ],
),
),
- ],
- ),
+ ),
),
- ),
+ ],
+ ),
),
);
}
}
+
+class PatientTypeRadioWidget extends StatefulWidget {
+ final Function(PatientType) radioOnChange;
+
+ PatientTypeRadioWidget(this.radioOnChange);
+
+ @override
+ _PatientTypeRadioWidgetState createState() =>
+ _PatientTypeRadioWidgetState(this.radioOnChange);
+}
+
+class _PatientTypeRadioWidgetState extends State {
+ final Function(PatientType) radioOnChange;
+
+ _PatientTypeRadioWidgetState(this.radioOnChange);
+
+ PatientType patientType = PatientType.IN_PATIENT;
+
+ @override
+ Widget build(BuildContext context) {
+ return Row(
+ children: [
+ Expanded(
+ child: RadioListTile(
+ title: AppText(TranslationBase.of(context).inPatient),
+ value: PatientType.IN_PATIENT,
+ groupValue: patientType,
+ onChanged: (PatientType value) {
+ setState(() {
+ patientType = value;
+ radioOnChange(value);
+ });
+ },
+ ),
+ ),
+ Expanded(
+ child: RadioListTile(
+ title: AppText(TranslationBase.of(context).outpatient),
+ value: PatientType.OUT_PATIENT,
+ groupValue: patientType,
+ onChanged: (PatientType value) {
+ setState(() {
+ patientType = value;
+ radioOnChange(value);
+ });
+ },
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/screens/patients/profile/referral/referred_patient_detail_in-paint.dart b/lib/screens/patients/profile/referral/referred_patient_detail_in-paint.dart
index b4e1ddc5..b3f11c51 100644
--- a/lib/screens/patients/profile/referral/referred_patient_detail_in-paint.dart
+++ b/lib/screens/patients/profile/referral/referred_patient_detail_in-paint.dart
@@ -236,6 +236,8 @@ class ReferredPatientDetailScreen extends StatelessWidget {
),
],
),
+ if(referredPatient
+ .frequencyDescription != null)
Row(
mainAxisAlignment:
MainAxisAlignment.start,
@@ -301,6 +303,7 @@ class ReferredPatientDetailScreen extends StatelessWidget {
)
],
),
+ if(referredPatient.priorityDescription != null)
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -322,6 +325,7 @@ class ReferredPatientDetailScreen extends StatelessWidget {
),
],
),
+ if(referredPatient.mAXResponseTime != null)
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -337,9 +341,9 @@ class ReferredPatientDetailScreen extends StatelessWidget {
),
Expanded(
child: AppText(
- AppDateUtils.convertDateFromServerFormat(
+ referredPatient.mAXResponseTime != null?AppDateUtils.convertDateFromServerFormat(
referredPatient.mAXResponseTime,
- "dd MMM,yyyy"),
+ "dd MMM,yyyy"):'',
fontFamily: 'Poppins',
fontWeight: FontWeight.w700,
fontSize:
@@ -515,6 +519,7 @@ class ReferredPatientDetailScreen extends StatelessWidget {
),
AppText(
referredPatient
+ .referredDoctorRemarks == null ?'':referredPatient
.referredDoctorRemarks.isNotEmpty
? referredPatient.referredDoctorRemarks
: TranslationBase.of(context).notRepliedYet,
@@ -543,7 +548,7 @@ class ReferredPatientDetailScreen extends StatelessWidget {
fontSize: 1.8,
hPadding: 8,
vPadding: 12,
- disabled: referredPatient.referredDoctorRemarks.isNotEmpty
+ disabled: referredPatient.referredDoctorRemarks == null? true: referredPatient.referredDoctorRemarks.isNotEmpty
? false
: true,
onPressed: () async {
diff --git a/lib/screens/patients/profile/soap_update/update_soap_index.dart b/lib/screens/patients/profile/soap_update/update_soap_index.dart
index d9af7457..60597b11 100644
--- a/lib/screens/patients/profile/soap_update/update_soap_index.dart
+++ b/lib/screens/patients/profile/soap_update/update_soap_index.dart
@@ -7,7 +7,7 @@ import 'package:doctor_app_flutter/models/SOAP/my_selected_history.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update/subjective/update_subjective_page.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
@@ -82,7 +82,7 @@ class _UpdateSoapIndexState extends State
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- PatientProfileHeaderNewDesign(patient, '7', '7',),
+ PatientProfileAppBar(patient),
Container(
width: double.infinity,
height: 1,
diff --git a/lib/screens/patients/profile/vital_sign/vital-signs-screen.dart b/lib/screens/patients/profile/vital_sign/vital-signs-screen.dart
deleted file mode 100644
index 0bf2197b..00000000
--- a/lib/screens/patients/profile/vital_sign/vital-signs-screen.dart
+++ /dev/null
@@ -1,1074 +0,0 @@
-import 'package:doctor_app_flutter/config/size_config.dart';
-import 'package:doctor_app_flutter/core/viewModel/patient-vital-sign-viewmodel.dart';
-import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
-import 'package:doctor_app_flutter/models/patient/vital_sign/patient-vital-sign-data.dart';
-import 'package:doctor_app_flutter/screens/base/base_view.dart';
-import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart';
-import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
-import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
-import 'package:doctor_app_flutter/widgets/shared/expandable-widget-header-body.dart';
-import 'package:flutter/material.dart';
-import 'package:hexcolor/hexcolor.dart';
-
-class PatientVitalSignScreen extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- final routeArgs = ModalRoute.of(context).settings.arguments as Map;
- PatiantInformtion patient = routeArgs['patient'];
- String from = routeArgs['from'];
- String to = routeArgs['to'];
-
- return BaseView(
- onModelReady: (model) => model.getPatientVitalSign(patient),
- builder: (_, model, w) => AppScaffold(
- baseViewModel: model,
- appBarTitle: TranslationBase.of(context).vitalSign,
- body: model.patientVitalSigns != null
- ? SingleChildScrollView(
- child: Container(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.start,
- children: [
- PatientPageHeaderWidget(patient),
- SizedBox(
- height: 16,
- ),
- Container(
- margin:
- EdgeInsets.symmetric(horizontal: 16, vertical: 16),
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).weight} :",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.black,
- fontWeight: FontWeight.bold,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${model.patientVitalSigns.weightKg} ${TranslationBase.of(context).kg}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).idealBodyWeight} :",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.black,
- fontWeight: FontWeight.bold,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${model.patientVitalSigns.idealBodyWeightLbs} ${TranslationBase.of(context).kg}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ],
- ),
- SizedBox(
- height: 4,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).height} :",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.black,
- fontWeight: FontWeight.bold,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${model.patientVitalSigns.heightCm} ${TranslationBase.of(context).cm}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ],
- ),
- SizedBox(
- height: 4,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- /*Row(
- children: [
- AppText(
- "${TranslationBase.of(context).waistSize} :",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.black,
- fontWeight: FontWeight.bold,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${model.patientVitalSigns.waistSizeInch} ${TranslationBase.of(context).inch}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),*/
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).headCircum} :",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.black,
- fontWeight: FontWeight.bold,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${model.patientVitalSigns.headCircumCm} ${TranslationBase.of(context).cm}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ],
- ),
- SizedBox(
- height: 16,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).leanBodyWeight} :",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.black,
- fontWeight: FontWeight.bold,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${model.patientVitalSigns.leanBodyWeightLbs} ${TranslationBase.of(context).kg}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ],
- ),
- SizedBox(
- height: 4,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).bodyMassIndex} :",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.black,
- fontWeight: FontWeight.bold,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${model.patientVitalSigns.bodyMassIndex}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- SizedBox(
- width: 8,
- ),
- Container(
- color: Colors.green,
- child: Padding(
- padding: EdgeInsets.symmetric(
- vertical: 2, horizontal: 8),
- child: AppText(
- "${model.getBMI(model.patientVitalSigns.bodyMassIndex)}",
- fontSize:
- SizeConfig.textMultiplier * 2,
- color: Colors.white,
- fontWeight: FontWeight.bold,
- ),
- ),
- )
- ],
- ),
- ],
- ),
- SizedBox(
- height: 4,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppText(
- "G.C.S :",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.black,
- fontWeight: FontWeight.bold,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "N/A",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ],
- ),
- SizedBox(
- height: 16,
- ),
- const Divider(
- color: Color(0xffCCCCCC),
- height: 1,
- thickness: 2,
- indent: 0,
- endIndent: 0,
- ),
- SizedBox(
- height: 16,
- ),
- TemperatureWidget(model, model.patientVitalSigns),
- SizedBox(
- height: 16,
- ),
- const Divider(
- color: Color(0xffCCCCCC),
- height: 1,
- thickness: 2,
- indent: 0,
- endIndent: 0,
- ),
- SizedBox(
- height: 16,
- ),
- PulseWidget(model.patientVitalSigns),
- SizedBox(
- height: 16,
- ),
- const Divider(
- color: Color(0xffCCCCCC),
- height: 1,
- thickness: 2,
- indent: 0,
- endIndent: 0,
- ),
- SizedBox(
- height: 16,
- ),
- RespirationWidget(model.patientVitalSigns),
- SizedBox(
- height: 16,
- ),
- const Divider(
- color: Color(0xffCCCCCC),
- height: 1,
- thickness: 2,
- indent: 0,
- endIndent: 0,
- ),
- SizedBox(
- height: 16,
- ),
- BloodPressureWidget(model.patientVitalSigns),
- SizedBox(
- height: 16,
- ),
- const Divider(
- color: Color(0xffCCCCCC),
- height: 1,
- thickness: 2,
- indent: 0,
- endIndent: 0,
- ),
- SizedBox(
- height: 16,
- ),
- OxygenationWidget(model.patientVitalSigns),
- SizedBox(
- height: 16,
- ),
- const Divider(
- color: Color(0xffCCCCCC),
- height: 1,
- thickness: 2,
- indent: 0,
- endIndent: 0,
- ),
- SizedBox(
- height: 16,
- ),
- PainScaleWidget(model.patientVitalSigns),
- SizedBox(
- height: 16,
- ),
- const Divider(
- color: Color(0xffCCCCCC),
- height: 1,
- thickness: 2,
- indent: 0,
- endIndent: 0,
- ),
- SizedBox(
- height: 16,
- ),
- ],
- ),
- )
- ],
- ),
- ),
- )
- : Center(
- child: AppText(
- "${TranslationBase.of(context).vitalSignEmptyMsg}",
- fontSize: SizeConfig.textMultiplier * 2.5,
- color: HexColor("#B8382B"),
- fontWeight: FontWeight.normal,
- ),
- ),
- ),
- );
- }
-}
-
-class TemperatureWidget extends StatefulWidget {
- final VitalSignsViewModel model;
- final VitalSignData vitalSign;
-
- TemperatureWidget(this.model, this.vitalSign);
-
- @override
- _TemperatureWidgetState createState() => _TemperatureWidgetState();
-}
-
-class _TemperatureWidgetState extends State {
- bool isExpand = false;
-
- @override
- Widget build(BuildContext context) {
- return Container(
- child: HeaderBodyExpandableNotifier(
- headerWidget: Container(
- margin: EdgeInsets.symmetric(vertical: 16.0),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- AppText(
- "${TranslationBase.of(context).temperature}",
- fontSize: SizeConfig.textMultiplier * 2.5,
- color: Colors.black,
- fontWeight: isExpand ? FontWeight.bold : FontWeight.normal,
- ),
- InkWell(
- onTap: () {
- setState(() {
- isExpand = !isExpand;
- });
- },
- child: Icon(isExpand ? Icons.remove : Icons.add),
- ),
- ],
- ),
- ),
- bodyWidget: Container(
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).temperature} (C):",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.temperatureCelcius}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).temperature} (F):",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.temperatureCelcius * (9 / 5) + 32}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- SizedBox(
- height: 4,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).method} :",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${widget.model.getTempratureMethod(widget.vitalSign.temperatureCelciusMethod)}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ],
- ),
- ],
- ),
- ),
- isExpand: isExpand,
- ),
- );
- }
-}
-
-class PulseWidget extends StatefulWidget {
- final VitalSignData vitalSign;
-
- PulseWidget(this.vitalSign);
-
- @override
- _PulseWidgetState createState() => _PulseWidgetState();
-}
-
-class _PulseWidgetState extends State {
- bool isExpand = false;
-
- @override
- Widget build(BuildContext context) {
- return Container(
- child: HeaderBodyExpandableNotifier(
- headerWidget: Container(
- margin: EdgeInsets.symmetric(vertical: 16.0),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- AppText(
- "${TranslationBase.of(context).pulse}",
- fontSize: SizeConfig.textMultiplier * 2.5,
- color: Colors.black,
- fontWeight: isExpand ? FontWeight.bold : FontWeight.normal,
- ),
- InkWell(
- onTap: () {
- setState(() {
- isExpand = !isExpand;
- });
- },
- child: Icon(isExpand ? Icons.remove : Icons.add),
- ),
- ],
- ),
- ),
- bodyWidget: Container(
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).pulseBeats}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.pulseBeatPerMinute}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).rhythm}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.pulseRhythm}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- ],
- ),
- ),
- isExpand: isExpand,
- ),
- );
- }
-}
-
-class RespirationWidget extends StatefulWidget {
- final VitalSignData vitalSign;
-
- RespirationWidget(this.vitalSign);
-
- @override
- _RespirationWidgetState createState() => _RespirationWidgetState();
-}
-
-class _RespirationWidgetState extends State {
- bool isExpand = false;
-
- @override
- Widget build(BuildContext context) {
- return Container(
- child: HeaderBodyExpandableNotifier(
- headerWidget: Container(
- margin: EdgeInsets.symmetric(vertical: 16.0),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- AppText(
- "${TranslationBase.of(context).respiration}",
- fontSize: SizeConfig.textMultiplier * 2.5,
- color: Colors.black,
- fontWeight: isExpand ? FontWeight.bold : FontWeight.normal,
- ),
- InkWell(
- onTap: () {
- setState(() {
- isExpand = !isExpand;
- });
- },
- child: Icon(isExpand ? Icons.remove : Icons.add),
- ),
- ],
- ),
- ),
- bodyWidget: Container(
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).respBeats}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.respirationBeatPerMinute}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).patternOfRespiration}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.respirationPattern}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- ],
- ),
- ),
- isExpand: isExpand,
- ),
- );
- }
-}
-
-class BloodPressureWidget extends StatefulWidget {
- final VitalSignData vitalSign;
-
- BloodPressureWidget(this.vitalSign);
-
- @override
- _BloodPressureWidgetState createState() => _BloodPressureWidgetState();
-}
-
-class _BloodPressureWidgetState extends State {
- bool isExpand = false;
-
- @override
- Widget build(BuildContext context) {
- return Container(
- child: HeaderBodyExpandableNotifier(
- headerWidget: Container(
- margin: EdgeInsets.symmetric(vertical: 16.0),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- AppText(
- "${TranslationBase.of(context).bloodPressure}",
- fontSize: SizeConfig.textMultiplier * 2.5,
- color: Colors.black,
- fontWeight: isExpand ? FontWeight.bold : FontWeight.normal,
- ),
- InkWell(
- onTap: () {
- setState(() {
- isExpand = !isExpand;
- });
- },
- child: Icon(isExpand ? Icons.remove : Icons.add),
- ),
- ],
- ),
- ),
- bodyWidget: Container(
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).bloodPressureDiastoleAndSystole}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.bloodPressureHigher}, ${widget.vitalSign.bloodPressureLower}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).cuffLocation}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.bloodPressureCuffLocation}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- ],
- ),
- SizedBox(
- height: 4,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Expanded(
- child: AppText(
- "${TranslationBase.of(context).patientPosition}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- ),
- SizedBox(
- width: 8,
- ),
- Expanded(
- child: AppText(
- "${widget.vitalSign.bloodPressurePatientPosition}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ),
- ],
- ),
- ),
- Expanded(
- child: Row(
- children: [
- AppText(
- "${TranslationBase.of(context).cuffSize}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${widget.vitalSign.bloodPressureCuffSize}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ),
- ],
- ),
- ],
- ),
- ),
- isExpand: isExpand,
- ),
- );
- }
-}
-
-class OxygenationWidget extends StatefulWidget {
- final VitalSignData vitalSign;
-
- OxygenationWidget(this.vitalSign);
-
- @override
- _OxygenationWidgetState createState() => _OxygenationWidgetState();
-}
-
-class _OxygenationWidgetState extends State {
- bool isExpand = false;
-
- @override
- Widget build(BuildContext context) {
- return Container(
- child: HeaderBodyExpandableNotifier(
- headerWidget: Container(
- margin: EdgeInsets.symmetric(vertical: 16.0),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- AppText(
- "${TranslationBase.of(context).oxygenation}",
- fontSize: SizeConfig.textMultiplier * 2.5,
- color: Colors.black,
- fontWeight: isExpand ? FontWeight.bold : FontWeight.normal,
- ),
- InkWell(
- onTap: () {
- setState(() {
- isExpand = !isExpand;
- });
- },
- child: Icon(isExpand ? Icons.remove : Icons.add),
- ),
- ],
- ),
- ),
- bodyWidget: Container(
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).sao2}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${widget.vitalSign.sao2}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- Row(
- children: [
- AppText(
- "${TranslationBase.of(context).fio2}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${widget.vitalSign.fio2}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ],
- ),
- ],
- ),
- ),
- isExpand: isExpand,
- ),
- );
- }
-}
-
-class PainScaleWidget extends StatefulWidget {
- final VitalSignData vitalSign;
-
- PainScaleWidget(this.vitalSign);
-
- @override
- _PainScaleWidgetState createState() => _PainScaleWidgetState();
-}
-
-class _PainScaleWidgetState extends State {
- bool isExpand = false;
-
- @override
- Widget build(BuildContext context) {
- return Container(
- child: HeaderBodyExpandableNotifier(
- headerWidget: Container(
- margin: EdgeInsets.symmetric(vertical: 16.0),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- AppText(
- "${TranslationBase.of(context).painScale}",
- fontSize: SizeConfig.textMultiplier * 2.5,
- color: Colors.black,
- fontWeight: isExpand ? FontWeight.bold : FontWeight.normal,
- ),
- InkWell(
- onTap: () {
- setState(() {
- isExpand = !isExpand;
- });
- },
- child: Icon(isExpand ? Icons.remove : Icons.add),
- ),
- ],
- ),
- ),
- bodyWidget: Container(
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Expanded(
- child: Row(
- children: [
- AppText(
- "${TranslationBase.of(context).painScale}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${widget.vitalSign.painScore}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ),
- Expanded(
- child: Row(
- children: [
- AppText(
- "${TranslationBase.of(context).painManagement}",
- fontSize: SizeConfig.textMultiplier * 1.8,
- color: Colors.black,
- fontWeight: FontWeight.w700,
- ),
- SizedBox(
- width: 8,
- ),
- AppText(
- "${widget.vitalSign.isPainManagementDone}",
- fontSize: SizeConfig.textMultiplier * 2,
- color: Colors.grey.shade800,
- fontWeight: FontWeight.normal,
- ),
- ],
- ),
- ),
- ],
- ),
- ],
- ),
- ),
- isExpand: isExpand,
- ),
- );
- }
-}
diff --git a/lib/screens/patients/profile/vital_sign/vital_sign_details_screen.dart b/lib/screens/patients/profile/vital_sign/vital_sign_details_screen.dart
index 37a7a60f..23266095 100644
--- a/lib/screens/patients/profile/vital_sign/vital_sign_details_screen.dart
+++ b/lib/screens/patients/profile/vital_sign/vital_sign_details_screen.dart
@@ -6,7 +6,7 @@ import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/patients/profile/vital_sign/vital_sign_item.dart';
import 'package:doctor_app_flutter/screens/patients/profile/vital_sign/vital_sign_item_details_screen.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/error_message.dart';
@@ -40,8 +40,8 @@ class VitalSignDetailsScreen extends StatelessWidget {
baseViewModel: mode,
isShowAppBar: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patientType, arrivalType),
+ appBar: PatientProfileAppBar(
+ patient),
appBarTitle: TranslationBase.of(context).vitalSign,
body: mode.patientVitalSignsHistory.length > 0
? Column(
diff --git a/lib/screens/patients/profile/vital_sign/vital_sign_item_details_screen.dart b/lib/screens/patients/profile/vital_sign/vital_sign_item_details_screen.dart
index 49f82c2f..0ed9da56 100644
--- a/lib/screens/patients/profile/vital_sign/vital_sign_item_details_screen.dart
+++ b/lib/screens/patients/profile/vital_sign/vital_sign_item_details_screen.dart
@@ -7,7 +7,7 @@ import 'package:doctor_app_flutter/screens/patients/profile/vital_sign/vital_sig
import 'package:doctor_app_flutter/screens/patients/profile/vital_sign/vital_sing_chart_and_detials.dart';
import 'package:doctor_app_flutter/screens/patients/profile/vital_sign/vital_sing_chart_blood_pressure.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:flutter/material.dart';
@@ -190,8 +190,8 @@ class VitalSignItemDetailsScreen extends StatelessWidget {
appBarTitle: pageTitle,
backgroundColor: Color.fromRGBO(248, 248, 248, 1),
isShowAppBar: true,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patientType, arrivalType),
+ appBar: PatientProfileAppBar(
+ patient,),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
diff --git a/lib/screens/prescription/prescription_item_in_patient_page.dart b/lib/screens/prescription/prescription_item_in_patient_page.dart
index b6d27af6..7cf33935 100644
--- a/lib/screens/prescription/prescription_item_in_patient_page.dart
+++ b/lib/screens/prescription/prescription_item_in_patient_page.dart
@@ -5,7 +5,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:flutter/cupertino.dart';
@@ -44,8 +44,8 @@ class PrescriptionItemsInPatientPage extends StatelessWidget {
isShowAppBar: true,
backgroundColor: Colors.grey[100],
baseViewModel: model,
- appBar: PatientProfileHeaderNewDesignAppBar(
- patient, patient.patientType.toString(), patient.arrivedOn),
+ appBar: PatientProfileAppBar(
+ patient),
body: SingleChildScrollView(
child: Container(
child: Column(
diff --git a/lib/screens/prescription/prescription_items_page.dart b/lib/screens/prescription/prescription_items_page.dart
index a68f6f56..b97343c4 100644
--- a/lib/screens/prescription/prescription_items_page.dart
+++ b/lib/screens/prescription/prescription_items_page.dart
@@ -4,7 +4,7 @@ import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/date-utils.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient_profile_header_with_appointment_card_app_bar.dart';
+import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/ShowImageDialog.dart';
@@ -28,16 +28,15 @@ class PrescriptionItemsPage extends StatelessWidget {
isShowAppBar: true,
backgroundColor: Colors.grey[100],
baseViewModel: model,
- appBar: PatientProfileHeaderWhitAppointmentAppBar(
- patient: patient,
- patientType: patientType??"0",
- arrivalType: arrivalType??"0",
+ appBar: PatientProfileAppBar(
+ patient,
clinic: prescriptions.clinicDescription,
branch: prescriptions.name,
isPrescriptions: true,
appointmentDate: AppDateUtils.getDateTimeFromServerFormat(prescriptions.appointmentDate),
doctorName: prescriptions.doctorName,
profileUrl: prescriptions.doctorImageURL,
+ isAppointmentHeader: true,
),
body: SingleChildScrollView(
child: Container(
diff --git a/lib/screens/prescription/prescription_screen.dart b/lib/screens/prescription/prescription_screen.dart
deleted file mode 100644
index d5a94c61..00000000
--- a/lib/screens/prescription/prescription_screen.dart
+++ /dev/null
@@ -1,591 +0,0 @@
-import 'package:doctor_app_flutter/core/viewModel/prescription_view_model.dart';
-import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
-import 'package:doctor_app_flutter/screens/base/base_view.dart';
-import 'package:doctor_app_flutter/screens/prescription/add_prescription_form.dart';
-import 'package:doctor_app_flutter/screens/prescription/update_prescription_form.dart';
-import 'package:doctor_app_flutter/util/date-utils.dart';
-import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
-import 'package:doctor_app_flutter/widgets/patients/profile/patient-page-header-widget.dart';
-import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
-import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
-import 'package:doctor_app_flutter/widgets/shared/network_base_view.dart';
-import 'package:flutter/material.dart';
-
-class NewPrescriptionScreen extends StatefulWidget {
- @override
- _NewPrescriptionScreenState createState() => _NewPrescriptionScreenState();
-}
-
-class _NewPrescriptionScreenState extends State