Merge branch 'development' into video-stream-background

# Conflicts:
#	android/app/src/main/kotlin/com/hmg/hmgDr/MainActivity.kt
#	android/app/src/main/kotlin/com/hmg/hmgDr/ui/fragment/VideoCallFragment.kt
#	lib/core/service/VideoCallService.dart
#	lib/screens/patients/profile/profile_screen/patient_profile_screen.dart
merge-requests/759/head
mosazaid 3 years ago
commit eb62fdfe21

@ -64,16 +64,18 @@ class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler,
val generalId = call.argument<String>("generalId")
val doctorId = call.argument<Int>("DoctorId")
val patientName = call.argument<String>("patientName")
val isRecording = call.argument<Boolean>("isRecording")
val sessionStatusModel =
GetSessionStatusModel(VC_ID, tokenID, generalId, doctorId, patientName)
GetSessionStatusModel(VC_ID, tokenID, generalId, doctorId, patientName, isRecording!!)
openVideoCall(apiKey, sessionId, token, appLang, baseUrl, sessionStatusModel)
}
"closeVideoCall" -> {
videoStreamService?.closeVideoCall()
dialogFragment?.onCallClicked()
// videoStreamService?.closeVideoCall()
}
"onCallConnected" -> {
@ -84,32 +86,62 @@ class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler,
}
}
private fun openVideoCall(
apiKey: String?,
sessionId: String?,
token: String?,
appLang: String?,
baseUrl: String?,
sessionStatusModel: GetSessionStatusModel
) {
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)
// showSoftKeyBoard(null)
// start service
serviceIntent = Intent(this@MainActivity, VideoStreamContainerService::class.java)
serviceIntent?.run {
putExtras(arguments)
startService(this)
private fun openVideoCall(apiKey: String?, sessionId: String?, token: String?, appLang: String?, baseUrl: String?, sessionStatusModel: GetSessionStatusModel) {
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")
}
}
} else if (!dialogFragment!!.isVisible) {
val transaction = supportFragmentManager.beginTransaction()
dialogFragment!!.show(transaction, "dialog")
}
// bindService()
}
// private fun openVideoCall(
// apiKey: String?,
// sessionId: String?,
// token: String?,
// appLang: String?,
// baseUrl: String?,
// sessionStatusModel: GetSessionStatusModel
// ) {
//
// 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)
//
//// showSoftKeyBoard(null)
// // start service
// serviceIntent = Intent(this@MainActivity, VideoStreamContainerService::class.java)
// serviceIntent?.run {
// putExtras(arguments)
// startService(this)
// }
//// bindService()
// }
/* override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
var asd = "";
@ -137,6 +169,7 @@ class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler,
}*/
override fun onCallFinished(resultCode: Int, intent: Intent?) {
dialogFragment = null
if (resultCode == Activity.RESULT_OK) {
val result: SessionStatusModel? = intent?.getParcelableExtra("sessionStatusNotRespond")
@ -169,6 +202,11 @@ class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler,
// videoStreamService!!.serviceRunning = false
}
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)

@ -23,16 +23,20 @@ public class GetSessionStatusModel implements Parcelable {
@SerializedName("PatientName")
@Expose
private String patientName;
@SerializedName("isRecording")
@Expose
private boolean isRecording;
public GetSessionStatusModel() {
}
public GetSessionStatusModel(Integer vCID, String tokenID, String generalid, Integer doctorId, String patientName) {
public GetSessionStatusModel(Integer vCID, String tokenID, String generalid, Integer doctorId, String patientName, boolean isRecording) {
this.vCID = vCID;
this.tokenID = tokenID;
this.generalid = generalid;
this.doctorId = doctorId;
this.patientName = patientName;
this.isRecording = isRecording;
}
protected GetSessionStatusModel(Parcel in) {
@ -49,6 +53,7 @@ public class GetSessionStatusModel implements Parcelable {
doctorId = in.readInt();
}
patientName = in.readString();
isRecording = in.readInt() == 1;
}
public static final Creator<GetSessionStatusModel> CREATOR = new Creator<GetSessionStatusModel>() {
@ -105,6 +110,14 @@ public class GetSessionStatusModel implements Parcelable {
this.patientName = patientName;
}
public boolean isRecording() {
return isRecording;
}
public void setRecording(boolean recording) {
isRecording = recording;
}
@Override
public int describeContents() {
return 0;
@ -127,5 +140,6 @@ public class GetSessionStatusModel implements Parcelable {
dest.writeInt(doctorId);
}
dest.writeString(patientName);
dest.writeInt(isRecording ? 1 : 0);
}
}

@ -66,6 +66,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
private var mVolRunnable: Runnable? = null
private var mConnectedRunnable: Runnable? = null
private lateinit var recordContainer: FrameLayout
private lateinit var thumbnail_container: FrameLayout
private lateinit var activity_clingo_video_call: RelativeLayout
private lateinit var mPublisherViewContainer: FrameLayout
@ -79,6 +80,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
private var token: String? = null
private var appLang: String? = null
private var baseUrl: String? = null
private var isRecording: Boolean = true
private var isSwitchCameraClicked = false
private var isCameraClicked = false
@ -201,7 +203,9 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
this.videoCallResponseListener = videoCallResponseListener
}
private fun onCreateView(inflater: LayoutInflater, container: ViewGroup?): View {
private fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?
): View {
val view = inflater.inflate(R.layout.activity_video_call, container, false)
// val parentViewLayoutParam: ConstraintLayout.LayoutParams = ConstraintLayout.LayoutParams(
@ -217,6 +221,8 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
appLang = getString("appLang")
baseUrl = getString("baseUrl")
sessionStatusModel = getParcelable("sessionStatusModel")
if (sessionStatusModel != null)
isRecording = sessionStatusModel!!.isRecording
}
initUI(view)
requestPermissions()
@ -269,6 +275,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
layoutName = view.findViewById(R.id.layout_name)
layoutMini = view.findViewById(R.id.layout_mini)
icMini = view.findViewById(R.id.ic_mini)
recordContainer = view.findViewById(R.id.record_container)
activity_clingo_video_call = view.findViewById(R.id.activity_clingo_video_call)
thumbnail_container = view.findViewById(R.id.thumbnail_container)
@ -280,6 +287,12 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
patientName = view.findViewById<TextView>(R.id.patient_name)
patientName.text = sessionStatusModel!!.patientName
if (isRecording) {
recordContainer.visibility = View.VISIBLE
} else {
recordContainer.visibility = View.GONE
}
cmTimer = view.findViewById(R.id.cmTimer)
cmTimer.format = "mm:ss"
cmTimer.onChronometerTickListener =
@ -657,6 +670,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
400,
600
)
} else {
dialog?.window?.setLayout(
300,
@ -665,6 +679,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
}
isCircle = !isCircle
if (mSubscriber != null) {
(mSubscriber!!.renderer as DynamicVideoRenderer).enableThumbnailCircle(isCircle)
} else {
@ -706,11 +721,17 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
400,
600
)
recordContainer.visibility = View.GONE
} else {
dialog?.window?.setLayout(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT
)
if (isRecording) {
recordContainer.visibility = View.VISIBLE
} else {
recordContainer.visibility = View.GONE
}
}
isFullScreen = !isFullScreen
@ -868,7 +889,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} else {
if (isCircle) {
screenWidth = 300F
screenWidth = 300F
screenHeight = 300F
layoutNameParam.height = 0
@ -883,7 +904,12 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
controlPanelParam.height = panelHeightSmall
}
controlPanel.setPadding(panelPaddingMedium, panelPaddingMedium, panelPaddingMedium, panelPaddingMedium)
controlPanel.setPadding(
panelPaddingMedium,
panelPaddingMedium,
panelPaddingMedium,
panelPaddingMedium
)
}
layoutName.layoutParams = layoutNameParam
@ -893,7 +919,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
var videoStreamHeight =
screenHeight - controlPanelParam.height - layoutNameParam.height - layoutMiniParam.height
if (isFullScreen){
if (isFullScreen) {
// videoStreamHeight -= getStatusBarHeight() / 2
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@ -109,6 +109,23 @@
android:src="@drawable/video_off_fill" />
</FrameLayout>
<FrameLayout
android:id="@+id/record_container"
android:layout_width="@dimen/local_preview_width"
android:layout_height="@dimen/local_preview_height"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:visibility="visible">
<ImageView
android:id="@+id/record_icon"
android:layout_width="@dimen/local_back_icon_size"
android:layout_height="@dimen/local_back_icon_size"
android:layout_gravity="center"
android:scaleType="centerCrop"
android:src="@drawable/ic_record" />
</FrameLayout>
<FrameLayout
android:id="@+id/thumbnail_container"
android:layout_width="90dp"

@ -23,19 +23,20 @@ class VideoCallService extends BaseService {
locator<LiveCarePatientServices>();
openVideo(StartCallRes startModel, PatiantInformtion patientModel,
VoidCallback onCallConnected, VoidCallback onCallDisconnected) async {
bool isRecording,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',
kToken: startCallRes.openTokenID,
kSessionId: startCallRes.openSessionID,
kApiKey:'46209962',
// kToken: "T1==cGFydG5lcl9pZD00NzI0Nzk1NCZzaWc9NGIyZDljOTY3YjFiNWU1YzUzNzFmMjIyNjJmNmEzY2Y5NzZjOTdlYzpzZXNzaW9uX2lkPTFfTVg0ME56STBOemsxTkg1LU1UWXlNekEyTlRRMU9EVXhObjVrVFRoMFlVdFJXaXRYTWpadFZGZHFhSGxZVGpOdE1UVi1mZyZjcmVhdGVfdGltZT0xNjIzMDY1NDk1Jm5vbmNlPTAuMjM2Mjk0NTIwMTkyOTA4OTcmcm9sZT1wdWJsaXNoZXImZXhwaXJlX3RpbWU9MTYyNTY1NzQ5NCZpbml0aWFsX2xheW91dF9jbGFzc19saXN0PQ==",
// kSessionId: "1_MX40NzI0Nzk1NH5-MTYyMzA2NTQ1ODUxNn5kTTh0YUtRWitXMjZtVFdqaHlYTjNtMTV-fg",
// kApiKey:'47247954',
vcId: patient.vcId,
isRecording: isRecording,
patientName: patient.fullName ??
(patient.firstName != null
? "${patient.firstName} ${patient.lastName}"
@ -47,6 +48,7 @@ class VideoCallService extends BaseService {
DrAppToastMsg.showErrorToast(error);
},
onCallConnected: onCallConnected,
onCallDisconnected: onCallDisconnected,
onCallEnd: () {
WidgetsBinding.instance.addPostFrameCallback((_) async {
GifLoaderDialogUtils.showMyDialog(

@ -41,9 +41,33 @@ class LiveCarePatientServices extends BaseService {
await baseAppClient.post(
GET_PENDING_PATIENT_ER_FOR_DOCTOR_APP,
onSuccess: (dynamic response, int statusCode) {
_patientList.clear();
List<PatiantInformtion> localPatientList= [];
response['List_PendingPatientList'].forEach((v) {
_patientList.add(PatiantInformtion.fromJson(v));
localPatientList.add(PatiantInformtion.fromJson(v));
});
/// add new items.
localPatientList.forEach((element) {
if ((_patientList.singleWhere((it) => it.patientId == element.patientId,
orElse: () => null)) == null) {
_patientList.add(element);
}
});
/// remove items.
List<PatiantInformtion> removedPatientList= [];
_patientList.forEach((element) {
if ((localPatientList.singleWhere((it) => it.patientId == element.patientId,
orElse: () => null)) == null) {
removedPatientList.add(element);
}
});
removedPatientList.forEach((element) {
_patientList.remove(element);
});
},
onFailure: (String error, int statusCode) {

@ -238,4 +238,18 @@ class LiveCarePatientViewModel extends BaseViewModel {
AlternativeService(serviceID: 11, serviceName: "GASTRIC TUBE CHANGE"),
);
}
updateInCallPatient({PatiantInformtion patient, appointmentNo}){
_liveCarePatientServices.patientList.forEach((e) {
if(e.patientId == patient.patientId) {
e.episodeNo = 0 ;
e.appointmentNo = appointmentNo;
return;
}
});
setState(ViewState.Idle);
}
}

@ -5,6 +5,7 @@ class StartCallRes {
bool isAuthenticated;
int messageStatus;
String appointmentNo;
bool isRecording;
StartCallRes(
{this.result,
@ -12,7 +13,9 @@ class StartCallRes {
this.openTokenID,
this.isAuthenticated,
this.appointmentNo,
this.messageStatus});
this.messageStatus,
this.isRecording = true,
});
StartCallRes.fromJson(Map<String, dynamic> json) {
result = json['Result'];
@ -21,6 +24,7 @@ class StartCallRes {
isAuthenticated = json['IsAuthenticated'];
messageStatus = json['MessageStatus'];
appointmentNo = json['AppointmentNo'];
isRecording = json['isRecording'];
}
Map<String, dynamic> toJson() {
@ -31,6 +35,7 @@ class StartCallRes {
data['IsAuthenticated'] = this.isAuthenticated;
data['MessageStatus'] = this.messageStatus;
data['AppointmentNo'] = this.appointmentNo;
data['isRecording'] = this.isRecording;
return data;
}
}

@ -1,9 +1,9 @@
// TODO : it have to be changed.
// TODO = it have to be changed.
import 'package:doctor_app_flutter/util/date-utils.dart';
class PatiantInformtion {
final PatiantInformtion patientDetails;
PatiantInformtion patientDetails;
int genderInt;
dynamic age;
String appointmentDate;
@ -79,178 +79,268 @@ class PatiantInformtion {
int vcId;
String voipToken;
PatiantInformtion(
{this.patientDetails,
this.projectId,
this.clinicId,
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.nationalityId,
this.mobileNumber,
this.emailAddress,
this.patientIdentificationNo,
this.patientType,
this.admissionNo,
this.admissionDate,
this.createdOn,
this.roomId,
this.bedId,
this.nursingStationId,
this.description,
this.clinicDescription,
this.clinicDescriptionN,
this.nationalityName,
this.nationalityNameN,
this.age,
this.genderDescription,
this.nursingStationName,
this.appointmentDate,
this.startTime,
this.appointmentNo,
this.arrivalTime,
this.arrivalTimeD,
this.callStatus,
this.callStatusDisc,
this.callTypeID,
this.clientRequestID,
this.clinicName,
this.consoltationEnd,
this.consultationNotes,
this.appointmentType,
this.appointmentTypeId,
this.arrivedOn,
this.clinicGroupId,
this.companyName,
this.dischargeStatus,
this.doctorDetails,
this.endTime,
this.episodeNo,
this.fallRiskScore,
this.genderInt,
this.isSigned,
this.medicationOrders,
this.nationality,
this.patientMRN,
this.visitType,
this.fullName,
this.fullNameN,
this.nationalityFlagURL,
this.patientStatusType,
this.patientStatus,
this.visitTypeId,
this.startTimes,
this.dischargeDate,
this.status,
this.vcId,
this.voipToken,
this.admissionDateWithDateTimeForm,
PatiantInformtion({this.patientDetails,
this.projectId,
this.clinicId,
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.nationalityId,
this.mobileNumber,
this.emailAddress,
this.patientIdentificationNo,
this.patientType,
this.admissionNo,
this.admissionDate,
this.createdOn,
this.roomId,
this.bedId,
this.nursingStationId,
this.description,
this.clinicDescription,
this.clinicDescriptionN,
this.nationalityName,
this.nationalityNameN,
this.age,
this.genderDescription,
this.nursingStationName,
this.appointmentDate,
this.startTime,
this.appointmentNo,
this.arrivalTime,
this.arrivalTimeD,
this.callStatus,
this.callStatusDisc,
this.callTypeID,
this.clientRequestID,
this.clinicName,
this.consoltationEnd,
this.consultationNotes,
this.appointmentType,
this.appointmentTypeId,
this.arrivedOn,
this.clinicGroupId,
this.companyName,
this.dischargeStatus,
this.doctorDetails,
this.endTime,
this.episodeNo,
this.fallRiskScore,
this.genderInt,
this.isSigned,
this.medicationOrders,
this.nationality,
this.patientMRN,
this.visitType,
this.fullName,
this.fullNameN,
this.nationalityFlagURL,
this.patientStatusType,
this.patientStatus,
this.visitTypeId,
this.startTimes,
this.dischargeDate,
this.status,
this.vcId,
this.voipToken,
this.admissionDateWithDateTimeForm,
this.appointmentDateWithDateTimeForm});
factory PatiantInformtion.fromJson(Map<String, dynamic> json) => PatiantInformtion(
patientDetails: json['patientDetails'] != null ? new PatiantInformtion.fromJson(json['patientDetails']) : null,
projectId: json["ProjectID"] ?? json["projectID"],
clinicId: json["ClinicID"] ?? json["clinicID"],
doctorId: json["DoctorID"] ?? json["doctorID"],
patientId: json["PatientID"] != null
PatiantInformtion.fromJson(Map<String, dynamic> json) {
{
patientDetails = json['patientDetails'] != null
? new PatiantInformtion.fromJson(json['patientDetails'])
: null;
projectId = json["ProjectID"] ?? json["projectID"];
clinicId = json["ClinicID"] ?? json["clinicID"];
doctorId = json["DoctorID"] ?? json["doctorID"];
patientId = json["PatientID"] != null
? json["PatientID"] is String
? int.parse(json["PatientID"])
: json["PatientID"]
: json["patientID"] ?? json['patientMRN'] ?? json['PatientMRN'],
doctorName: json["DoctorName"] ?? json["doctorName"],
doctorNameN: json["DoctorNameN"] ?? json["doctorNameN"],
firstName: json["FirstName"] ?? json["firstName"],
middleName: json["MiddleName"] ?? json["middleName"],
lastName: json["LastName"] ?? json["lastName"],
firstNameN: json["FirstNameN"] ?? json["firstNameN"],
middleNameN: json["MiddleNameN"] ?? json["middleNameN"],
lastNameN: json["LastNameN"] ?? json["lastNameN"],
gender: json["Gender"] != null
? int.parse(json["PatientID"])
: json["PatientID"]
: json["patientID"] ?? json['patientMRN'] ?? json['PatientMRN'];
doctorName = json["DoctorName"] ?? json["doctorName"];
doctorNameN = json["DoctorNameN"] ?? json["doctorNameN"];
firstName = json["FirstName"] ?? json["firstName"];
middleName = json["MiddleName"] ?? json["middleName"];
lastName = json["LastName"] ?? json["lastName"];
firstNameN = json["FirstNameN"] ?? json["firstNameN"];
middleNameN = json["MiddleNameN"] ?? json["middleNameN"];
lastNameN = json["LastNameN"] ?? json["lastNameN"];
gender = json["Gender"] != null
? json["Gender"] is String
? int.parse(json["Gender"])
: json["Gender"]
: json["gender"],
fullName: json["fullName"] ?? json["fullName"] ?? json["PatientName"],
fullNameN: json["fullNameN"] ?? json["fullNameN"] ?? json["PatientName"],
dateofBirth: json["DateofBirth"] ?? json["dob"] ?? json['DateOfBirth'],
nationalityId: json["NationalityID"] ?? json["nationalityID"],
mobileNumber: json["MobileNumber"] ?? json["mobileNumber"],
emailAddress: json["EmailAddress"] ?? json["emailAddress"],
patientIdentificationNo: json["PatientIdentificationNo"] ?? json["patientIdentificationNo"],
? int.parse(json["Gender"])
: json["Gender"]
: json["gender"];
fullName = json["fullName"] ?? json["fullName"] ?? json["PatientName"];
fullNameN =
json["fullNameN"] ?? json["fullNameN"] ?? json["PatientName"];
dateofBirth = json["DateofBirth"] ?? json["dob"] ?? json['DateOfBirth'];
nationalityId = json["NationalityID"] ?? json["nationalityID"];
mobileNumber = json["MobileNumber"] ?? json["mobileNumber"];
emailAddress = json["EmailAddress"] ?? json["emailAddress"];
patientIdentificationNo =
json["PatientIdentificationNo"] ?? json["patientIdentificationNo"];
//TODO make 7 dynamic when the backend retrun it in patient arrival
patientType: json["PatientType"] ?? json["patientType"] ?? 1,
admissionNo: json["AdmissionNo"] ?? json["admissionNo"],
admissionDate: json["AdmissionDate"] ?? json["admissionDate"],
createdOn: json["CreatedOn"] ?? json["CreatedOn"],
roomId: json["RoomID"] ?? json["roomID"],
bedId: json["BedID"] ?? json["bedID"],
nursingStationId: json["NursingStationID"] ?? json["nursingStationID"],
description: json["Description"] ?? json["description"],
clinicDescription: json["ClinicDescription"] ?? json["clinicDescription"],
clinicDescriptionN: json["ClinicDescriptionN"] ?? json["clinicDescriptionN"],
nationalityName: json["NationalityName"] ?? json["nationalityName"] ?? json['NationalityName'],
nationalityNameN: json["NationalityNameN"] ?? json["nationalityNameN"] ?? json['NationalityNameN'],
age: json["Age"] ?? json["age"],
genderDescription: json["GenderDescription"],
nursingStationName: json["NursingStationName"],
appointmentDate: json["AppointmentDate"] ?? '',
startTime: json["startTime"] ?? json['StartTime'],
appointmentNo: json['appointmentNo'] ?? json['AppointmentNo'],
appointmentType: json['appointmentType'],
appointmentTypeId: json['appointmentTypeId'] ?? json['appointmentTypeid'],
arrivedOn: json['ArrivedOn'] ?? json['arrivedOn'] ?? json['ArrivedOn'],
clinicGroupId: json['clinicGroupId'],
companyName: json['companyName'],
dischargeStatus: json['dischargeStatus'],
doctorDetails: json['doctorDetails'],
endTime: json['endTime'],
episodeNo: json['episodeNo'] ?? json['EpisodeID'] ?? json['EpisodeNo'],
fallRiskScore: json['fallRiskScore'],
isSigned: json['isSigned'],
medicationOrders: json['medicationOrders'],
nationality: json['nationality'] ?? json['NationalityNameN'],
patientMRN: json['patientMRN'] ??
patientType = json["PatientType"] ?? json["patientType"] ?? 1;
admissionNo = json["AdmissionNo"] ?? json["admissionNo"];
admissionDate = json["AdmissionDate"] ?? json["admissionDate"];
createdOn = json["CreatedOn"] ?? json["CreatedOn"];
roomId = json["RoomID"] ?? json["roomID"];
bedId = json["BedID"] ?? json["bedID"];
nursingStationId = json["NursingStationID"] ?? json["nursingStationID"];
description = json["Description"] ?? json["description"];
clinicDescription =
json["ClinicDescription"] ?? json["clinicDescription"];
clinicDescriptionN =
json["ClinicDescriptionN"] ?? json["clinicDescriptionN"];
nationalityName = json["NationalityName"] ??
json["nationalityName"] ??
json['NationalityName'];
nationalityNameN = json["NationalityNameN"] ??
json["nationalityNameN"] ??
json['NationalityNameN'];
age = json["Age"] ?? json["age"];
genderDescription = json["GenderDescription"];
nursingStationName = json["NursingStationName"];
appointmentDate = json["AppointmentDate"] ?? '';
startTime = json["startTime"] ?? json['StartTime'];
appointmentNo = json['appointmentNo'] ?? json['AppointmentNo'];
appointmentType = json['appointmentType'];
appointmentTypeId =
json['appointmentTypeId'] ?? json['appointmentTypeid'];
arrivedOn = json['ArrivedOn'] ?? json['arrivedOn'] ?? json['ArrivedOn'];
clinicGroupId = json['clinicGroupId'];
companyName = json['companyName'];
dischargeStatus = json['dischargeStatus'];
doctorDetails = json['doctorDetails'];
endTime = json['endTime'];
episodeNo = json['episodeNo'] ?? json['EpisodeID'] ?? json['EpisodeNo'];
fallRiskScore = json['fallRiskScore'];
isSigned = json['isSigned'];
medicationOrders = json['medicationOrders'];
nationality = json['nationality'] ?? json['NationalityNameN'];
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'],
patientStatusType: json['patientStatusType'] ?? json['PatientStatusType'],
visitTypeId: json['visitTypeId'] ?? json['visitTypeId'] ?? json['visitTypeid'],
startTimes: json['StartTime'] ?? json['StartTime'],
dischargeDate: json['DischargeDate'],
status: json['Status'],
vcId: json['VC_ID'],
arrivalTime: json['ArrivalTime'],
arrivalTimeD: json['ArrivalTimeD'],
callStatus: json['CallStatus'],
callStatusDisc: json['CallStatusDisc'],
callTypeID: json['CallTypeID'],
clientRequestID: json['ClientRequestID'],
clinicName: json['ClinicName'],
consoltationEnd: json['ConsoltationEnd'],
consultationNotes: json['ConsultationNotes'],
patientStatus: json['PatientStatus'],
voipToken: json['VoipToken'],
admissionDateWithDateTimeForm: json["AdmissionDate"] != null
: 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'];
patientStatusType =
json['patientStatusType'] ?? json['PatientStatusType'];
visitTypeId =
json['visitTypeId'] ?? json['visitTypeId'] ?? json['visitTypeid'];
startTimes = json['StartTime'] ?? json['StartTime'];
dischargeDate = json['DischargeDate'];
status = json['Status'];
vcId = json['VC_ID'];
arrivalTime = json['ArrivalTime'];
arrivalTimeD = json['ArrivalTimeD'];
callStatus = json['CallStatus'];
callStatusDisc = json['CallStatusDisc'];
callTypeID = json['CallTypeID'];
clientRequestID = json['ClientRequestID'];
clinicName = json['ClinicName'];
consoltationEnd = json['ConsoltationEnd'];
consultationNotes = json['ConsultationNotes'];
patientStatus = json['PatientStatus'];
voipToken = json['VoipToken'];
admissionDateWithDateTimeForm = json["AdmissionDate"] != null
? AppDateUtils.convertStringToDate(json["AdmissionDate"])
: json["admissionDate"] != null
? AppDateUtils.convertStringToDate(json["admissionDate"])
: null,
appointmentDateWithDateTimeForm:
json["AppointmentDate"] != null ? AppDateUtils.convertStringToDate(json["AppointmentDate"]) : null);
}
: json["admissionDate"] != null ? AppDateUtils.convertStringToDate(
json["admissionDate"]) : null;
appointmentDateWithDateTimeForm =
json["AppointmentDate"] != null ? AppDateUtils.convertStringToDate(
json["AppointmentDate"]) : null;
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['patientDetails'] = this.patientDetails;
data["ProjectID"] = this.projectId;
data["projectID"] = this.projectId;
data["ClinicID"] = this.clinicId;
data["clinicID"] = this.clinicId;
data["DoctorID"] = this.doctorId;
data["doctorID"] = this.doctorId;
data["PatientID"] = this.patientId;
data["patientID"] = this.patientId;
data['patientMRN'] = this.patientMRN;
data['PatientMRN'] = this.patientMRN;
data['episodeNo'] = this.episodeNo;
data['EpisodeID'] = this.episodeNo;
data['EpisodeNo'] = this.episodeNo;
data["DoctorName"] = this.doctorName;
data["doctorName"] = this.doctorName;
data["DoctorNameN"] = this.doctorNameN;
data["doctorNameN"] = this.doctorNameN;
data["FirstName"] = this.firstName;
data["firstName"] = this.firstName;
data["MiddleName"] = this.middleName;
data["middleName"] = this.middleName;
data["LastName"] = this.lastName;
data["lastName"] = this.lastName;
data["FirstNameN"] = this.firstNameN;
data["firstNameN"] = this.firstNameN;
data["MiddleNameN"] = this.middleNameN;
data["middleNameN"] = this.middleNameN;
data["LastNameN"] = this.lastNameN;
data["lastNameN"] = this.lastNameN;
data["fullName"] = this.fullName;
data["fullName"] = this.fullName;
data["PatientName"] = this.fullName;
data["Gender"] = this.gender;
data["gender"] = this.gender;
data['Age'] = this.age;
data['AppointmentDate'] = this.appointmentDate.isNotEmpty?this.appointmentDate:null;
data['AppointmentNo'] = this.appointmentNo;
data['ArrivalTime'] = this.arrivalTime;
data['ArrivalTimeD'] = this.arrivalTimeD;
data['CallStatus'] = this.callStatus;
data['CallStatusDisc'] = this.callStatusDisc;
data['CallTypeID'] = this.callTypeID;
data['ClientRequestID'] = this.clientRequestID;
data['ClinicName'] = this.clinicName;
data['ConsoltationEnd'] = this.consoltationEnd;
data['ConsultationNotes'] = this.consultationNotes;
data['CreatedOn'] = this.createdOn;
data['DoctorName'] = this.doctorName;
data['Gender'] = this.gender;
data['MobileNumber'] = this.mobileNumber;
data['PatientID'] = this.patientId;
data['PatientStatus'] = this.patientStatus;
data['ProjectID'] = this.projectId;
data['VC_ID'] = this.vcId;
data['VoipToken'] = this.voipToken;
data["DateofBirth"] = this.dateofBirth;
data["dob"] = this.dateofBirth;
data['DateOfBirth'] = this.dateofBirth;
return data;
}
}

@ -5,6 +5,7 @@ import 'package:doctor_app_flutter/core/viewModel/dashboard_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/models/doctor/doctor_profile_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/home/dashboard_slider-item-widget.dart';
import 'package:doctor_app_flutter/screens/home/dashboard_swipe_widget.dart';
@ -28,6 +29,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sticky_headers/sticky_headers/widget.dart';
import '../../routes.dart';
import '../../widgets/shared/app_texts_widget.dart';
class HomeScreen extends StatefulWidget {
@ -288,7 +290,8 @@ class _HomeScreenState extends State<HomeScreen> {
child: ListView(
scrollDirection: Axis.horizontal,
children: [
...homePatientsCardsWidget(model, projectsProvider),
...homePatientsCardsWidget(
model, projectsProvider),
])),
SizedBox(
height: 20,
@ -306,7 +309,8 @@ class _HomeScreenState extends State<HomeScreen> {
);
}
List<Widget> homePatientsCardsWidget(DashboardViewModel model,projectsProvider) {
List<Widget> homePatientsCardsWidget(
DashboardViewModel model, projectsProvider) {
colorIndex = 0;
List<Color> backgroundColors = List(3);
@ -334,6 +338,22 @@ class _HomeScreenState extends State<HomeScreen> {
text:
"${TranslationBase.of(context).liveCare}\n${TranslationBase.of(context).patients}",
onTap: () {
// PatiantInformtion patient = PatiantInformtion(
// patientStatusType: 43,
// episodeNo: 0,
// vcId: 42342,
// fullName: "mosa test",
// dateofBirth: "2000-05-01 10:42:35.790004"
// );
// Navigator.of(context).pushNamed(PATIENTS_PROFILE, arguments: {
// "patient": patient,
// "patientType": "0",
// "isSearch": false,
// "isInpatient": false,
// "arrivalType": "0",
// "isSearchAndOut": false,
// "isFromLiveCare": true,
// });
Navigator.push(
context,
FadePage(
@ -355,8 +375,10 @@ class _HomeScreenState extends State<HomeScreen> {
Navigator.push(
context,
FadePage(
page: PatientInPatientScreen(specialClinic: model.getSpecialClinic(clinicId??projectsProvider
.doctorClinicsList[0].clinicID),),
page: PatientInPatientScreen(
specialClinic: model.getSpecialClinic(
clinicId ?? projectsProvider.doctorClinicsList[0].clinicID),
),
),
);
},
@ -394,14 +416,12 @@ class _HomeScreenState extends State<HomeScreen> {
backgroundIconColor: backgroundIconColors[colorIndex],
cardIcon: DoctorApp.referral_1,
textColor: textColors[colorIndex],
text: TranslationBase.of(context)
.myPatientsReferral,
text: TranslationBase.of(context).myPatientsReferral,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
PatientReferralScreen(),
builder: (context) => PatientReferralScreen(),
),
);
},
@ -413,14 +433,12 @@ class _HomeScreenState extends State<HomeScreen> {
backgroundIconColor: backgroundIconColors[colorIndex],
cardIcon: DoctorApp.search,
textColor: textColors[colorIndex],
text: TranslationBase.of(context)
.searchPatientDashBoard,
text: TranslationBase.of(context).searchPatientDashBoard,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
PatientSearchScreen(),
builder: (context) => PatientSearchScreen(),
));
},
));
@ -431,14 +449,12 @@ class _HomeScreenState extends State<HomeScreen> {
backgroundIconColor: backgroundIconColors[colorIndex],
cardIcon: DoctorApp.search_medicines,
textColor: textColors[colorIndex],
text: TranslationBase.of(context)
.searchMedicineDashboard,
text: TranslationBase.of(context).searchMedicineDashboard,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
MedicineSearchScreen(),
builder: (context) => MedicineSearchScreen(),
));
},
));

@ -79,6 +79,7 @@ class _EndCallScreenState extends State<EndCallScreen> {
kSessionId: liveCareModel.startCallRes.openSessionID,
kApiKey: '46209962',
vcId: patient.vcId,
isRecording: liveCareModel.startCallRes != null ? liveCareModel.startCallRes.isRecording: false,
patientName: patient.fullName ?? (patient.firstName != null ? "${patient.firstName} ${patient.lastName}" : "-"),
tokenID: await liveCareModel.getToken(),
generalId: GENERAL_ID,

@ -146,7 +146,7 @@ class _LiveCarePatientScreenState extends State<LiveCarePatientScreen> {
return Padding(
padding: EdgeInsets.all(8.0),
child: PatientCard(
patientInfo: model.filterData[index],
patientInfo: PatiantInformtion.fromJson(model.filterData[index].toJson()),
patientType: "0",
arrivalType: "0",
isFromSearch: false,
@ -155,7 +155,7 @@ class _LiveCarePatientScreenState extends State<LiveCarePatientScreen> {
onTap: () {
// TODO change the parameter to daynamic
Navigator.of(context).pushNamed(PATIENTS_PROFILE, arguments: {
"patient": model.filterData[index],
"patient": PatiantInformtion.fromJson(model.filterData[index].toJson()),
"patientType": "0",
"isSearch": false,
"isInpatient": false,

@ -66,6 +66,7 @@ class _VideoCallPageState extends State<VideoCallPage> {
//'1_MX40NjgwMzIyNH5-MTU5MzY4MzYzODYwM35ucExWYVRVSm5Hcy9uWGZmM1lOa3czZHV-fg',
kApiKey: '46209962',
vcId: widget.patientData.vcId,
isRecording: tokenData != null ? tokenData.isRecording: false,
patientName: widget.patientData.fullName ?? widget.patientData.firstName != null ? "${widget.patientData.firstName} ${widget.patientData.lastName}" : "-",
tokenID: token, //"hfkjshdf347r8743",
generalId: "Cs2020@2016\$2958",

@ -26,7 +26,7 @@ class InPatientPage extends StatefulWidget {
class _InPatientPageState extends State<InPatientPage> {
TextEditingController _searchController = TextEditingController();
bool isSortDes = true;
bool isSortDes = false;
@override
void dispose() {

@ -1,12 +1,10 @@
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';
import 'package:doctor_app_flutter/models/livecare/session_status_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/live_care/end_call_screen.dart';
@ -14,11 +12,8 @@ import 'package:doctor_app_flutter/screens/patients/profile/profile_screen/profi
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';
@ -118,6 +113,10 @@ class _PatientProfileScreenState extends State<PatientProfileScreen> with Single
callDisconnected() {
callTimer.cancel();
videoCallDurationStreamController.sink.add(null);
setState(() {
isCallStarted = false;
});
}
@override
@ -302,52 +301,73 @@ class _PatientProfileScreenState extends State<PatientProfileScreen> with Single
: TranslationBase.of(context).initiateCall,
disabled: isCallStarted || model.state == ViewState.BusyLocal,
onPressed: () async {
// Navigator.push(context, MaterialPageRoute(
// builder: (BuildContext context) =>
// EndCallScreen(patient:patient)));
// AppPermissionsUtils.requestVideoCallPermission(context: context,onTapGrant: (){
// locator<VideoCallService>().openVideo(model.startCallRes, patient, callConnected, callDisconnected);
// });
if(isCallFinished) {
Navigator.push(context, MaterialPageRoute(
builder: (BuildContext context) => EndCallScreen(patient:patient)));
} else {
GifLoaderDialogUtils.showMyDialog(context);
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 = int.parse(model.startCallRes.appointmentNo.toString());
patient.episodeNo = 0;
setState(() {
isCallStarted = true;
});
GifLoaderDialogUtils.hideDialog(context);
AppPermissionsUtils.requestVideoCallPermission(context: context,onTapGrant: (){
locator<VideoCallService>().openVideo(model.startCallRes, patient, callConnected, callDisconnected);
});
}
}
// AppPermissionsUtils
// .requestVideoCallPermission(
// context: context,
// onTapGrant: () {
// locator<VideoCallService>()
// .openVideo(
// model.startCallRes,
// patient,
// false, callConnected, // model.startCallRes.isRecording
// callDisconnected);
// });
if (isCallFinished) {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
EndCallScreen(patient: patient)));
} else {
GifLoaderDialogUtils.showMyDialog(context);
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 = int.parse(model
.startCallRes.appointmentNo
.toString());
patient.episodeNo = 0;
model.updateInCallPatient(
patient: patient,
appointmentNo: int.parse(model
.startCallRes.appointmentNo
.toString()));
setState(() {
isCallStarted = true;
});
GifLoaderDialogUtils.hideDialog(context);
AppPermissionsUtils
.requestVideoCallPermission(
context: context,
onTapGrant: () {
locator<VideoCallService>()
.openVideo(
model.startCallRes,
patient,
/*model.startCallRes != null ? model.startCallRes.isRecording : */ true
, callConnected,
callDisconnected);
});
}
}
},
),
),
),
),
),
),
SizedBox(
height: 5,
SizedBox(
height: 5,
),
],
),
],
),
) : null,
),
)
: null,
),
);
}
}

@ -11,7 +11,7 @@ class VideoChannel{
/// channel name
static const _channel = const MethodChannel("Dr.cloudSolution/videoCall");
static openVideoCallScreen({kApiKey, kSessionId, kToken, callDuration, warningDuration,int vcId,String tokenID,
String generalId,int doctorId, String patientName, Function() onCallEnd ,
String generalId,int doctorId, String patientName, bool isRecording = false, Function() onCallEnd ,
Function(SessionStatusModel sessionStatusModel) onCallNotRespond ,Function(String error) onFailure, VoidCallback onCallConnected, VoidCallback onCallDisconnected}) async {
onCallConnected = onCallConnected ?? (){};
@ -41,6 +41,7 @@ class VideoChannel{
"generalId": generalId,
"DoctorId": doctorId ,
"patientName": patientName,
"isRecording": isRecording,
},
);
if(result['callResponse'] == 'CallEnd') {

Loading…
Cancel
Save