Merge branch 'flutter_vervion_2_by_elham' into 'flutter_2_developemt'
Flutter vervion 2 by elham See merge request Cloud_Solution/doctor_app_flutter!888merge-requests/889/merge
commit
ede9574084
@ -1,7 +0,0 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.hmg.hmgDr">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
</manifest>
|
||||
@ -0,0 +1,12 @@
|
||||
package com.hmg.hmgDr
|
||||
|
||||
import com.hmg.hmgDr.globalErrorHandler.LoggingExceptionHandler
|
||||
import io.flutter.app.FlutterApplication
|
||||
|
||||
class AppApplication : FlutterApplication() {
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
// LoggingExceptionHandler(this, "ErrorFile")
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,234 @@
|
||||
package com.hmg.hmgDr.Service
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Service
|
||||
import android.content.Context
|
||||
import android.graphics.PixelFormat
|
||||
import android.graphics.Point
|
||||
import android.os.Build
|
||||
import android.os.CountDownTimer
|
||||
import android.util.Log
|
||||
import android.view.*
|
||||
import androidx.core.view.GestureDetectorCompat
|
||||
import com.hmg.hmgDr.R
|
||||
import com.hmg.hmgDr.util.ViewsUtil
|
||||
|
||||
abstract class BaseMovingFloatingWidget : Service() {
|
||||
|
||||
val szWindow = Point()
|
||||
lateinit var windowManagerParams: WindowManager.LayoutParams
|
||||
var mWindowManager: WindowManager? = null
|
||||
var floatingWidgetView: View? = null
|
||||
lateinit var floatingViewContainer: View
|
||||
|
||||
lateinit var mDetector: GestureDetectorCompat
|
||||
|
||||
private var xInitCord = 0
|
||||
private var yInitCord: Int = 0
|
||||
private var xInitMargin: Int = 0
|
||||
private var yInitMargin: Int = 0
|
||||
|
||||
/* Add Floating Widget View to Window Manager */
|
||||
open fun addFloatingWidgetView() {
|
||||
mWindowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
|
||||
|
||||
//Init LayoutInflater
|
||||
val inflater = getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater
|
||||
//Inflate the removing view layout we created
|
||||
floatingWidgetView = inflater.inflate(R.layout.activity_video_call, null)
|
||||
|
||||
//Add the view to the window.
|
||||
windowManagerParams =
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
WindowManager.LayoutParams(
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.TYPE_PHONE,
|
||||
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
||||
PixelFormat.TRANSLUCENT
|
||||
)
|
||||
} else {
|
||||
WindowManager.LayoutParams(
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.WRAP_CONTENT,
|
||||
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
|
||||
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
|
||||
PixelFormat.TRANSLUCENT
|
||||
)
|
||||
}
|
||||
|
||||
//Specify the view position
|
||||
windowManagerParams.gravity = Gravity.TOP or Gravity.START
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
val dragListener: View.OnTouchListener = View.OnTouchListener { _, event ->
|
||||
mDetector.onTouchEvent(event)
|
||||
|
||||
//Get Floating widget view params
|
||||
val layoutParams: WindowManager.LayoutParams =
|
||||
floatingWidgetView!!.layoutParams as WindowManager.LayoutParams
|
||||
//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 -> {
|
||||
xInitCord = x_cord
|
||||
yInitCord = y_cord
|
||||
|
||||
//remember the initial position.
|
||||
xInitMargin = layoutParams.x
|
||||
yInitMargin = layoutParams.y
|
||||
}
|
||||
MotionEvent.ACTION_UP -> {
|
||||
//Get the difference between initial coordinate and current coordinate
|
||||
val x_diff: Int = x_cord - xInitCord
|
||||
val y_diff: Int = y_cord - yInitCord
|
||||
|
||||
y_cord_Destination = yInitMargin + y_diff
|
||||
val barHeight: Int = ViewsUtil.getStatusBarHeight(applicationContext)
|
||||
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 + (floatingViewContainer.height + barHeight) > szWindow.y) {
|
||||
y_cord_Destination = szWindow.y - (floatingViewContainer.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 - xInitCord
|
||||
val y_diff_move: Int = y_cord - yInitCord
|
||||
x_cord_Destination = xInitMargin + x_diff_move
|
||||
y_cord_Destination = yInitMargin + y_diff_move
|
||||
|
||||
layoutParams.x = x_cord_Destination
|
||||
layoutParams.y = y_cord_Destination
|
||||
|
||||
//Update the layout with new X & Y coordinate
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, layoutParams)
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
/**
|
||||
* OnTouch actions
|
||||
*/
|
||||
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)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Reset position of Floating Widget view on dragging */
|
||||
fun resetPosition(x_cord_now: Int) {
|
||||
if (x_cord_now <= szWindow.x / 2) {
|
||||
moveToLeft(x_cord_now)
|
||||
} else {
|
||||
moveToRight(x_cord_now)
|
||||
}
|
||||
}
|
||||
|
||||
/* Method to move the Floating widget view to Left */
|
||||
private fun moveToLeft(current_x_cord: Int) {
|
||||
|
||||
val mParams: WindowManager.LayoutParams =
|
||||
floatingWidgetView!!.layoutParams as WindowManager.LayoutParams
|
||||
|
||||
mParams.x =
|
||||
(szWindow.x - current_x_cord * current_x_cord - floatingViewContainer.width).toInt()
|
||||
|
||||
try {
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
} catch (e: Exception) {
|
||||
Log.e("windowManagerUpdate", "${e.localizedMessage}.")
|
||||
}
|
||||
val x = szWindow.x - current_x_cord
|
||||
object : CountDownTimer(500, 5) {
|
||||
//get params of Floating Widget view
|
||||
val mParams: WindowManager.LayoutParams =
|
||||
floatingWidgetView!!.layoutParams as WindowManager.LayoutParams
|
||||
|
||||
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 - floatingViewContainer.width).toInt()
|
||||
|
||||
try {
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
} catch (e: Exception) {
|
||||
Log.e("windowManagerUpdate", "${e.localizedMessage}.")
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFinish() {
|
||||
mParams.x = -(szWindow.x - floatingViewContainer.width)
|
||||
|
||||
try {
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
} catch (e: Exception) {
|
||||
Log.e("windowManagerUpdate", "${e.localizedMessage}.")
|
||||
}
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
/* Method to move the Floating widget view to Right */
|
||||
private fun moveToRight(current_x_cord: Int) {
|
||||
object : CountDownTimer(500, 5) {
|
||||
//get params of Floating Widget view
|
||||
val mParams: WindowManager.LayoutParams =
|
||||
floatingWidgetView!!.layoutParams as WindowManager.LayoutParams
|
||||
|
||||
override fun onTick(t: Long) {
|
||||
val step = (500 - t) / 5
|
||||
mParams.x =
|
||||
(szWindow.x + current_x_cord * current_x_cord * step - floatingViewContainer.width).toInt()
|
||||
|
||||
try {
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
} catch (e: Exception) {
|
||||
Log.e("windowManagerUpdate", "${e.localizedMessage}.")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun onFinish() {
|
||||
mParams.x = szWindow.x - floatingViewContainer.width
|
||||
|
||||
mWindowManager?.updateViewLayout(floatingWidgetView, mParams)
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
/***
|
||||
* Utils
|
||||
*/
|
||||
|
||||
fun getWindowManagerDefaultDisplay() {
|
||||
val w = mWindowManager!!.defaultDisplay.width
|
||||
val h = mWindowManager!!.defaultDisplay.height
|
||||
szWindow[w] = h
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,91 @@
|
||||
package com.hmg.hmgDr.Service
|
||||
|
||||
import android.app.Service
|
||||
import android.content.Intent
|
||||
import android.os.Binder
|
||||
import android.os.Bundle
|
||||
import android.os.IBinder
|
||||
import com.hmg.hmgDr.MainActivity
|
||||
import com.hmg.hmgDr.ui.VideoCallResponseListener
|
||||
import com.hmg.hmgDr.ui.fragment.VideoCallFragment
|
||||
|
||||
class VideoStreamContainerService : Service(), VideoCallResponseListener {
|
||||
|
||||
var videoCallResponseListener: VideoCallResponseListener? = null
|
||||
var mActivity: MainActivity? = null
|
||||
set(value) {
|
||||
field = value
|
||||
if (field != null) {
|
||||
setDialogFragment()
|
||||
}
|
||||
}
|
||||
var arguments: Bundle? = null
|
||||
var serviceRunning: Boolean = false
|
||||
|
||||
|
||||
private val serviceBinder: IBinder = VideoStreamBinder()
|
||||
private var dialogFragment: VideoCallFragment? = null
|
||||
|
||||
override fun onBind(intent: Intent?): IBinder {
|
||||
return serviceBinder
|
||||
}
|
||||
|
||||
private fun setDialogFragment() {
|
||||
mActivity?.run {
|
||||
if (dialogFragment == null) {
|
||||
val transaction = supportFragmentManager.beginTransaction()
|
||||
dialogFragment = VideoCallFragment.newInstance(arguments!!)
|
||||
dialogFragment?.let {
|
||||
it.setCallListener(this@VideoStreamContainerService)
|
||||
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")
|
||||
} else {
|
||||
// don't do anything
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun closeVideoCall(){
|
||||
dialogFragment?.onCallClicked()
|
||||
}
|
||||
|
||||
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||
if (intent != null && intent.extras != null) {
|
||||
arguments = intent.extras
|
||||
}
|
||||
// Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show()
|
||||
return START_STICKY
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
// Toast.makeText(this, "Service destroyed by user.", Toast.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
inner class VideoStreamBinder : Binder() {
|
||||
val service: VideoStreamContainerService
|
||||
get() = this@VideoStreamContainerService
|
||||
}
|
||||
|
||||
override fun onCallFinished(resultCode: Int, intent: Intent?) {
|
||||
dialogFragment = null
|
||||
videoCallResponseListener?.onCallFinished(resultCode, intent)
|
||||
}
|
||||
|
||||
override fun errorHandle(message: String) {
|
||||
dialogFragment = null
|
||||
// Toast.makeText(this, message, Toast.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
override fun minimizeVideoEvent(isMinimize: Boolean) {
|
||||
videoCallResponseListener?.minimizeVideoEvent(isMinimize)
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,39 @@
|
||||
package com.hmg.hmgDr.globalErrorHandler
|
||||
|
||||
import android.os.Environment
|
||||
import java.io.BufferedWriter
|
||||
import java.io.File
|
||||
import java.io.FileWriter
|
||||
import java.io.IOException
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
|
||||
object FileUtil {
|
||||
|
||||
val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS")
|
||||
|
||||
fun pushLog(body: String?) {
|
||||
try {
|
||||
val date = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date())
|
||||
val time = SimpleDateFormat("HH:MM:SS", Locale.getDefault()).format(Date())
|
||||
val root =
|
||||
File(Environment.getExternalStorageDirectory(),"error_log_dir")
|
||||
// if external memory exists and folder with name Notes
|
||||
if (!root.exists()) {
|
||||
root.mkdirs() // this will create folder.
|
||||
}
|
||||
val oldFile = File(root, "error" + sdf.format(Date()).toString() + ".txt") // old file
|
||||
if (oldFile.exists()) oldFile.delete()
|
||||
val filepath = File(root, "error$date.txt") // file path to save
|
||||
val bufferedWriter = BufferedWriter(FileWriter(filepath, true))
|
||||
bufferedWriter.append("\r\n")
|
||||
bufferedWriter.append("\r\n").append(body).append(" Time : ").append(time)
|
||||
bufferedWriter.flush()
|
||||
} catch (e: IOException) {
|
||||
e.printStackTrace()
|
||||
} catch (e: IllegalStateException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
package com.hmg.hmgDr.globalErrorHandler
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import com.hmg.hmgDr.MainActivity
|
||||
import com.hmg.hmgDr.globalErrorHandler.FileUtil.pushLog
|
||||
|
||||
|
||||
class LoggingExceptionHandler(private val context: Context, ErrorFile: String) :
|
||||
Thread.UncaughtExceptionHandler {
|
||||
private val rootHandler: Thread.UncaughtExceptionHandler
|
||||
override fun uncaughtException(t: Thread, e: Throwable) {
|
||||
object : Thread() {
|
||||
override fun run() {
|
||||
pushLog("UnCaught Exception is thrown in $error$e")
|
||||
try {
|
||||
sleep(500)
|
||||
val intent = Intent(context, MainActivity::class.java)
|
||||
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
|
||||
context.startActivity(intent)
|
||||
} catch (e1: Exception) {
|
||||
e1.printStackTrace()
|
||||
}
|
||||
}
|
||||
}.start()
|
||||
rootHandler.uncaughtException(t, e)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val TAG = LoggingExceptionHandler::class.java.simpleName
|
||||
lateinit var error: String
|
||||
}
|
||||
|
||||
init {
|
||||
error = "$ErrorFile.error "
|
||||
rootHandler = Thread.getDefaultUncaughtExceptionHandler()
|
||||
Thread.setDefaultUncaughtExceptionHandler(this)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package com.hmg.hmgDr.globalErrorHandler
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
|
||||
class UCEDefaultActivity : AppCompatActivity() {
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
package com.hmg.hmgDr.globalErrorHandler
|
||||
|
||||
import androidx.core.content.FileProvider
|
||||
|
||||
class UCEFileProvider : FileProvider() {
|
||||
}
|
||||
@ -0,0 +1,280 @@
|
||||
package com.hmg.hmgDr.globalErrorHandler
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.Date;
|
||||
import java.util.Deque;
|
||||
import java.util.Locale;
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
class UCEHandler(val builder: Builder) {
|
||||
|
||||
val EXTRA_STACK_TRACE = "EXTRA_STACK_TRACE"
|
||||
val EXTRA_ACTIVITY_LOG = "EXTRA_ACTIVITY_LOG"
|
||||
private val TAG = "UCEHandler"
|
||||
private val UCE_HANDLER_PACKAGE_NAME = "com.rohitss.uceh"
|
||||
private val DEFAULT_HANDLER_PACKAGE_NAME = "com.android.internal.os"
|
||||
private val MAX_STACK_TRACE_SIZE = 131071 //128 KB - 1
|
||||
|
||||
private val MAX_ACTIVITIES_IN_LOG = 50
|
||||
private val SHARED_PREFERENCES_FILE = "uceh_preferences"
|
||||
private val SHARED_PREFERENCES_FIELD_TIMESTAMP = "last_crash_timestamp"
|
||||
private val activityLog: Deque<String> = ArrayDeque(MAX_ACTIVITIES_IN_LOG)
|
||||
var COMMA_SEPARATED_EMAIL_ADDRESSES: String? = null
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
private var application: Application? = null
|
||||
private var isInBackground = true
|
||||
private var isBackgroundMode = false
|
||||
private var isUCEHEnabled = false
|
||||
private var isTrackActivitiesEnabled = false
|
||||
private var lastActivityCreated: WeakReference<Activity?> = WeakReference(null)
|
||||
|
||||
fun UCEHandler(builder: Builder) {
|
||||
isUCEHEnabled = builder.isUCEHEnabled
|
||||
isTrackActivitiesEnabled = builder.isTrackActivitiesEnabled
|
||||
isBackgroundMode = builder.isBackgroundModeEnabled
|
||||
COMMA_SEPARATED_EMAIL_ADDRESSES = builder.commaSeparatedEmailAddresses
|
||||
setUCEHandler(builder.context)
|
||||
}
|
||||
|
||||
private fun setUCEHandler(context: Context?) {
|
||||
try {
|
||||
if (context != null) {
|
||||
val oldHandler = Thread.getDefaultUncaughtExceptionHandler()
|
||||
if (oldHandler != null && oldHandler.javaClass.name.startsWith(
|
||||
UCE_HANDLER_PACKAGE_NAME
|
||||
)
|
||||
) {
|
||||
Log.e(TAG, "UCEHandler was already installed, doing nothing!")
|
||||
} else {
|
||||
if (oldHandler != null && !oldHandler.javaClass.name.startsWith(
|
||||
DEFAULT_HANDLER_PACKAGE_NAME
|
||||
)
|
||||
) {
|
||||
Log.e(
|
||||
TAG,
|
||||
"You already have an UncaughtExceptionHandler. If you use a custom UncaughtExceptionHandler, it should be initialized after UCEHandler! Installing anyway, but your original handler will not be called."
|
||||
)
|
||||
}
|
||||
application = context.getApplicationContext() as Application
|
||||
//Setup UCE Handler.
|
||||
Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler { thread, throwable ->
|
||||
if (isUCEHEnabled) {
|
||||
Log.e(
|
||||
TAG,
|
||||
"App crashed, executing UCEHandler's UncaughtExceptionHandler",
|
||||
throwable
|
||||
)
|
||||
if (hasCrashedInTheLastSeconds(application!!)) {
|
||||
Log.e(
|
||||
TAG,
|
||||
"App already crashed recently, not starting custom error activity because we could enter a restart loop. Are you sure that your app does not crash directly on init?",
|
||||
throwable
|
||||
)
|
||||
if (oldHandler != null) {
|
||||
oldHandler.uncaughtException(thread, throwable)
|
||||
return@UncaughtExceptionHandler
|
||||
}
|
||||
} else {
|
||||
setLastCrashTimestamp(application!!, Date().getTime())
|
||||
if (!isInBackground || isBackgroundMode) {
|
||||
val intent = Intent(application, UCEDefaultActivity::class.java)
|
||||
val sw = StringWriter()
|
||||
val pw = PrintWriter(sw)
|
||||
throwable.printStackTrace(pw)
|
||||
var stackTraceString: String = sw.toString()
|
||||
if (stackTraceString.length > MAX_STACK_TRACE_SIZE) {
|
||||
val disclaimer = " [stack trace too large]"
|
||||
stackTraceString = stackTraceString.substring(
|
||||
0,
|
||||
MAX_STACK_TRACE_SIZE - disclaimer.length
|
||||
) + disclaimer
|
||||
}
|
||||
intent.putExtra(EXTRA_STACK_TRACE, stackTraceString)
|
||||
if (isTrackActivitiesEnabled) {
|
||||
val activityLogStringBuilder = StringBuilder()
|
||||
while (!activityLog.isEmpty()) {
|
||||
activityLogStringBuilder.append(activityLog.poll())
|
||||
}
|
||||
intent.putExtra(
|
||||
EXTRA_ACTIVITY_LOG,
|
||||
activityLogStringBuilder.toString()
|
||||
)
|
||||
}
|
||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||
application!!.startActivity(intent)
|
||||
} else {
|
||||
if (oldHandler != null) {
|
||||
oldHandler.uncaughtException(thread, throwable)
|
||||
return@UncaughtExceptionHandler
|
||||
}
|
||||
//If it is null (should not be), we let it continue and kill the process or it will be stuck
|
||||
}
|
||||
}
|
||||
val lastActivity: Activity? = lastActivityCreated.get()
|
||||
if (lastActivity != null) {
|
||||
lastActivity.finish()
|
||||
lastActivityCreated.clear()
|
||||
}
|
||||
killCurrentProcess()
|
||||
} else oldHandler?.uncaughtException(thread, throwable)
|
||||
})
|
||||
application!!.registerActivityLifecycleCallbacks(object :
|
||||
Application.ActivityLifecycleCallbacks {
|
||||
val dateFormat: DateFormat =
|
||||
SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US)
|
||||
var currentlyStartedActivities = 0
|
||||
|
||||
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
|
||||
if (activity.javaClass !== UCEDefaultActivity::class.java) {
|
||||
lastActivityCreated = WeakReference(activity)
|
||||
}
|
||||
if (isTrackActivitiesEnabled) {
|
||||
activityLog.add(
|
||||
dateFormat.format(Date())
|
||||
.toString() + ": " + activity.javaClass
|
||||
.getSimpleName() + " created\n"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityStarted(activity: Activity) {
|
||||
currentlyStartedActivities++
|
||||
isInBackground = currentlyStartedActivities == 0
|
||||
}
|
||||
|
||||
override fun onActivityResumed(activity: Activity) {
|
||||
if (isTrackActivitiesEnabled) {
|
||||
activityLog.add(
|
||||
dateFormat.format(Date())
|
||||
.toString() + ": " + activity.javaClass
|
||||
.simpleName + " resumed\n"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityPaused(activity: Activity) {
|
||||
if (isTrackActivitiesEnabled) {
|
||||
activityLog.add(
|
||||
dateFormat.format(Date())
|
||||
.toString() + ": " + activity.javaClass
|
||||
.simpleName + " paused\n"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityStopped(activity: Activity) {
|
||||
currentlyStartedActivities--
|
||||
isInBackground = currentlyStartedActivities == 0
|
||||
}
|
||||
|
||||
override fun onActivitySaveInstanceState(
|
||||
activity: Activity,
|
||||
outState: Bundle
|
||||
) {}
|
||||
override fun onActivityDestroyed(activity: Activity) {
|
||||
if (isTrackActivitiesEnabled) {
|
||||
activityLog.add(
|
||||
dateFormat.format(Date())
|
||||
.toString() + ": " + activity.javaClass
|
||||
.simpleName + " destroyed\n"
|
||||
)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
Log.i(TAG, "UCEHandler has been installed.")
|
||||
} else {
|
||||
Log.e(TAG, "Context can not be null")
|
||||
}
|
||||
} catch (throwable: Throwable) {
|
||||
Log.e(
|
||||
TAG,
|
||||
"UCEHandler can not be initialized. Help making it better by reporting this as a bug.",
|
||||
throwable
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* INTERNAL method that tells if the app has crashed in the last seconds.
|
||||
* This is used to avoid restart loops.
|
||||
*
|
||||
* @return true if the app has crashed in the last seconds, false otherwise.
|
||||
*/
|
||||
private fun hasCrashedInTheLastSeconds(context: Context): Boolean {
|
||||
val lastTimestamp = getLastCrashTimestamp(context)
|
||||
val currentTimestamp: Long = Date().getTime()
|
||||
return lastTimestamp <= currentTimestamp && currentTimestamp - lastTimestamp < 3000
|
||||
}
|
||||
|
||||
@SuppressLint("ApplySharedPref")
|
||||
private fun setLastCrashTimestamp(context: Context, timestamp: Long) {
|
||||
context.getSharedPreferences(SHARED_PREFERENCES_FILE, Context.MODE_PRIVATE).edit()
|
||||
.putLong(SHARED_PREFERENCES_FIELD_TIMESTAMP, timestamp).commit()
|
||||
}
|
||||
|
||||
private fun killCurrentProcess() {
|
||||
// Process.killProcess(Process.myPid())
|
||||
exitProcess(10)
|
||||
}
|
||||
|
||||
private fun getLastCrashTimestamp(context: Context): Long {
|
||||
return context.getSharedPreferences(SHARED_PREFERENCES_FILE, Context.MODE_PRIVATE)
|
||||
.getLong(SHARED_PREFERENCES_FIELD_TIMESTAMP, -1)
|
||||
}
|
||||
|
||||
fun closeApplication(activity: Activity) {
|
||||
activity.finish()
|
||||
killCurrentProcess()
|
||||
}
|
||||
|
||||
inner class Builder(context: Context) {
|
||||
val context: Context
|
||||
var isUCEHEnabled = true
|
||||
var commaSeparatedEmailAddresses: String? = null
|
||||
var isTrackActivitiesEnabled = false
|
||||
var isBackgroundModeEnabled = true
|
||||
fun setUCEHEnabled(isUCEHEnabled: Boolean): Builder {
|
||||
this.isUCEHEnabled = isUCEHEnabled
|
||||
return this
|
||||
}
|
||||
|
||||
fun setTrackActivitiesEnabled(isTrackActivitiesEnabled: Boolean): Builder {
|
||||
this.isTrackActivitiesEnabled = isTrackActivitiesEnabled
|
||||
return this
|
||||
}
|
||||
|
||||
fun setBackgroundModeEnabled(isBackgroundModeEnabled: Boolean): Builder {
|
||||
this.isBackgroundModeEnabled = isBackgroundModeEnabled
|
||||
return this
|
||||
}
|
||||
|
||||
fun addCommaSeparatedEmailAddresses(commaSeparatedEmailAddresses: String?): Builder {
|
||||
this.commaSeparatedEmailAddresses = commaSeparatedEmailAddresses ?: ""
|
||||
return this
|
||||
}
|
||||
|
||||
fun build() {
|
||||
return UCEHandler(this)
|
||||
}
|
||||
|
||||
init {
|
||||
this.context = context
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package com.hmg.hmgDr.Model;
|
||||
package com.hmg.hmgDr.model;
|
||||
|
||||
|
||||
import android.os.Parcel;
|
||||
@ -0,0 +1,16 @@
|
||||
package com.hmg.hmgDr.model
|
||||
|
||||
/** Represents standard data needed for a Notification. */
|
||||
open class NotificationDataModel(
|
||||
// Standard notification values:
|
||||
var mContentTitle: String,
|
||||
var mContentText: String,
|
||||
var mPriority: Int ,
|
||||
// Notification channel values (O and above):
|
||||
var mChannelId: String,
|
||||
var mChannelName: CharSequence,
|
||||
var mChannelDescription: String,
|
||||
var mChannelImportance: Int ,
|
||||
var mChannelEnableVibrate: Boolean ,
|
||||
var mChannelLockscreenVisibility: Int
|
||||
)
|
||||
@ -0,0 +1,35 @@
|
||||
package com.hmg.hmgDr.model
|
||||
|
||||
import android.app.Notification
|
||||
import android.app.NotificationManager
|
||||
import android.os.Build
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.app.NotificationCompat
|
||||
|
||||
class NotificationVideoModel constructor(
|
||||
mContentTitle: String,
|
||||
mContentText: String,
|
||||
mChannelId: String,
|
||||
mChannelName: CharSequence,
|
||||
mChannelDescription: String,
|
||||
mPriority: Int = Notification.PRIORITY_MAX,
|
||||
mChannelImportance: Int = NotificationManager.IMPORTANCE_LOW,
|
||||
mChannelEnableVibrate: Boolean = true,
|
||||
mChannelLockscreenVisibility: Int = NotificationCompat.VISIBILITY_PUBLIC,
|
||||
// Unique data for this Notification.Style:
|
||||
var mBigContentTitle: String = mContentTitle,
|
||||
val mBigText: String = mContentText,
|
||||
var mSummaryText: String
|
||||
) : NotificationDataModel(
|
||||
mContentTitle,
|
||||
mContentText,
|
||||
mPriority,
|
||||
mChannelId,
|
||||
mChannelName,
|
||||
mChannelDescription,
|
||||
mChannelImportance,
|
||||
mChannelEnableVibrate,
|
||||
mChannelLockscreenVisibility
|
||||
) {
|
||||
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package com.hmg.hmgDr.Model;
|
||||
package com.hmg.hmgDr.model;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
@ -0,0 +1,38 @@
|
||||
package com.hmg.hmgDr.util
|
||||
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
object DateUtils {
|
||||
|
||||
var simpleDateFormat: SimpleDateFormat = SimpleDateFormat("hh:mm:ss", Locale.ENGLISH)
|
||||
|
||||
fun differentDateTimeBetweenDateAndNow(firstDate: Date): String {
|
||||
val now: Date = Calendar.getInstance().time
|
||||
//1 minute = 60 seconds
|
||||
//1 hour = 60 x 60 = 3600
|
||||
//1 day = 3600 x 24 = 86400
|
||||
|
||||
var different: Long = now.time - firstDate.time
|
||||
|
||||
val secondsInMilli: Long = 1000
|
||||
val minutesInMilli = secondsInMilli * 60
|
||||
val hoursInMilli = minutesInMilli * 60
|
||||
val daysInMilli = hoursInMilli * 24
|
||||
|
||||
val elapsedDays = different / daysInMilli
|
||||
different %= daysInMilli
|
||||
|
||||
val elapsedHours = different / hoursInMilli
|
||||
different %= hoursInMilli
|
||||
|
||||
val elapsedMinutes = different / minutesInMilli
|
||||
different %= minutesInMilli
|
||||
|
||||
val elapsedSeconds = different / secondsInMilli
|
||||
|
||||
val format = "%1$02d:%2$02d" // two digits
|
||||
return String.format(format, elapsedMinutes, elapsedSeconds)
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
package com.hmg.hmgDr.util
|
||||
|
||||
import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.graphics.Color
|
||||
import android.os.Build
|
||||
import androidx.core.app.NotificationCompat
|
||||
import com.hmg.hmgDr.model.NotificationDataModel
|
||||
import com.hmg.hmgDr.model.NotificationVideoModel
|
||||
|
||||
object NotificationUtil {
|
||||
|
||||
fun createNotificationChannel(
|
||||
context: Context,
|
||||
notificationDataModel: NotificationDataModel
|
||||
): String {
|
||||
// The id of the channel.
|
||||
val channelId: String = notificationDataModel.mChannelId
|
||||
|
||||
// NotificationChannels are required for Notifications on O (API 26) and above.
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
// The user-visible name of the channel.
|
||||
val channelName: CharSequence = notificationDataModel.mChannelName
|
||||
// The user-visible description of the channel.
|
||||
val channelDescription: String = notificationDataModel.mChannelDescription
|
||||
val channelImportance: Int = notificationDataModel.mChannelImportance
|
||||
val channelEnableVibrate: Boolean = notificationDataModel.mChannelEnableVibrate
|
||||
val channelLockscreenVisibility: Int =
|
||||
notificationDataModel.mChannelLockscreenVisibility
|
||||
|
||||
// Initializes NotificationChannel.
|
||||
val notificationChannel = NotificationChannel(channelId, channelName, channelImportance)
|
||||
notificationChannel.description = channelDescription
|
||||
notificationChannel.lightColor = Color.BLUE
|
||||
notificationChannel.lockscreenVisibility = channelLockscreenVisibility
|
||||
// no vibration
|
||||
notificationChannel.vibrationPattern = longArrayOf(0)
|
||||
notificationChannel.enableVibration(channelEnableVibrate)
|
||||
|
||||
// Adds NotificationChannel to system. Attempting to create an existing notification
|
||||
// channel with its original values performs no operation, so it's safe to perform the
|
||||
// below sequence.
|
||||
val notificationManager =
|
||||
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||
notificationManager.createNotificationChannel(notificationChannel)
|
||||
}
|
||||
return channelId
|
||||
}
|
||||
|
||||
fun setNotificationBigStyle(notificationData : NotificationVideoModel): NotificationCompat.BigTextStyle {
|
||||
return NotificationCompat.BigTextStyle() // Overrides ContentText in the big form of the template.
|
||||
.bigText(notificationData.mBigText) // Overrides ContentTitle in the big form of the template.
|
||||
.setBigContentTitle(notificationData.mBigContentTitle) // Summary line after the detail section in the big form of the template.
|
||||
// Note: To improve readability, don't overload the user with info. If Summary Text
|
||||
// doesn't add critical information, you should skip it.
|
||||
.setSummaryText(notificationData.mSummaryText)
|
||||
}
|
||||
|
||||
/**
|
||||
* IMPORTANT NOTE: You should not do this action unless the user takes an action to see your
|
||||
* Notifications like this sample demonstrates. Spamming users to re-enable your notifications
|
||||
* is a bad idea.
|
||||
*/
|
||||
fun openNotificationSettingsForApp(context: Context) {
|
||||
// Links to this app's notification settings.
|
||||
val intent = Intent()
|
||||
intent.action = "android.settings.APP_NOTIFICATION_SETTINGS"
|
||||
intent.putExtra("app_package", context.packageName)
|
||||
intent.putExtra("app_uid", context.applicationInfo.uid)
|
||||
|
||||
// for Android 8 and above
|
||||
intent.putExtra("android.provider.extra.APP_PACKAGE", context.packageName)
|
||||
context.startActivity(intent)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,467 @@
|
||||
package com.hmg.hmgDr.util.audio
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.media.AudioFormat
|
||||
import android.media.AudioManager
|
||||
import android.media.AudioRecord
|
||||
import android.media.AudioTrack
|
||||
import android.media.MediaRecorder.AudioSource
|
||||
import android.os.Process
|
||||
import android.util.Log
|
||||
|
||||
import com.opentok.android.BaseAudioDevice
|
||||
|
||||
import java.nio.ByteBuffer
|
||||
import java.util.concurrent.locks.Condition
|
||||
import java.util.concurrent.locks.ReentrantLock
|
||||
|
||||
class CustomAudioDevice(context: Context) : BaseAudioDevice() {
|
||||
|
||||
private val m_context: Context = context
|
||||
private var m_audioTrack: AudioTrack? = null
|
||||
private var m_audioRecord: AudioRecord? = null
|
||||
|
||||
// Capture & render buffers
|
||||
private var m_playBuffer: ByteBuffer? = null
|
||||
private var m_recBuffer: ByteBuffer? = null
|
||||
private val m_tempBufPlay: ByteArray
|
||||
private val m_tempBufRec: ByteArray
|
||||
private val m_rendererLock: ReentrantLock = ReentrantLock(true)
|
||||
private val m_renderEvent: Condition = m_rendererLock.newCondition()
|
||||
|
||||
@Volatile
|
||||
private var m_isRendering = false
|
||||
|
||||
@Volatile
|
||||
private var m_shutdownRenderThread = false
|
||||
private val m_captureLock: ReentrantLock = ReentrantLock(true)
|
||||
private val m_captureEvent: Condition = m_captureLock.newCondition()
|
||||
|
||||
@Volatile
|
||||
private var m_isCapturing = false
|
||||
|
||||
@Volatile
|
||||
private var m_shutdownCaptureThread = false
|
||||
private val m_captureSettings: AudioSettings
|
||||
private val m_rendererSettings: AudioSettings
|
||||
|
||||
// Capturing delay estimation
|
||||
private var m_estimatedCaptureDelay = 0
|
||||
|
||||
// Rendering delay estimation
|
||||
private var m_bufferedPlaySamples = 0
|
||||
private var m_playPosition = 0
|
||||
private var m_estimatedRenderDelay = 0
|
||||
private val m_audioManager: AudioManager
|
||||
private var isRendererMuted = false
|
||||
|
||||
companion object {
|
||||
private const val LOG_TAG = "opentok-defaultaudio"
|
||||
private const val SAMPLING_RATE = 44100
|
||||
private const val NUM_CHANNELS_CAPTURING = 1
|
||||
private const val NUM_CHANNELS_RENDERING = 1
|
||||
private const val MAX_SAMPLES = 2 * 480 * 2 // Max 10 ms @ 48 kHz
|
||||
}
|
||||
|
||||
init {
|
||||
try {
|
||||
m_playBuffer = ByteBuffer.allocateDirect(MAX_SAMPLES)
|
||||
m_recBuffer = ByteBuffer.allocateDirect(MAX_SAMPLES)
|
||||
} catch (e: Exception) {
|
||||
Log.e(LOG_TAG, "${e.message}.")
|
||||
}
|
||||
m_tempBufPlay = ByteArray(MAX_SAMPLES)
|
||||
m_tempBufRec = ByteArray(MAX_SAMPLES)
|
||||
m_captureSettings = AudioSettings(
|
||||
SAMPLING_RATE,
|
||||
NUM_CHANNELS_CAPTURING
|
||||
)
|
||||
m_rendererSettings = AudioSettings(
|
||||
SAMPLING_RATE,
|
||||
NUM_CHANNELS_RENDERING
|
||||
)
|
||||
m_audioManager = m_context
|
||||
.getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
||||
m_audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
|
||||
}
|
||||
|
||||
override fun initCapturer(): Boolean {
|
||||
|
||||
// get the minimum buffer size that can be used
|
||||
val minRecBufSize: Int = AudioRecord.getMinBufferSize(
|
||||
m_captureSettings
|
||||
.sampleRate,
|
||||
if (NUM_CHANNELS_CAPTURING == 1) AudioFormat.CHANNEL_IN_MONO else AudioFormat.CHANNEL_IN_STEREO,
|
||||
AudioFormat.ENCODING_PCM_16BIT
|
||||
)
|
||||
|
||||
// double size to be more safe
|
||||
val recBufSize = minRecBufSize * 2
|
||||
|
||||
// release the object
|
||||
if (m_audioRecord != null) {
|
||||
m_audioRecord!!.release()
|
||||
m_audioRecord = null
|
||||
}
|
||||
try {
|
||||
m_audioRecord = AudioRecord(
|
||||
AudioSource.VOICE_COMMUNICATION,
|
||||
m_captureSettings.sampleRate,
|
||||
if (NUM_CHANNELS_CAPTURING == 1) AudioFormat.CHANNEL_IN_MONO else AudioFormat.CHANNEL_IN_STEREO,
|
||||
AudioFormat.ENCODING_PCM_16BIT, recBufSize
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
Log.e(LOG_TAG, "${e.message}.")
|
||||
return false
|
||||
}
|
||||
|
||||
// check that the audioRecord is ready to be used
|
||||
if (m_audioRecord!!.state != AudioRecord.STATE_INITIALIZED) {
|
||||
Log.i(
|
||||
LOG_TAG, "Audio capture is not initialized "
|
||||
+ m_captureSettings.sampleRate
|
||||
)
|
||||
return false
|
||||
}
|
||||
m_shutdownCaptureThread = false
|
||||
Thread(m_captureThread).start()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun destroyCapturer(): Boolean {
|
||||
m_captureLock.lock()
|
||||
// release the object
|
||||
m_audioRecord?.release()
|
||||
m_audioRecord = null
|
||||
m_shutdownCaptureThread = true
|
||||
m_captureEvent.signal()
|
||||
m_captureLock.unlock()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun getEstimatedCaptureDelay(): Int {
|
||||
return m_estimatedCaptureDelay
|
||||
}
|
||||
|
||||
override fun startCapturer(): Boolean {
|
||||
// start recording
|
||||
try {
|
||||
m_audioRecord!!.startRecording()
|
||||
} catch (e: IllegalStateException) {
|
||||
e.printStackTrace()
|
||||
return false
|
||||
}
|
||||
m_captureLock.lock()
|
||||
m_isCapturing = true
|
||||
m_captureEvent.signal()
|
||||
m_captureLock.unlock()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun stopCapturer(): Boolean {
|
||||
m_captureLock.lock()
|
||||
try {
|
||||
// only stop if we are recording
|
||||
if (m_audioRecord!!.recordingState == AudioRecord.RECORDSTATE_RECORDING) {
|
||||
// stop recording
|
||||
try {
|
||||
m_audioRecord!!.stop()
|
||||
} catch (e: IllegalStateException) {
|
||||
e.printStackTrace()
|
||||
return false
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
// Ensure we always unlock
|
||||
m_isCapturing = false
|
||||
m_captureLock.unlock()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private val m_captureThread = Runnable {
|
||||
val samplesToRec = SAMPLING_RATE / 100
|
||||
var samplesRead = 0
|
||||
try {
|
||||
Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
while (!m_shutdownCaptureThread) {
|
||||
m_captureLock.lock()
|
||||
samplesRead = try {
|
||||
if (!m_isCapturing) {
|
||||
m_captureEvent.await()
|
||||
continue
|
||||
} else {
|
||||
if (m_audioRecord == null) {
|
||||
continue
|
||||
}
|
||||
val lengthInBytes = ((samplesToRec shl 1)
|
||||
* NUM_CHANNELS_CAPTURING)
|
||||
val readBytes: Int = m_audioRecord!!.read(
|
||||
m_tempBufRec, 0,
|
||||
lengthInBytes
|
||||
)
|
||||
m_recBuffer!!.rewind()
|
||||
m_recBuffer!!.put(m_tempBufRec)
|
||||
(readBytes shr 1) / NUM_CHANNELS_CAPTURING
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(LOG_TAG, "RecordAudio try failed: " + e.message)
|
||||
continue
|
||||
} finally {
|
||||
// Ensure we always unlock
|
||||
m_captureLock.unlock()
|
||||
}
|
||||
audioBus.writeCaptureData(m_recBuffer, samplesRead)
|
||||
m_estimatedCaptureDelay = samplesRead * 1000 / SAMPLING_RATE
|
||||
}
|
||||
}
|
||||
|
||||
override fun initRenderer(): Boolean {
|
||||
|
||||
// get the minimum buffer size that can be used
|
||||
val minPlayBufSize: Int = AudioTrack.getMinBufferSize(
|
||||
m_rendererSettings
|
||||
.sampleRate,
|
||||
if (NUM_CHANNELS_RENDERING == 1) AudioFormat.CHANNEL_OUT_MONO else AudioFormat.CHANNEL_OUT_STEREO,
|
||||
AudioFormat.ENCODING_PCM_16BIT
|
||||
)
|
||||
var playBufSize = minPlayBufSize
|
||||
if (playBufSize < 6000) {
|
||||
playBufSize *= 2
|
||||
}
|
||||
|
||||
// release the object
|
||||
if (m_audioTrack != null) {
|
||||
m_audioTrack!!.release()
|
||||
m_audioTrack = null
|
||||
}
|
||||
try {
|
||||
m_audioTrack = AudioTrack(
|
||||
AudioManager.STREAM_VOICE_CALL,
|
||||
m_rendererSettings.sampleRate,
|
||||
if (NUM_CHANNELS_RENDERING == 1) AudioFormat.CHANNEL_OUT_MONO else AudioFormat.CHANNEL_OUT_STEREO,
|
||||
AudioFormat.ENCODING_PCM_16BIT, playBufSize,
|
||||
AudioTrack.MODE_STREAM
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
Log.e(LOG_TAG, "${e.message}.")
|
||||
return false
|
||||
}
|
||||
|
||||
// check that the audioRecord is ready to be used
|
||||
if (m_audioTrack!!.state != AudioTrack.STATE_INITIALIZED) {
|
||||
Log.i(
|
||||
LOG_TAG, "Audio renderer not initialized "
|
||||
+ m_rendererSettings.sampleRate
|
||||
)
|
||||
return false
|
||||
}
|
||||
m_bufferedPlaySamples = 0
|
||||
outputMode = OutputMode.SpeakerPhone
|
||||
m_shutdownRenderThread = false
|
||||
Thread(m_renderThread).start()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun destroyRenderer(): Boolean {
|
||||
m_rendererLock.lock()
|
||||
// release the object
|
||||
m_audioTrack!!.release()
|
||||
m_audioTrack = null
|
||||
m_shutdownRenderThread = true
|
||||
m_renderEvent.signal()
|
||||
m_rendererLock.unlock()
|
||||
unregisterHeadsetReceiver()
|
||||
m_audioManager.isSpeakerphoneOn = false
|
||||
m_audioManager.mode = AudioManager.MODE_NORMAL
|
||||
return true
|
||||
}
|
||||
|
||||
override fun getEstimatedRenderDelay(): Int {
|
||||
return m_estimatedRenderDelay
|
||||
}
|
||||
|
||||
override fun startRenderer(): Boolean {
|
||||
// start playout
|
||||
try {
|
||||
m_audioTrack!!.play()
|
||||
} catch (e: IllegalStateException) {
|
||||
e.printStackTrace()
|
||||
return false
|
||||
}
|
||||
m_rendererLock.lock()
|
||||
m_isRendering = true
|
||||
m_renderEvent.signal()
|
||||
m_rendererLock.unlock()
|
||||
return true
|
||||
}
|
||||
|
||||
override fun stopRenderer(): Boolean {
|
||||
m_rendererLock.lock()
|
||||
try {
|
||||
// only stop if we are playing
|
||||
if (m_audioTrack!!.getPlayState() == AudioTrack.PLAYSTATE_PLAYING) {
|
||||
// stop playout
|
||||
try {
|
||||
m_audioTrack!!.stop()
|
||||
} catch (e: IllegalStateException) {
|
||||
e.printStackTrace()
|
||||
return false
|
||||
}
|
||||
|
||||
// flush the buffers
|
||||
m_audioTrack!!.flush()
|
||||
}
|
||||
} finally {
|
||||
// Ensure we always unlock, both for success, exception or error
|
||||
// return.
|
||||
m_isRendering = false
|
||||
m_rendererLock.unlock()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private val m_renderThread = Runnable {
|
||||
val samplesToPlay = SAMPLING_RATE / 100
|
||||
try {
|
||||
Process
|
||||
.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO)
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
while (!m_shutdownRenderThread) {
|
||||
m_rendererLock.lock()
|
||||
try {
|
||||
if (!m_isRendering) {
|
||||
m_renderEvent.await()
|
||||
continue
|
||||
} else {
|
||||
m_rendererLock.unlock()
|
||||
|
||||
// Don't lock on audioBus calls
|
||||
m_playBuffer!!.clear()
|
||||
val samplesRead: Int = audioBus.readRenderData(
|
||||
m_playBuffer, samplesToPlay
|
||||
)
|
||||
|
||||
// Log.d(LOG_TAG, "Samples read: " + samplesRead);
|
||||
m_rendererLock.lock()
|
||||
if (!isRendererMuted) {
|
||||
// After acquiring the lock again
|
||||
// we must check if we are still playing
|
||||
if (m_audioTrack == null
|
||||
|| !m_isRendering
|
||||
) {
|
||||
continue
|
||||
}
|
||||
val bytesRead = ((samplesRead shl 1)
|
||||
* NUM_CHANNELS_RENDERING)
|
||||
m_playBuffer!!.get(m_tempBufPlay, 0, bytesRead)
|
||||
val bytesWritten: Int = m_audioTrack!!.write(
|
||||
m_tempBufPlay, 0,
|
||||
bytesRead
|
||||
)
|
||||
|
||||
// increase by number of written samples
|
||||
m_bufferedPlaySamples += ((bytesWritten shr 1)
|
||||
/ NUM_CHANNELS_RENDERING)
|
||||
|
||||
// decrease by number of played samples
|
||||
val pos: Int = m_audioTrack!!.getPlaybackHeadPosition()
|
||||
if (pos < m_playPosition) {
|
||||
// wrap or reset by driver
|
||||
m_playPosition = 0
|
||||
}
|
||||
m_bufferedPlaySamples -= pos - m_playPosition
|
||||
m_playPosition = pos
|
||||
|
||||
// we calculate the estimated delay based on the
|
||||
// buffered samples
|
||||
m_estimatedRenderDelay = (m_bufferedPlaySamples * 1000
|
||||
/ SAMPLING_RATE)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Log.e(LOG_TAG, "Exception: " + e.message)
|
||||
e.printStackTrace()
|
||||
} finally {
|
||||
m_rendererLock.unlock()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getCaptureSettings(): AudioSettings {
|
||||
return m_captureSettings
|
||||
}
|
||||
|
||||
override fun getRenderSettings(): AudioSettings {
|
||||
return m_rendererSettings
|
||||
}
|
||||
|
||||
/**
|
||||
* Communication modes handling
|
||||
*/
|
||||
override fun setOutputMode(mode: OutputMode): Boolean {
|
||||
super.setOutputMode(mode)
|
||||
if (mode == OutputMode.Handset) {
|
||||
unregisterHeadsetReceiver()
|
||||
m_audioManager.isSpeakerphoneOn = false
|
||||
} else {
|
||||
m_audioManager.isSpeakerphoneOn = true
|
||||
registerHeadsetReceiver()
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
private val m_headsetReceiver: BroadcastReceiver = object : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context?, intent: Intent) {
|
||||
if (intent.action!!.compareTo(Intent.ACTION_HEADSET_PLUG) == 0) {
|
||||
val state: Int = intent.getIntExtra("state", 0)
|
||||
m_audioManager.isSpeakerphoneOn = state == 0
|
||||
}
|
||||
}
|
||||
}
|
||||
private var m_receiverRegistered = false
|
||||
private fun registerHeadsetReceiver() {
|
||||
if (!m_receiverRegistered) {
|
||||
val receiverFilter = IntentFilter(
|
||||
Intent.ACTION_HEADSET_PLUG
|
||||
)
|
||||
m_context.registerReceiver(m_headsetReceiver, receiverFilter)
|
||||
m_receiverRegistered = true
|
||||
}
|
||||
}
|
||||
|
||||
private fun unregisterHeadsetReceiver() {
|
||||
if (m_receiverRegistered) {
|
||||
try {
|
||||
m_context.unregisterReceiver(m_headsetReceiver)
|
||||
} catch (e: IllegalArgumentException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
m_receiverRegistered = false
|
||||
}
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
if (outputMode == OutputMode.SpeakerPhone) {
|
||||
unregisterHeadsetReceiver()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
if (outputMode == OutputMode.SpeakerPhone) {
|
||||
registerHeadsetReceiver()
|
||||
}
|
||||
}
|
||||
|
||||
fun setRendererMute(isRendererMuted: Boolean) {
|
||||
this.isRendererMuted = isRendererMuted
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package com.hmg.hmgDr.util
|
||||
package com.hmg.hmgDr.util.opentok
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
@ -1,4 +1,4 @@
|
||||
package com.hmg.hmgDr.util
|
||||
package com.hmg.hmgDr.util.opentok
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
@ -0,0 +1,58 @@
|
||||
package com.hmg.hmgDr.util
|
||||
|
||||
import android.content.Context
|
||||
import android.util.DisplayMetrics
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.EditText
|
||||
import io.flutter.embedding.android.FlutterFragmentActivity
|
||||
import kotlin.math.ceil
|
||||
|
||||
object ViewsUtil {
|
||||
|
||||
/* return status bar height on basis of device display metrics */
|
||||
fun getStatusBarHeight(context: Context): Int {
|
||||
return ceil(
|
||||
(25 * context.resources.displayMetrics.density).toDouble()
|
||||
).toInt()
|
||||
}
|
||||
|
||||
/**
|
||||
* @param context
|
||||
* @return the Screen height in DP
|
||||
*/
|
||||
fun getHeightDp(context: Context, isInDp: Boolean = false): Float {
|
||||
val displayMetrics: DisplayMetrics = context.resources.displayMetrics
|
||||
return if (isInDp) {
|
||||
displayMetrics.heightPixels / displayMetrics.density
|
||||
} else {
|
||||
displayMetrics.heightPixels.toFloat()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param context
|
||||
* @return the screnn width in dp
|
||||
*/
|
||||
fun getWidthDp(context: Context, isInDp: Boolean = false): Float {
|
||||
val displayMetrics: DisplayMetrics = context.resources.displayMetrics
|
||||
return if (isInDp) {
|
||||
displayMetrics.widthPixels / displayMetrics.density
|
||||
} else {
|
||||
displayMetrics.widthPixels.toFloat()
|
||||
}
|
||||
}
|
||||
|
||||
// code to hide soft keyboard
|
||||
fun hideSoftKeyBoard(context: Context, editBox: EditText?) {
|
||||
val imm = context.getSystemService(FlutterFragmentActivity.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||
imm.hideSoftInputFromWindow(editBox?.windowToken, 0)
|
||||
}
|
||||
|
||||
|
||||
// code to show soft keyboard
|
||||
private fun showSoftKeyBoard(context: Context, editBox: EditText?) {
|
||||
val inputMethodManager = context.getSystemService(FlutterFragmentActivity.INPUT_METHOD_SERVICE) as InputMethodManager
|
||||
editBox?.requestFocus()
|
||||
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<vector android:height="24dp" android:tint="#FFFFFF"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6 -6,-6 1.41,-1.41z"/>
|
||||
</vector>
|
||||
@ -0,0 +1,5 @@
|
||||
<vector android:height="24dp" android:tint="#FFFFFF"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M7.41,15.41L12,10.83l4.59,4.58L18,14l-6,-6 -6,6z"/>
|
||||
</vector>
|
||||
@ -0,0 +1,5 @@
|
||||
<vector android:height="24dp" android:tint="#FFFFFF"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M12,9c-1.6,0 -3.15,0.25 -4.6,0.72v3.1c0,0.39 -0.23,0.74 -0.56,0.9 -0.98,0.49 -1.87,1.12 -2.66,1.85 -0.18,0.18 -0.43,0.28 -0.7,0.28 -0.28,0 -0.53,-0.11 -0.71,-0.29L0.29,13.08c-0.18,-0.17 -0.29,-0.42 -0.29,-0.7 0,-0.28 0.11,-0.53 0.29,-0.71C3.34,8.78 7.46,7 12,7s8.66,1.78 11.71,4.67c0.18,0.18 0.29,0.43 0.29,0.71 0,0.28 -0.11,0.53 -0.29,0.71l-2.48,2.48c-0.18,0.18 -0.43,0.29 -0.71,0.29 -0.27,0 -0.52,-0.11 -0.7,-0.28 -0.79,-0.74 -1.69,-1.36 -2.67,-1.85 -0.33,-0.16 -0.56,-0.5 -0.56,-0.9v-3.1C15.15,9.25 13.6,9 12,9z"/>
|
||||
</vector>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:padding="16dp">
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:fadeScrollbars="false"
|
||||
android:scrollbars="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="@string/ask_for_error_log"
|
||||
android:textColor="#212121"
|
||||
android:textSize="18sp"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_view_error_log"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="View Error Log"
|
||||
android:textColor="#212121"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_copy_error_log"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="Copy Error Log"
|
||||
android:textColor="#212121"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_share_error_log"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="Share Error Log"
|
||||
android:textColor="#212121"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_email_error_log"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="Email Error Log"
|
||||
android:textColor="#212121"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_save_error_log"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="4dp"
|
||||
android:text="Save Error Log"
|
||||
android:textColor="#212121"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/button_close_app"
|
||||
android:layout_width="150dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="Close App"
|
||||
android:textColor="#212121"/>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
|
||||
</LinearLayout>
|
||||
@ -0,0 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="88dp"
|
||||
android:background="@android:color/holo_blue_dark"
|
||||
android:orientation="vertical"
|
||||
android:padding="@dimen/padding_space_medium">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_icon"
|
||||
android:layout_width="22dp"
|
||||
android:layout_height="22dp"
|
||||
android:src="@mipmap/ic_launcher" />
|
||||
|
||||
<TextView
|
||||
style="@style/TextAppearance.Compat.Notification"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:text="HMG Doctor"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_small" />
|
||||
|
||||
<Chronometer
|
||||
android:id="@+id/notify_timer"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
style="@style/TextAppearance.Compat.Notification"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_small"
|
||||
android:format="MM:SS"
|
||||
tools:text="25:45" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_Arrow"
|
||||
android:layout_width="22dp"
|
||||
android:layout_height="22dp"
|
||||
android:src="@drawable/ic_arrow_bottom" />
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/notify_title"
|
||||
style="@style/TextAppearance.Compat.Notification.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/padding_space_medium"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_small"
|
||||
android:textStyle="bold"
|
||||
tools:text="Mosa zaid mosa abuzaid" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/notify_content"
|
||||
style="@style/TextAppearance.Compat.Notification.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_small"
|
||||
android:text="Tap to return to call" />
|
||||
|
||||
</LinearLayout>
|
||||
@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/holo_blue_dark"
|
||||
android:orientation="vertical"
|
||||
android:padding="@dimen/padding_space_medium">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_icon"
|
||||
android:layout_width="22dp"
|
||||
android:layout_height="22dp"
|
||||
android:src="@mipmap/ic_launcher" />
|
||||
|
||||
<TextView
|
||||
style="@style/TextAppearance.Compat.Notification"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:text="HMG Doctor"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_small" />
|
||||
|
||||
<Chronometer
|
||||
android:id="@+id/notify_timer"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
style="@style/TextAppearance.Compat.Notification"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_small"
|
||||
android:format="MM:SS"
|
||||
tools:text="25:45" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/iv_Arrow"
|
||||
android:layout_width="22dp"
|
||||
android:layout_height="22dp"
|
||||
android:src="@drawable/ic_arrow_top" />
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/notify_title"
|
||||
style="@style/TextAppearance.Compat.Notification.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/padding_space_big"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
android:textStyle="bold"
|
||||
tools:text="Mosa zaid mosa abuzaid" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/notify_content"
|
||||
style="@style/TextAppearance.Compat.Notification.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
android:text="Tap to return to call" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/btn_end"
|
||||
style="@style/TextAppearance.Compat.Notification.Title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/padding_space_medium"
|
||||
android:layout_marginBottom="@dimen/padding_space_medium"
|
||||
android:paddingStart="@dimen/padding_space_small"
|
||||
android:paddingEnd="@dimen/padding_space_small"
|
||||
android:textColor="@color/white"
|
||||
android:textSize="@dimen/text_size_medium"
|
||||
android:textStyle="bold"
|
||||
android:text="End call" />
|
||||
|
||||
</LinearLayout>
|
||||
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths>
|
||||
<external-path name="external_files" path="."/>
|
||||
</paths>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 969 B |
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,16 @@
|
||||
final TOKEN = 'token';
|
||||
final PROJECT_ID = 'projectID';
|
||||
final VIDA_AUTH_TOKEN_ID = 'VidaAuthTokenID';
|
||||
final VIDA_REFRESH_TOKEN_ID = 'VidaRefreshTokenID';
|
||||
final LOGIN_TOKEN_ID = 'LogInToken';
|
||||
final DOCTOR_ID = 'doctorID';
|
||||
final SLECTED_PATIENT_TYPE = 'slectedPatientType';
|
||||
final APP_Language = 'language';
|
||||
final DOCTOR_PROFILE = 'doctorProfile';
|
||||
final LIVE_CARE_PATIENT = 'livecare-patient-profile';
|
||||
final LOGGED_IN_USER = 'loggedUser';
|
||||
final DASHBOARD_DATA = 'dashboard-data';
|
||||
final OTP_TYPE = 'otp-type';
|
||||
final LAST_LOGIN_USER = 'last-login-user';
|
||||
final PASSWORD = 'password';
|
||||
final CLINIC_NAME = 'clinic-name';
|
||||
const TOKEN = 'token';
|
||||
const PROJECT_ID = 'projectID';
|
||||
const VIDA_AUTH_TOKEN_ID = 'VidaAuthTokenID';
|
||||
const VIDA_REFRESH_TOKEN_ID = 'VidaRefreshTokenID';
|
||||
const LOGIN_TOKEN_ID = 'LogInToken';
|
||||
const DOCTOR_ID = 'doctorID';
|
||||
const SLECTED_PATIENT_TYPE = 'slectedPatientType';
|
||||
const APP_Language = 'language';
|
||||
const DOCTOR_PROFILE = 'doctorProfile';
|
||||
const LIVE_CARE_PATIENT = 'livecare-patient-profile';
|
||||
const LOGGED_IN_USER = 'loggedUser';
|
||||
const EMPLOYEE_ID = 'EmployeeID';
|
||||
const DASHBOARD_DATA = 'dashboard-data';
|
||||
const OTP_TYPE = 'otp-type';
|
||||
const LAST_LOGIN_USER = 'last-login-user';
|
||||
const CLINIC_NAME = 'clinic-name';
|
||||
|
||||
@ -0,0 +1,4 @@
|
||||
enum CalenderType{
|
||||
Gregorian,
|
||||
Hijri,
|
||||
}
|
||||
@ -0,0 +1,112 @@
|
||||
class CheckActivationCodeModel {
|
||||
int patientMobileNumber;
|
||||
String mobileNo;
|
||||
int projectOutSA;
|
||||
int loginType;
|
||||
String zipCode;
|
||||
bool isRegister;
|
||||
String logInTokenID;
|
||||
int searchType;
|
||||
int patientID;
|
||||
int nationalID;
|
||||
int patientIdentificationID;
|
||||
bool forRegisteration;
|
||||
String activationCode;
|
||||
double versionID;
|
||||
int channel;
|
||||
int languageID;
|
||||
String iPAdress;
|
||||
String generalid;
|
||||
int patientOutSA;
|
||||
Null sessionID;
|
||||
bool isDentalAllowedBackend;
|
||||
int deviceTypeID;
|
||||
String dOB;
|
||||
int isHijri;
|
||||
String healthId;
|
||||
|
||||
CheckActivationCodeModel(
|
||||
{this.patientMobileNumber,
|
||||
this.mobileNo,
|
||||
this.projectOutSA,
|
||||
this.loginType,
|
||||
this.zipCode,
|
||||
this.isRegister,
|
||||
this.logInTokenID,
|
||||
this.searchType,
|
||||
this.patientID,
|
||||
this.nationalID,
|
||||
this.patientIdentificationID,
|
||||
this.forRegisteration,
|
||||
this.activationCode,
|
||||
this.versionID,
|
||||
this.channel,
|
||||
this.languageID,
|
||||
this.iPAdress,
|
||||
this.generalid,
|
||||
this.patientOutSA,
|
||||
this.sessionID,
|
||||
this.isDentalAllowedBackend,
|
||||
this.deviceTypeID,
|
||||
this.dOB,
|
||||
this.isHijri,
|
||||
this.healthId});
|
||||
|
||||
CheckActivationCodeModel.fromJson(Map<String, dynamic> json) {
|
||||
patientMobileNumber = json['PatientMobileNumber'];
|
||||
mobileNo = json['MobileNo'];
|
||||
projectOutSA = json['ProjectOutSA'];
|
||||
loginType = json['LoginType'];
|
||||
zipCode = json['ZipCode'];
|
||||
isRegister = json['isRegister'];
|
||||
logInTokenID = json['LogInTokenID'];
|
||||
searchType = json['SearchType'];
|
||||
patientID = json['PatientID'];
|
||||
nationalID = json['NationalID'];
|
||||
patientIdentificationID = json['PatientIdentificationID'];
|
||||
forRegisteration = json['ForRegisteration'];
|
||||
activationCode = json['activationCode'];
|
||||
versionID = json['VersionID'];
|
||||
channel = json['Channel'];
|
||||
languageID = json['LanguageID'];
|
||||
iPAdress = json['IPAdress'];
|
||||
generalid = json['generalid'];
|
||||
patientOutSA = json['PatientOutSA'];
|
||||
sessionID = json['SessionID'];
|
||||
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||
deviceTypeID = json['DeviceTypeID'];
|
||||
dOB = json['DOB'];
|
||||
isHijri = json['IsHijri'];
|
||||
healthId = json['HealthId'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['PatientMobileNumber'] = this.patientMobileNumber;
|
||||
data['MobileNo'] = this.mobileNo;
|
||||
data['ProjectOutSA'] = this.projectOutSA;
|
||||
data['LoginType'] = this.loginType;
|
||||
data['ZipCode'] = this.zipCode;
|
||||
data['isRegister'] = this.isRegister;
|
||||
data['LogInTokenID'] = this.logInTokenID;
|
||||
data['SearchType'] = this.searchType;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['NationalID'] = this.nationalID;
|
||||
data['PatientIdentificationID'] = this.patientIdentificationID;
|
||||
data['ForRegisteration'] = this.forRegisteration;
|
||||
data['activationCode'] = this.activationCode;
|
||||
data['VersionID'] = this.versionID;
|
||||
data['Channel'] = this.channel;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['IPAdress'] = this.iPAdress;
|
||||
data['generalid'] = this.generalid;
|
||||
data['PatientOutSA'] = this.patientOutSA;
|
||||
data['SessionID'] = this.sessionID;
|
||||
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||
data['DeviceTypeID'] = this.deviceTypeID;
|
||||
data['DOB'] = this.dOB;
|
||||
data['IsHijri'] = this.isHijri;
|
||||
data['HealthId'] = this.healthId;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,80 @@
|
||||
class CheckPatientForRegistrationModel {
|
||||
int patientIdentificationID;
|
||||
int patientMobileNumber;
|
||||
String zipCode;
|
||||
double versionID;
|
||||
int channel;
|
||||
int languageID;
|
||||
String iPAdress;
|
||||
String generalid;
|
||||
int patientOutSA;
|
||||
Null sessionID;
|
||||
bool isDentalAllowedBackend;
|
||||
int deviceTypeID;
|
||||
String tokenID;
|
||||
int patientID;
|
||||
bool isRegister;
|
||||
String dOB;
|
||||
int isHijri;
|
||||
|
||||
CheckPatientForRegistrationModel(
|
||||
{this.patientIdentificationID,
|
||||
this.patientMobileNumber,
|
||||
this.zipCode,
|
||||
this.versionID,
|
||||
this.channel,
|
||||
this.languageID,
|
||||
this.iPAdress,
|
||||
this.generalid,
|
||||
this.patientOutSA,
|
||||
this.sessionID,
|
||||
this.isDentalAllowedBackend,
|
||||
this.deviceTypeID,
|
||||
this.tokenID,
|
||||
this.patientID,
|
||||
this.isRegister,
|
||||
this.dOB,
|
||||
this.isHijri});
|
||||
|
||||
CheckPatientForRegistrationModel.fromJson(Map<String, dynamic> json) {
|
||||
patientIdentificationID = json['PatientIdentificationID'];
|
||||
patientMobileNumber = json['PatientMobileNumber'];
|
||||
zipCode = json['ZipCode'];
|
||||
versionID = json['VersionID'];
|
||||
channel = json['Channel'];
|
||||
languageID = json['LanguageID'];
|
||||
iPAdress = json['IPAdress'];
|
||||
generalid = json['generalid'];
|
||||
patientOutSA = json['PatientOutSA'];
|
||||
sessionID = json['SessionID'];
|
||||
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||
deviceTypeID = json['DeviceTypeID'];
|
||||
tokenID = json['TokenID'];
|
||||
patientID = json['PatientID'];
|
||||
isRegister = json['isRegister'];
|
||||
dOB = json['DOB'];
|
||||
isHijri = json['IsHijri'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['PatientIdentificationID'] = this.patientIdentificationID;
|
||||
data['PatientMobileNumber'] = this.patientMobileNumber;
|
||||
data['ZipCode'] = this.zipCode;
|
||||
data['VersionID'] = this.versionID;
|
||||
data['Channel'] = this.channel;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['IPAdress'] = this.iPAdress;
|
||||
data['generalid'] = this.generalid;
|
||||
data['PatientOutSA'] = this.patientOutSA;
|
||||
data['SessionID'] = this.sessionID;
|
||||
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||
data['DeviceTypeID'] = this.deviceTypeID;
|
||||
data['TokenID'] = this.tokenID;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['isRegister'] = this.isRegister;
|
||||
data['DOB'] = this.dOB;
|
||||
data['IsHijri'] = this.isHijri;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,60 @@
|
||||
class GetPatientInfoRequestModel {
|
||||
String patientIdentificationID;
|
||||
String dOB;
|
||||
int isHijri;
|
||||
double versionID;
|
||||
int channel;
|
||||
int languageID;
|
||||
String iPAdress;
|
||||
String generalid;
|
||||
int patientOutSA;
|
||||
Null sessionID;
|
||||
bool isDentalAllowedBackend;
|
||||
int deviceTypeID;
|
||||
|
||||
GetPatientInfoRequestModel(
|
||||
{this.patientIdentificationID,
|
||||
this.dOB,
|
||||
this.isHijri,
|
||||
this.versionID,
|
||||
this.channel,
|
||||
this.languageID,
|
||||
this.iPAdress,
|
||||
this.generalid,
|
||||
this.patientOutSA,
|
||||
this.sessionID,
|
||||
this.isDentalAllowedBackend,
|
||||
this.deviceTypeID});
|
||||
|
||||
GetPatientInfoRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
patientIdentificationID = json['PatientIdentificationID'];
|
||||
dOB = json['DOB'];
|
||||
isHijri = json['IsHijri'];
|
||||
versionID = json['VersionID'];
|
||||
channel = json['Channel'];
|
||||
languageID = json['LanguageID'];
|
||||
iPAdress = json['IPAdress'];
|
||||
generalid = json['generalid'];
|
||||
patientOutSA = json['PatientOutSA'];
|
||||
sessionID = json['SessionID'];
|
||||
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||
deviceTypeID = json['DeviceTypeID'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['PatientIdentificationID'] = this.patientIdentificationID;
|
||||
data['DOB'] = this.dOB;
|
||||
data['IsHijri'] = this.isHijri;
|
||||
data['VersionID'] = this.versionID;
|
||||
data['Channel'] = this.channel;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['IPAdress'] = this.iPAdress;
|
||||
data['generalid'] = this.generalid;
|
||||
data['PatientOutSA'] = this.patientOutSA;
|
||||
data['SessionID'] = this.sessionID;
|
||||
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||
data['DeviceTypeID'] = this.deviceTypeID;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,374 @@
|
||||
class GetPatientInfoResponseModel {
|
||||
dynamic date;
|
||||
int languageID;
|
||||
int serviceName;
|
||||
dynamic time;
|
||||
dynamic androidLink;
|
||||
dynamic authenticationTokenID;
|
||||
dynamic data;
|
||||
bool dataw;
|
||||
int dietType;
|
||||
dynamic errorCode;
|
||||
dynamic errorEndUserMessage;
|
||||
dynamic errorEndUserMessageN;
|
||||
dynamic errorMessage;
|
||||
int errorType;
|
||||
int foodCategory;
|
||||
dynamic iOSLink;
|
||||
bool isAuthenticated;
|
||||
int mealOrderStatus;
|
||||
int mealType;
|
||||
int messageStatus;
|
||||
int numberOfResultRecords;
|
||||
dynamic patientBlodType;
|
||||
dynamic successMsg;
|
||||
dynamic successMsgN;
|
||||
dynamic vidaUpdatedResponse;
|
||||
dynamic accessTokenObject;
|
||||
int age;
|
||||
dynamic clientIdentifierId;
|
||||
int createdBy;
|
||||
String dateOfBirth;
|
||||
String firstNameAr;
|
||||
String firstNameEn;
|
||||
String gender;
|
||||
dynamic genderAr;
|
||||
dynamic genderEn;
|
||||
String healthId;
|
||||
String idNumber;
|
||||
String idType;
|
||||
bool isHijri;
|
||||
int isInstertedOrUpdated;
|
||||
int isNull;
|
||||
int isPatientExistNHIC;
|
||||
bool isRecordLockedByCurrentUser;
|
||||
String lastNameAr;
|
||||
String lastNameEn;
|
||||
dynamic listActiveAccessToken;
|
||||
String maritalStatus;
|
||||
String maritalStatusCode;
|
||||
String nationalDateOfBirth;
|
||||
String nationality;
|
||||
String nationalityCode;
|
||||
String occupation;
|
||||
dynamic pCDTransactionDataResultList;
|
||||
dynamic pCDGetVidaPatientForManualVerificationList;
|
||||
dynamic pCDNHICHMGPatientDetailsMatchCalulationList;
|
||||
int pCDReturnValue;
|
||||
String patientStatus;
|
||||
String placeofBirth;
|
||||
dynamic practitionerStatusCode;
|
||||
dynamic practitionerStatusDescAr;
|
||||
dynamic practitionerStatusDescEn;
|
||||
int rowCount;
|
||||
String secondNameAr;
|
||||
String secondNameEn;
|
||||
String thirdNameAr;
|
||||
String thirdNameEn;
|
||||
dynamic yakeenVidaPatientDataStatisticsByPatientIdList;
|
||||
dynamic yakeenVidaPatientDataStatisticsList;
|
||||
dynamic yakeenVidaPatientDataStatisticsPrefferedList;
|
||||
dynamic accessToken;
|
||||
int categoryCode;
|
||||
dynamic categoryNameAr;
|
||||
dynamic categoryNameEn;
|
||||
int constraintCode;
|
||||
dynamic constraintNameAr;
|
||||
dynamic constraintNameEn;
|
||||
dynamic content;
|
||||
dynamic errorList;
|
||||
dynamic licenseExpiryDate;
|
||||
dynamic licenseIssuedDate;
|
||||
dynamic licenseStatusCode;
|
||||
dynamic licenseStatusDescAr;
|
||||
dynamic licenseStatusDescEn;
|
||||
dynamic organizations;
|
||||
dynamic registrationNumber;
|
||||
int specialtyCode;
|
||||
dynamic specialtyNameAr;
|
||||
dynamic specialtyNameEn;
|
||||
|
||||
GetPatientInfoResponseModel(
|
||||
{this.date,
|
||||
this.languageID,
|
||||
this.serviceName,
|
||||
this.time,
|
||||
this.androidLink,
|
||||
this.authenticationTokenID,
|
||||
this.data,
|
||||
this.dataw,
|
||||
this.dietType,
|
||||
this.errorCode,
|
||||
this.errorEndUserMessage,
|
||||
this.errorEndUserMessageN,
|
||||
this.errorMessage,
|
||||
this.errorType,
|
||||
this.foodCategory,
|
||||
this.iOSLink,
|
||||
this.isAuthenticated,
|
||||
this.mealOrderStatus,
|
||||
this.mealType,
|
||||
this.messageStatus,
|
||||
this.numberOfResultRecords,
|
||||
this.patientBlodType,
|
||||
this.successMsg,
|
||||
this.successMsgN,
|
||||
this.vidaUpdatedResponse,
|
||||
this.accessTokenObject,
|
||||
this.age,
|
||||
this.clientIdentifierId,
|
||||
this.createdBy,
|
||||
this.dateOfBirth,
|
||||
this.firstNameAr,
|
||||
this.firstNameEn,
|
||||
this.gender,
|
||||
this.genderAr,
|
||||
this.genderEn,
|
||||
this.healthId,
|
||||
this.idNumber,
|
||||
this.idType,
|
||||
this.isHijri,
|
||||
this.isInstertedOrUpdated,
|
||||
this.isNull,
|
||||
this.isPatientExistNHIC,
|
||||
this.isRecordLockedByCurrentUser,
|
||||
this.lastNameAr,
|
||||
this.lastNameEn,
|
||||
this.listActiveAccessToken,
|
||||
this.maritalStatus,
|
||||
this.maritalStatusCode,
|
||||
this.nationalDateOfBirth,
|
||||
this.nationality,
|
||||
this.nationalityCode,
|
||||
this.occupation,
|
||||
this.pCDTransactionDataResultList,
|
||||
this.pCDGetVidaPatientForManualVerificationList,
|
||||
this.pCDNHICHMGPatientDetailsMatchCalulationList,
|
||||
this.pCDReturnValue,
|
||||
this.patientStatus,
|
||||
this.placeofBirth,
|
||||
this.practitionerStatusCode,
|
||||
this.practitionerStatusDescAr,
|
||||
this.practitionerStatusDescEn,
|
||||
this.rowCount,
|
||||
this.secondNameAr,
|
||||
this.secondNameEn,
|
||||
this.thirdNameAr,
|
||||
this.thirdNameEn,
|
||||
this.yakeenVidaPatientDataStatisticsByPatientIdList,
|
||||
this.yakeenVidaPatientDataStatisticsList,
|
||||
this.yakeenVidaPatientDataStatisticsPrefferedList,
|
||||
this.accessToken,
|
||||
this.categoryCode,
|
||||
this.categoryNameAr,
|
||||
this.categoryNameEn,
|
||||
this.constraintCode,
|
||||
this.constraintNameAr,
|
||||
this.constraintNameEn,
|
||||
this.content,
|
||||
this.errorList,
|
||||
this.licenseExpiryDate,
|
||||
this.licenseIssuedDate,
|
||||
this.licenseStatusCode,
|
||||
this.licenseStatusDescAr,
|
||||
this.licenseStatusDescEn,
|
||||
this.organizations,
|
||||
this.registrationNumber,
|
||||
this.specialtyCode,
|
||||
this.specialtyNameAr,
|
||||
this.specialtyNameEn});
|
||||
|
||||
GetPatientInfoResponseModel.fromJson(Map<String, dynamic> json) {
|
||||
date = json['Date'];
|
||||
languageID = json['LanguageID'];
|
||||
serviceName = json['ServiceName'];
|
||||
time = json['Time'];
|
||||
androidLink = json['AndroidLink'];
|
||||
authenticationTokenID = json['AuthenticationTokenID'];
|
||||
data = json['Data'];
|
||||
dataw = json['Dataw'];
|
||||
dietType = json['DietType'];
|
||||
errorCode = json['ErrorCode'];
|
||||
errorEndUserMessage = json['ErrorEndUserMessage'];
|
||||
errorEndUserMessageN = json['ErrorEndUserMessageN'];
|
||||
errorMessage = json['ErrorMessage'];
|
||||
errorType = json['ErrorType'];
|
||||
foodCategory = json['FoodCategory'];
|
||||
iOSLink = json['IOSLink'];
|
||||
isAuthenticated = json['IsAuthenticated'];
|
||||
mealOrderStatus = json['MealOrderStatus'];
|
||||
mealType = json['MealType'];
|
||||
messageStatus = json['MessageStatus'];
|
||||
numberOfResultRecords = json['NumberOfResultRecords'];
|
||||
patientBlodType = json['PatientBlodType'];
|
||||
successMsg = json['SuccessMsg'];
|
||||
successMsgN = json['SuccessMsgN'];
|
||||
vidaUpdatedResponse = json['VidaUpdatedResponse'];
|
||||
accessTokenObject = json['AccessTokenObject'];
|
||||
age = json['Age'];
|
||||
clientIdentifierId = json['ClientIdentifierId'];
|
||||
createdBy = json['CreatedBy'];
|
||||
dateOfBirth = json['DateOfBirth'];
|
||||
firstNameAr = json['FirstNameAr'];
|
||||
firstNameEn = json['FirstNameEn'];
|
||||
gender = json['Gender'];
|
||||
genderAr = json['GenderAr'];
|
||||
genderEn = json['GenderEn'];
|
||||
healthId = json['HealthId'];
|
||||
idNumber = json['IdNumber'];
|
||||
idType = json['IdType'];
|
||||
isHijri = json['IsHijri'];
|
||||
isInstertedOrUpdated = json['IsInstertedOrUpdated'];
|
||||
isNull = json['IsNull'];
|
||||
isPatientExistNHIC = json['IsPatientExistNHIC'];
|
||||
isRecordLockedByCurrentUser = json['IsRecordLockedByCurrentUser'];
|
||||
lastNameAr = json['LastNameAr'];
|
||||
lastNameEn = json['LastNameEn'];
|
||||
listActiveAccessToken = json['List_ActiveAccessToken'];
|
||||
maritalStatus = json['MaritalStatus'];
|
||||
maritalStatusCode = json['MaritalStatusCode'];
|
||||
nationalDateOfBirth = json['NationalDateOfBirth'];
|
||||
nationality = json['Nationality'];
|
||||
nationalityCode = json['NationalityCode'];
|
||||
occupation = json['Occupation'];
|
||||
pCDTransactionDataResultList = json['PCDTransactionDataResultList'];
|
||||
pCDGetVidaPatientForManualVerificationList =
|
||||
json['PCD_GetVidaPatientForManualVerificationList'];
|
||||
pCDNHICHMGPatientDetailsMatchCalulationList =
|
||||
json['PCD_NHIC_HMG_PatientDetailsMatchCalulationList'];
|
||||
pCDReturnValue = json['PCD_ReturnValue'];
|
||||
patientStatus = json['PatientStatus'];
|
||||
placeofBirth = json['PlaceofBirth'];
|
||||
practitionerStatusCode = json['PractitionerStatusCode'];
|
||||
practitionerStatusDescAr = json['PractitionerStatusDescAr'];
|
||||
practitionerStatusDescEn = json['PractitionerStatusDescEn'];
|
||||
rowCount = json['RowCount'];
|
||||
secondNameAr = json['SecondNameAr'];
|
||||
secondNameEn = json['SecondNameEn'];
|
||||
thirdNameAr = json['ThirdNameAr'];
|
||||
thirdNameEn = json['ThirdNameEn'];
|
||||
yakeenVidaPatientDataStatisticsByPatientIdList =
|
||||
json['YakeenVidaPatientDataStatisticsByPatientIdList'];
|
||||
yakeenVidaPatientDataStatisticsList =
|
||||
json['YakeenVidaPatientDataStatisticsList'];
|
||||
yakeenVidaPatientDataStatisticsPrefferedList =
|
||||
json['YakeenVidaPatientDataStatisticsPrefferedList'];
|
||||
accessToken = json['accessToken'];
|
||||
categoryCode = json['categoryCode'];
|
||||
categoryNameAr = json['categoryNameAr'];
|
||||
categoryNameEn = json['categoryNameEn'];
|
||||
constraintCode = json['constraintCode'];
|
||||
constraintNameAr = json['constraintNameAr'];
|
||||
constraintNameEn = json['constraintNameEn'];
|
||||
content = json['content'];
|
||||
errorList = json['errorList'];
|
||||
licenseExpiryDate = json['licenseExpiryDate'];
|
||||
licenseIssuedDate = json['licenseIssuedDate'];
|
||||
licenseStatusCode = json['licenseStatusCode'];
|
||||
licenseStatusDescAr = json['licenseStatusDescAr'];
|
||||
licenseStatusDescEn = json['licenseStatusDescEn'];
|
||||
organizations = json['organizations'];
|
||||
registrationNumber = json['registrationNumber'];
|
||||
specialtyCode = json['specialtyCode'];
|
||||
specialtyNameAr = json['specialtyNameAr'];
|
||||
specialtyNameEn = json['specialtyNameEn'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['Date'] = this.date;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['ServiceName'] = this.serviceName;
|
||||
data['Time'] = this.time;
|
||||
data['AndroidLink'] = this.androidLink;
|
||||
data['AuthenticationTokenID'] = this.authenticationTokenID;
|
||||
data['Data'] = this.data;
|
||||
data['Dataw'] = this.dataw;
|
||||
data['DietType'] = this.dietType;
|
||||
data['ErrorCode'] = this.errorCode;
|
||||
data['ErrorEndUserMessage'] = this.errorEndUserMessage;
|
||||
data['ErrorEndUserMessageN'] = this.errorEndUserMessageN;
|
||||
data['ErrorMessage'] = this.errorMessage;
|
||||
data['ErrorType'] = this.errorType;
|
||||
data['FoodCategory'] = this.foodCategory;
|
||||
data['IOSLink'] = this.iOSLink;
|
||||
data['IsAuthenticated'] = this.isAuthenticated;
|
||||
data['MealOrderStatus'] = this.mealOrderStatus;
|
||||
data['MealType'] = this.mealType;
|
||||
data['MessageStatus'] = this.messageStatus;
|
||||
data['NumberOfResultRecords'] = this.numberOfResultRecords;
|
||||
data['PatientBlodType'] = this.patientBlodType;
|
||||
data['SuccessMsg'] = this.successMsg;
|
||||
data['SuccessMsgN'] = this.successMsgN;
|
||||
data['VidaUpdatedResponse'] = this.vidaUpdatedResponse;
|
||||
data['AccessTokenObject'] = this.accessTokenObject;
|
||||
data['Age'] = this.age;
|
||||
data['ClientIdentifierId'] = this.clientIdentifierId;
|
||||
data['CreatedBy'] = this.createdBy;
|
||||
data['DateOfBirth'] = this.dateOfBirth;
|
||||
data['FirstNameAr'] = this.firstNameAr;
|
||||
data['FirstNameEn'] = this.firstNameEn;
|
||||
data['Gender'] = this.gender;
|
||||
data['GenderAr'] = this.genderAr;
|
||||
data['GenderEn'] = this.genderEn;
|
||||
data['HealthId'] = this.healthId;
|
||||
data['IdNumber'] = this.idNumber;
|
||||
data['IdType'] = this.idType;
|
||||
data['IsHijri'] = this.isHijri;
|
||||
data['IsInstertedOrUpdated'] = this.isInstertedOrUpdated;
|
||||
data['IsNull'] = this.isNull;
|
||||
data['IsPatientExistNHIC'] = this.isPatientExistNHIC;
|
||||
data['IsRecordLockedByCurrentUser'] = this.isRecordLockedByCurrentUser;
|
||||
data['LastNameAr'] = this.lastNameAr;
|
||||
data['LastNameEn'] = this.lastNameEn;
|
||||
data['List_ActiveAccessToken'] = this.listActiveAccessToken;
|
||||
data['MaritalStatus'] = this.maritalStatus;
|
||||
data['MaritalStatusCode'] = this.maritalStatusCode;
|
||||
data['NationalDateOfBirth'] = this.nationalDateOfBirth;
|
||||
data['Nationality'] = this.nationality;
|
||||
data['NationalityCode'] = this.nationalityCode;
|
||||
data['Occupation'] = this.occupation;
|
||||
data['PCDTransactionDataResultList'] = this.pCDTransactionDataResultList;
|
||||
data['PCD_GetVidaPatientForManualVerificationList'] =
|
||||
this.pCDGetVidaPatientForManualVerificationList;
|
||||
data['PCD_NHIC_HMG_PatientDetailsMatchCalulationList'] =
|
||||
this.pCDNHICHMGPatientDetailsMatchCalulationList;
|
||||
data['PCD_ReturnValue'] = this.pCDReturnValue;
|
||||
data['PatientStatus'] = this.patientStatus;
|
||||
data['PlaceofBirth'] = this.placeofBirth;
|
||||
data['PractitionerStatusCode'] = this.practitionerStatusCode;
|
||||
data['PractitionerStatusDescAr'] = this.practitionerStatusDescAr;
|
||||
data['PractitionerStatusDescEn'] = this.practitionerStatusDescEn;
|
||||
data['RowCount'] = this.rowCount;
|
||||
data['SecondNameAr'] = this.secondNameAr;
|
||||
data['SecondNameEn'] = this.secondNameEn;
|
||||
data['ThirdNameAr'] = this.thirdNameAr;
|
||||
data['ThirdNameEn'] = this.thirdNameEn;
|
||||
data['YakeenVidaPatientDataStatisticsByPatientIdList'] =
|
||||
this.yakeenVidaPatientDataStatisticsByPatientIdList;
|
||||
data['YakeenVidaPatientDataStatisticsList'] =
|
||||
this.yakeenVidaPatientDataStatisticsList;
|
||||
data['YakeenVidaPatientDataStatisticsPrefferedList'] =
|
||||
this.yakeenVidaPatientDataStatisticsPrefferedList;
|
||||
data['accessToken'] = this.accessToken;
|
||||
data['categoryCode'] = this.categoryCode;
|
||||
data['categoryNameAr'] = this.categoryNameAr;
|
||||
data['categoryNameEn'] = this.categoryNameEn;
|
||||
data['constraintCode'] = this.constraintCode;
|
||||
data['constraintNameAr'] = this.constraintNameAr;
|
||||
data['constraintNameEn'] = this.constraintNameEn;
|
||||
data['content'] = this.content;
|
||||
data['errorList'] = this.errorList;
|
||||
data['licenseExpiryDate'] = this.licenseExpiryDate;
|
||||
data['licenseIssuedDate'] = this.licenseIssuedDate;
|
||||
data['licenseStatusCode'] = this.licenseStatusCode;
|
||||
data['licenseStatusDescAr'] = this.licenseStatusDescAr;
|
||||
data['licenseStatusDescEn'] = this.licenseStatusDescEn;
|
||||
data['organizations'] = this.organizations;
|
||||
data['registrationNumber'] = this.registrationNumber;
|
||||
data['specialtyCode'] = this.specialtyCode;
|
||||
data['specialtyNameAr'] = this.specialtyNameAr;
|
||||
data['specialtyNameEn'] = this.specialtyNameEn;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,185 @@
|
||||
class PatientRegistrationModel {
|
||||
Patientobject patientobject;
|
||||
String patientIdentificationID;
|
||||
String patientMobileNumber;
|
||||
String logInTokenID;
|
||||
double versionID;
|
||||
int channel;
|
||||
int languageID;
|
||||
String iPAdress;
|
||||
String generalid;
|
||||
int patientOutSA;
|
||||
Null sessionID;
|
||||
bool isDentalAllowedBackend;
|
||||
int deviceTypeID;
|
||||
String tokenID;
|
||||
String dOB;
|
||||
int isHijri;
|
||||
String healthId;
|
||||
String zipCode;
|
||||
|
||||
PatientRegistrationModel(
|
||||
{this.patientobject,
|
||||
this.patientIdentificationID,
|
||||
this.patientMobileNumber,
|
||||
this.logInTokenID,
|
||||
this.versionID,
|
||||
this.channel,
|
||||
this.languageID,
|
||||
this.iPAdress,
|
||||
this.generalid,
|
||||
this.patientOutSA,
|
||||
this.sessionID,
|
||||
this.isDentalAllowedBackend,
|
||||
this.deviceTypeID,
|
||||
this.tokenID,
|
||||
this.dOB,
|
||||
this.isHijri,
|
||||
this.healthId,
|
||||
this.zipCode});
|
||||
|
||||
PatientRegistrationModel.fromJson(Map<String, dynamic> json) {
|
||||
patientobject = json['Patientobject'] != null
|
||||
? new Patientobject.fromJson(json['Patientobject'])
|
||||
: null;
|
||||
patientIdentificationID = json['PatientIdentificationID'];
|
||||
patientMobileNumber = json['PatientMobileNumber'];
|
||||
logInTokenID = json['LogInTokenID'];
|
||||
versionID = json['VersionID'];
|
||||
channel = json['Channel'];
|
||||
languageID = json['LanguageID'];
|
||||
iPAdress = json['IPAdress'];
|
||||
generalid = json['generalid'];
|
||||
patientOutSA = json['PatientOutSA'];
|
||||
sessionID = json['SessionID'];
|
||||
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||
deviceTypeID = json['DeviceTypeID'];
|
||||
tokenID = json['TokenID'];
|
||||
dOB = json['DOB'];
|
||||
isHijri = json['IsHijri'];
|
||||
healthId = json['HealthId'];
|
||||
zipCode = json['ZipCode'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
if (this.patientobject != null) {
|
||||
data['Patientobject'] = this.patientobject.toJson();
|
||||
}
|
||||
data['PatientIdentificationID'] = this.patientIdentificationID;
|
||||
data['PatientMobileNumber'] = this.patientMobileNumber;
|
||||
data['LogInTokenID'] = this.logInTokenID;
|
||||
data['VersionID'] = this.versionID;
|
||||
data['Channel'] = this.channel;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['IPAdress'] = this.iPAdress;
|
||||
data['generalid'] = this.generalid;
|
||||
data['PatientOutSA'] = this.patientOutSA;
|
||||
data['SessionID'] = this.sessionID;
|
||||
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||
data['DeviceTypeID'] = this.deviceTypeID;
|
||||
data['TokenID'] = this.tokenID;
|
||||
data['DOB'] = this.dOB;
|
||||
data['IsHijri'] = this.isHijri;
|
||||
data['HealthId'] = this.healthId;
|
||||
data['ZipCode'] = this.zipCode;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class Patientobject {
|
||||
bool tempValue;
|
||||
int patientIdentificationType;
|
||||
String patientIdentificationNo;
|
||||
int mobileNumber;
|
||||
int patientOutSA;
|
||||
String firstNameN;
|
||||
String middleNameN;
|
||||
String lastNameN;
|
||||
String firstName;
|
||||
String middleName;
|
||||
String lastName;
|
||||
String strDateofBirth;
|
||||
String dateofBirth;
|
||||
int gender;
|
||||
String nationalityID;
|
||||
String dateofBirthN;
|
||||
String emailAddress;
|
||||
String sourceType;
|
||||
String preferredLanguage;
|
||||
String marital;
|
||||
String eHealthIDField;
|
||||
|
||||
Patientobject(
|
||||
{this.tempValue,
|
||||
this.patientIdentificationType,
|
||||
this.patientIdentificationNo,
|
||||
this.mobileNumber,
|
||||
this.patientOutSA,
|
||||
this.firstNameN,
|
||||
this.middleNameN,
|
||||
this.lastNameN,
|
||||
this.firstName,
|
||||
this.middleName,
|
||||
this.lastName,
|
||||
this.strDateofBirth,
|
||||
this.dateofBirth,
|
||||
this.gender,
|
||||
this.nationalityID,
|
||||
this.dateofBirthN,
|
||||
this.emailAddress,
|
||||
this.sourceType,
|
||||
this.preferredLanguage,
|
||||
this.marital,
|
||||
this.eHealthIDField});
|
||||
|
||||
Patientobject.fromJson(Map<String, dynamic> json) {
|
||||
tempValue = json['TempValue'];
|
||||
patientIdentificationType = json['PatientIdentificationType'];
|
||||
patientIdentificationNo = json['PatientIdentificationNo'];
|
||||
mobileNumber = json['MobileNumber'];
|
||||
patientOutSA = json['PatientOutSA'];
|
||||
firstNameN = json['FirstNameN'];
|
||||
middleNameN = json['MiddleNameN'];
|
||||
lastNameN = json['LastNameN'];
|
||||
firstName = json['FirstName'];
|
||||
middleName = json['MiddleName'];
|
||||
lastName = json['LastName'];
|
||||
strDateofBirth = json['StrDateofBirth'];
|
||||
dateofBirth = json['DateofBirth'];
|
||||
gender = json['Gender'];
|
||||
nationalityID = json['NationalityID'];
|
||||
dateofBirthN = json['DateofBirthN'];
|
||||
emailAddress = json['EmailAddress'];
|
||||
sourceType = json['SourceType'];
|
||||
preferredLanguage = json['PreferredLanguage'];
|
||||
marital = json['Marital'];
|
||||
eHealthIDField = json['eHealthIDField'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['TempValue'] = this.tempValue;
|
||||
data['PatientIdentificationType'] = this.patientIdentificationType;
|
||||
data['PatientIdentificationNo'] = this.patientIdentificationNo;
|
||||
data['MobileNumber'] = this.mobileNumber;
|
||||
data['PatientOutSA'] = this.patientOutSA;
|
||||
data['FirstNameN'] = this.firstNameN;
|
||||
data['MiddleNameN'] = this.middleNameN;
|
||||
data['LastNameN'] = this.lastNameN;
|
||||
data['FirstName'] = this.firstName;
|
||||
data['MiddleName'] = this.middleName;
|
||||
data['LastName'] = this.lastName;
|
||||
data['StrDateofBirth'] = this.strDateofBirth;
|
||||
data['DateofBirth'] = this.dateofBirth;
|
||||
data['Gender'] = this.gender;
|
||||
data['NationalityID'] = this.nationalityID;
|
||||
data['DateofBirthN'] = this.dateofBirthN;
|
||||
data['EmailAddress'] = this.emailAddress;
|
||||
data['SourceType'] = this.sourceType;
|
||||
data['PreferredLanguage'] = this.preferredLanguage;
|
||||
data['Marital'] = this.marital;
|
||||
data['eHealthIDField'] = this.eHealthIDField;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,109 @@
|
||||
class SendActivationCodeByOTPNotificationTypeForRegistrationModel {
|
||||
int patientMobileNumber;
|
||||
String mobileNo;
|
||||
int projectOutSA;
|
||||
int loginType;
|
||||
String zipCode;
|
||||
bool isRegister;
|
||||
String logInTokenID;
|
||||
int searchType;
|
||||
int patientID;
|
||||
int nationalID;
|
||||
int patientIdentificationID;
|
||||
int oTPSendType;
|
||||
int languageID;
|
||||
double versionID;
|
||||
int channel;
|
||||
String iPAdress;
|
||||
String generalid;
|
||||
int patientOutSA;
|
||||
Null sessionID;
|
||||
bool isDentalAllowedBackend;
|
||||
int deviceTypeID;
|
||||
String dOB;
|
||||
int isHijri;
|
||||
String healthId;
|
||||
|
||||
SendActivationCodeByOTPNotificationTypeForRegistrationModel(
|
||||
{this.patientMobileNumber,
|
||||
this.mobileNo,
|
||||
this.projectOutSA,
|
||||
this.loginType,
|
||||
this.zipCode,
|
||||
this.isRegister,
|
||||
this.logInTokenID,
|
||||
this.searchType,
|
||||
this.patientID,
|
||||
this.nationalID,
|
||||
this.patientIdentificationID,
|
||||
this.oTPSendType,
|
||||
this.languageID,
|
||||
this.versionID,
|
||||
this.channel,
|
||||
this.iPAdress,
|
||||
this.generalid,
|
||||
this.patientOutSA,
|
||||
this.sessionID,
|
||||
this.isDentalAllowedBackend,
|
||||
this.deviceTypeID,
|
||||
this.dOB,
|
||||
this.isHijri,
|
||||
this.healthId});
|
||||
|
||||
SendActivationCodeByOTPNotificationTypeForRegistrationModel.fromJson(
|
||||
Map<String, dynamic> json) {
|
||||
patientMobileNumber = json['PatientMobileNumber'];
|
||||
mobileNo = json['MobileNo'];
|
||||
projectOutSA = json['ProjectOutSA'];
|
||||
loginType = json['LoginType'];
|
||||
zipCode = json['ZipCode'];
|
||||
isRegister = json['isRegister'];
|
||||
logInTokenID = json['LogInTokenID'];
|
||||
searchType = json['SearchType'];
|
||||
patientID = json['PatientID'];
|
||||
nationalID = json['NationalID'];
|
||||
patientIdentificationID = json['PatientIdentificationID'];
|
||||
oTPSendType = json['OTP_SendType'];
|
||||
languageID = json['LanguageID'];
|
||||
versionID = json['VersionID'];
|
||||
channel = json['Channel'];
|
||||
iPAdress = json['IPAdress'];
|
||||
generalid = json['generalid'];
|
||||
patientOutSA = json['PatientOutSA'];
|
||||
sessionID = json['SessionID'];
|
||||
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||
deviceTypeID = json['DeviceTypeID'];
|
||||
dOB = json['DOB'];
|
||||
isHijri = json['IsHijri'];
|
||||
healthId = json['HealthId'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['PatientMobileNumber'] = this.patientMobileNumber;
|
||||
data['MobileNo'] = this.mobileNo;
|
||||
data['ProjectOutSA'] = this.projectOutSA;
|
||||
data['LoginType'] = this.loginType;
|
||||
data['ZipCode'] = this.zipCode;
|
||||
data['isRegister'] = this.isRegister;
|
||||
data['LogInTokenID'] = this.logInTokenID;
|
||||
data['SearchType'] = this.searchType;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['NationalID'] = this.nationalID;
|
||||
data['PatientIdentificationID'] = this.patientIdentificationID;
|
||||
data['OTP_SendType'] = this.oTPSendType;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['VersionID'] = this.versionID;
|
||||
data['Channel'] = this.channel;
|
||||
data['IPAdress'] = this.iPAdress;
|
||||
data['generalid'] = this.generalid;
|
||||
data['PatientOutSA'] = this.patientOutSA;
|
||||
data['SessionID'] = this.sessionID;
|
||||
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||
data['DeviceTypeID'] = this.deviceTypeID;
|
||||
data['DOB'] = this.dOB;
|
||||
data['IsHijri'] = this.isHijri;
|
||||
data['HealthId'] = this.healthId;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,157 @@
|
||||
class GetMedicationForInPatientModel {
|
||||
String setupID;
|
||||
int projectID;
|
||||
int admissionNo;
|
||||
int patientID;
|
||||
int orderNo;
|
||||
int prescriptionNo;
|
||||
int lineItemNo;
|
||||
String prescriptionDatetime;
|
||||
int itemID;
|
||||
int directionID;
|
||||
int refillID;
|
||||
String dose;
|
||||
int unitofMeasurement;
|
||||
String startDatetime;
|
||||
String stopDatetime;
|
||||
int noOfDoses;
|
||||
int routeId;
|
||||
String comments;
|
||||
int reviewedPharmacist;
|
||||
dynamic reviewedPharmacistDatetime;
|
||||
dynamic discountinueDatetime;
|
||||
dynamic rescheduleDatetime;
|
||||
int status;
|
||||
String statusDescription;
|
||||
int createdBy;
|
||||
String createdOn;
|
||||
dynamic editedBy;
|
||||
dynamic editedOn;
|
||||
dynamic strength;
|
||||
String pHRItemDescription;
|
||||
String pHRItemDescriptionN;
|
||||
String doctorName;
|
||||
String uomDescription;
|
||||
String routeDescription;
|
||||
String directionDescription;
|
||||
String refillDescription;
|
||||
|
||||
GetMedicationForInPatientModel(
|
||||
{this.setupID,
|
||||
this.projectID,
|
||||
this.admissionNo,
|
||||
this.patientID,
|
||||
this.orderNo,
|
||||
this.prescriptionNo,
|
||||
this.lineItemNo,
|
||||
this.prescriptionDatetime,
|
||||
this.itemID,
|
||||
this.directionID,
|
||||
this.refillID,
|
||||
this.dose,
|
||||
this.unitofMeasurement,
|
||||
this.startDatetime,
|
||||
this.stopDatetime,
|
||||
this.noOfDoses,
|
||||
this.routeId,
|
||||
this.comments,
|
||||
this.reviewedPharmacist,
|
||||
this.reviewedPharmacistDatetime,
|
||||
this.discountinueDatetime,
|
||||
this.rescheduleDatetime,
|
||||
this.status,
|
||||
this.statusDescription,
|
||||
this.createdBy,
|
||||
this.createdOn,
|
||||
this.editedBy,
|
||||
this.editedOn,
|
||||
this.strength,
|
||||
this.pHRItemDescription,
|
||||
this.pHRItemDescriptionN,
|
||||
this.doctorName,
|
||||
this.uomDescription,
|
||||
this.routeDescription,
|
||||
this.directionDescription,
|
||||
this.refillDescription});
|
||||
|
||||
GetMedicationForInPatientModel.fromJson(Map<String, dynamic> json) {
|
||||
setupID = json['SetupID'];
|
||||
projectID = json['ProjectID'];
|
||||
doctorName = json['DoctorName'];
|
||||
refillDescription = json['RefillDescription'];
|
||||
directionDescription = json['DirectionDescription'];
|
||||
routeDescription = json['RouteDescription'];
|
||||
|
||||
uomDescription = json['UOMDescription'];
|
||||
admissionNo = json['AdmissionNo'];
|
||||
patientID = json['PatientID'];
|
||||
orderNo = json['OrderNo'];
|
||||
prescriptionNo = json['PrescriptionNo'];
|
||||
lineItemNo = json['LineItemNo'];
|
||||
prescriptionDatetime = json['PrescriptionDatetime'];
|
||||
itemID = json['ItemID'];
|
||||
directionID = json['DirectionID'];
|
||||
refillID = json['RefillID'];
|
||||
dose = json['Dose'];
|
||||
unitofMeasurement = json['UnitofMeasurement'];
|
||||
startDatetime = json['StartDatetime'];
|
||||
stopDatetime = json['StopDatetime'];
|
||||
noOfDoses = json['NoOfDoses'];
|
||||
routeId = json['RouteId'];
|
||||
comments = json['Comments'];
|
||||
reviewedPharmacist = json['ReviewedPharmacist'];
|
||||
reviewedPharmacistDatetime = json['ReviewedPharmacistDatetime'];
|
||||
discountinueDatetime = json['DiscountinueDatetime'];
|
||||
rescheduleDatetime = json['RescheduleDatetime'];
|
||||
status = json['Status'];
|
||||
statusDescription = json['StatusDescription'];
|
||||
createdBy = json['CreatedBy'];
|
||||
createdOn = json['CreatedOn'];
|
||||
editedBy = json['EditedBy'];
|
||||
editedOn = json['EditedOn'];
|
||||
strength = json['Strength'];
|
||||
pHRItemDescription = json['PHRItemDescription'];
|
||||
pHRItemDescriptionN = json['PHRItemDescriptionN'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['SetupID'] = this.setupID;
|
||||
data['DoctorName'] = this.doctorName;
|
||||
data['RefillDescription'] = this.refillDescription;
|
||||
data['RouteDescription'] = this.routeDescription;
|
||||
data['DirectionDescription'] = this.directionDescription;
|
||||
data['UOMDescription'] = this.uomDescription;
|
||||
data['ProjectID'] = this.projectID;
|
||||
data['AdmissionNo'] = this.admissionNo;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['OrderNo'] = this.orderNo;
|
||||
data['PrescriptionNo'] = this.prescriptionNo;
|
||||
data['LineItemNo'] = this.lineItemNo;
|
||||
data['PrescriptionDatetime'] = this.prescriptionDatetime;
|
||||
data['ItemID'] = this.itemID;
|
||||
data['DirectionID'] = this.directionID;
|
||||
data['RefillID'] = this.refillID;
|
||||
data['Dose'] = this.dose;
|
||||
data['UnitofMeasurement'] = this.unitofMeasurement;
|
||||
data['StartDatetime'] = this.startDatetime;
|
||||
data['StopDatetime'] = this.stopDatetime;
|
||||
data['NoOfDoses'] = this.noOfDoses;
|
||||
data['RouteId'] = this.routeId;
|
||||
data['Comments'] = this.comments;
|
||||
data['ReviewedPharmacist'] = this.reviewedPharmacist;
|
||||
data['ReviewedPharmacistDatetime'] = this.reviewedPharmacistDatetime;
|
||||
data['DiscountinueDatetime'] = this.discountinueDatetime;
|
||||
data['RescheduleDatetime'] = this.rescheduleDatetime;
|
||||
data['Status'] = this.status;
|
||||
data['StatusDescription'] = this.statusDescription;
|
||||
data['CreatedBy'] = this.createdBy;
|
||||
data['CreatedOn'] = this.createdOn;
|
||||
data['EditedBy'] = this.editedBy;
|
||||
data['EditedOn'] = this.editedOn;
|
||||
data['Strength'] = this.strength;
|
||||
data['PHRItemDescription'] = this.pHRItemDescription;
|
||||
data['PHRItemDescriptionN'] = this.pHRItemDescriptionN;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,60 @@
|
||||
class GetMedicationForInPatientRequestModel {
|
||||
bool isDentalAllowedBackend;
|
||||
double versionID;
|
||||
int channel;
|
||||
int languageID;
|
||||
String iPAdress;
|
||||
String generalid;
|
||||
int deviceTypeID;
|
||||
String tokenID;
|
||||
int patientID;
|
||||
int admissionNo;
|
||||
String sessionID;
|
||||
int projectID;
|
||||
|
||||
GetMedicationForInPatientRequestModel(
|
||||
{this.isDentalAllowedBackend,
|
||||
this.versionID,
|
||||
this.channel,
|
||||
this.languageID,
|
||||
this.iPAdress,
|
||||
this.generalid,
|
||||
this.deviceTypeID,
|
||||
this.tokenID,
|
||||
this.patientID,
|
||||
this.admissionNo,
|
||||
this.sessionID,
|
||||
this.projectID});
|
||||
|
||||
GetMedicationForInPatientRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||
versionID = json['VersionID'];
|
||||
channel = json['Channel'];
|
||||
languageID = json['LanguageID'];
|
||||
iPAdress = json['IPAdress'];
|
||||
generalid = json['generalid'];
|
||||
deviceTypeID = json['DeviceTypeID'];
|
||||
tokenID = json['TokenID'];
|
||||
patientID = json['PatientID'];
|
||||
admissionNo = json['AdmissionNo'];
|
||||
sessionID = json['SessionID'];
|
||||
projectID = json['ProjectID'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||
data['VersionID'] = this.versionID;
|
||||
data['Channel'] = this.channel;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['IPAdress'] = this.iPAdress;
|
||||
data['generalid'] = this.generalid;
|
||||
data['DeviceTypeID'] = this.deviceTypeID;
|
||||
data['TokenID'] = this.tokenID;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['AdmissionNo'] = this.admissionNo;
|
||||
data['SessionID'] = this.sessionID;
|
||||
data['ProjectID'] = this.projectID;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -1,52 +1,43 @@
|
||||
class ActivationCodeModel {
|
||||
late String? mobileNumber;
|
||||
late String? zipCode;
|
||||
late int? channel;
|
||||
late int? loginDoctorID;
|
||||
late int? languageID;
|
||||
late double? versionID;
|
||||
late int? memberID;
|
||||
late String? password;
|
||||
late int? facilityId;
|
||||
late String? generalid;
|
||||
late String? otpSendType;
|
||||
|
||||
ActivationCodeModel(
|
||||
{this.mobileNumber,
|
||||
this.zipCode,
|
||||
this.channel,
|
||||
{this.channel,
|
||||
this.languageID,
|
||||
this.versionID,
|
||||
this.memberID,
|
||||
this.password,
|
||||
this.facilityId,
|
||||
this.otpSendType,
|
||||
this.generalid});
|
||||
this.generalid,this.loginDoctorID});
|
||||
|
||||
ActivationCodeModel.fromJson(Map<String, dynamic> json) {
|
||||
mobileNumber = json['MobileNumber'];
|
||||
zipCode = json['ZipCode'];
|
||||
channel = json['Channel'];
|
||||
languageID = json['LanguageID'];
|
||||
versionID = json['VersionID'];
|
||||
memberID = json['MemberID'];
|
||||
password = json['Password'];
|
||||
facilityId = json['facilityId'];
|
||||
otpSendType = json['OTP_SendType'];
|
||||
generalid = json['generalid'];
|
||||
loginDoctorID = json['LoginDoctorID'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['MobileNumber'] = this.mobileNumber;
|
||||
data['ZipCode'] = this.zipCode;
|
||||
data['Channel'] = this.channel;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['VersionID'] = this.versionID;
|
||||
data['MemberID'] = this.memberID;
|
||||
data['Password'] = this.password;
|
||||
data['facilityId'] = this.facilityId;
|
||||
data['OTP_SendType'] = otpSendType;
|
||||
data['generalid'] = this.generalid;
|
||||
data['LoginDoctorID'] = this.loginDoctorID;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,21 @@
|
||||
class DiabeticType {
|
||||
int value;
|
||||
String nameEn;
|
||||
String nameAr;
|
||||
|
||||
DiabeticType({this.value, this.nameEn, this.nameAr});
|
||||
|
||||
DiabeticType.fromJson(Map<String, dynamic> json) {
|
||||
value = json['value'];
|
||||
nameEn = json['nameEn'];
|
||||
nameAr = json['nameAr'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['value'] = this.value;
|
||||
data['nameEn'] = this.nameEn;
|
||||
data['nameAr'] = this.nameAr;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
class GetDiabeticChartValuesRequestModel {
|
||||
int deviceTypeID;
|
||||
int patientID;
|
||||
int resultType;
|
||||
int admissionNo;
|
||||
String setupID;
|
||||
bool patientOutSA;
|
||||
int patientType;
|
||||
int patientTypeID;
|
||||
|
||||
GetDiabeticChartValuesRequestModel(
|
||||
{this.deviceTypeID,
|
||||
this.patientID,
|
||||
this.resultType,
|
||||
this.admissionNo,
|
||||
this.setupID,
|
||||
this.patientOutSA,
|
||||
this.patientType,
|
||||
this.patientTypeID});
|
||||
|
||||
GetDiabeticChartValuesRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
deviceTypeID = json['DeviceTypeID'];
|
||||
patientID = json['PatientID'];
|
||||
resultType = json['ResultType'];
|
||||
admissionNo = json['AdmissionNo'];
|
||||
setupID = json['SetupID'];
|
||||
patientOutSA = json['PatientOutSA'];
|
||||
patientType = json['PatientType'];
|
||||
patientTypeID = json['PatientTypeID'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['DeviceTypeID'] = this.deviceTypeID;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['ResultType'] = this.resultType;
|
||||
data['AdmissionNo'] = this.admissionNo;
|
||||
data['SetupID'] = this.setupID;
|
||||
data['PatientOutSA'] = this.patientOutSA;
|
||||
data['PatientType'] = this.patientType;
|
||||
data['PatientTypeID'] = this.patientTypeID;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,36 @@
|
||||
class GetDiabeticChartValuesResponseModel {
|
||||
String resultType;
|
||||
int admissionNo;
|
||||
String dateChart;
|
||||
int resultValue;
|
||||
int createdBy;
|
||||
String createdOn;
|
||||
|
||||
GetDiabeticChartValuesResponseModel(
|
||||
{this.resultType,
|
||||
this.admissionNo,
|
||||
this.dateChart,
|
||||
this.resultValue,
|
||||
this.createdBy,
|
||||
this.createdOn});
|
||||
|
||||
GetDiabeticChartValuesResponseModel.fromJson(Map<String, dynamic> json) {
|
||||
resultType = json['ResultType'];
|
||||
admissionNo = json['AdmissionNo'];
|
||||
dateChart = json['DateChart'];
|
||||
resultValue = json['ResultValue'];
|
||||
createdBy = json['CreatedBy'];
|
||||
createdOn = json['CreatedOn'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['ResultType'] = this.resultType;
|
||||
data['AdmissionNo'] = this.admissionNo;
|
||||
data['DateChart'] = this.dateChart;
|
||||
data['ResultValue'] = this.resultValue;
|
||||
data['CreatedBy'] = this.createdBy;
|
||||
data['CreatedOn'] = this.createdOn;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
class GetDiagnosisForInPatientRequestModel {
|
||||
int patientID;
|
||||
int admissionNo;
|
||||
String setupID;
|
||||
int patientType;
|
||||
int patientTypeID;
|
||||
|
||||
GetDiagnosisForInPatientRequestModel(
|
||||
{this.patientID,
|
||||
this.admissionNo,
|
||||
this.setupID,
|
||||
this.patientType,
|
||||
this.patientTypeID});
|
||||
|
||||
GetDiagnosisForInPatientRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
patientID = json['PatientID'];
|
||||
admissionNo = json['AdmissionNo'];
|
||||
setupID = json['SetupID'];
|
||||
patientType = json['PatientType'];
|
||||
patientTypeID = json['PatientTypeID'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['PatientID'] = this.patientID;
|
||||
data['AdmissionNo'] = this.admissionNo;
|
||||
data['SetupID'] = this.setupID;
|
||||
data['PatientType'] = this.patientType;
|
||||
data['PatientTypeID'] = this.patientTypeID;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,52 @@
|
||||
class GetDiagnosisForInPatientResponseModel {
|
||||
String iCDCode10ID;
|
||||
int diagnosisTypeID;
|
||||
int conditionID;
|
||||
bool complexDiagnosis;
|
||||
String asciiDesc;
|
||||
int createdBy;
|
||||
String createdOn;
|
||||
int editedBy;
|
||||
String editedOn;
|
||||
String createdByName;
|
||||
String editedByName;
|
||||
|
||||
GetDiagnosisForInPatientResponseModel(
|
||||
{this.iCDCode10ID,
|
||||
this.diagnosisTypeID,
|
||||
this.conditionID,
|
||||
this.complexDiagnosis,
|
||||
this.asciiDesc,
|
||||
this.createdBy,
|
||||
this.createdOn,
|
||||
this.editedBy,
|
||||
this.editedOn, this.createdByName});
|
||||
|
||||
GetDiagnosisForInPatientResponseModel.fromJson(Map<String, dynamic> json) {
|
||||
iCDCode10ID = json['ICDCode10ID'];
|
||||
diagnosisTypeID = json['DiagnosisTypeID'];
|
||||
conditionID = json['ConditionID'];
|
||||
complexDiagnosis = json['ComplexDiagnosis'];
|
||||
asciiDesc = json['Ascii_Desc'];
|
||||
createdBy = json['CreatedBy'];
|
||||
createdOn = json['CreatedOn'];
|
||||
editedBy = json['EditedBy'];
|
||||
editedOn = json['EditedOn'];
|
||||
createdByName = json['CreatedByName'];
|
||||
editedByName = json['EditedByName'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['ICDCode10ID'] = this.iCDCode10ID;
|
||||
data['DiagnosisTypeID'] = this.diagnosisTypeID;
|
||||
data['ConditionID'] = this.conditionID;
|
||||
data['ComplexDiagnosis'] = this.complexDiagnosis;
|
||||
data['Ascii_Desc'] = this.asciiDesc;
|
||||
data['CreatedBy'] = this.createdBy;
|
||||
data['CreatedOn'] = this.createdOn;
|
||||
data['EditedBy'] = this.editedBy;
|
||||
data['EditedOn'] = this.editedOn;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,108 @@
|
||||
class LabResultHistory {
|
||||
String description;
|
||||
String femaleInterpretativeData;
|
||||
int gender;
|
||||
bool isCertificateAllowed;
|
||||
int lineItemNo;
|
||||
String maleInterpretativeData;
|
||||
String notes;
|
||||
int orderLineItemNo;
|
||||
int orderNo;
|
||||
String packageID;
|
||||
int patientID;
|
||||
String projectID;
|
||||
String referanceRange;
|
||||
String resultValue;
|
||||
int resultValueBasedLineItemNo;
|
||||
String resultValueFlag;
|
||||
String sampleCollectedOn;
|
||||
String sampleReceivedOn;
|
||||
String setupID;
|
||||
String superVerifiedOn;
|
||||
String testCode;
|
||||
String uOM;
|
||||
String verifiedOn;
|
||||
String verifiedOnDateTime;
|
||||
|
||||
LabResultHistory(
|
||||
{this.description,
|
||||
this.femaleInterpretativeData,
|
||||
this.gender,
|
||||
this.isCertificateAllowed,
|
||||
this.lineItemNo,
|
||||
this.maleInterpretativeData,
|
||||
this.notes,
|
||||
this.orderLineItemNo,
|
||||
this.orderNo,
|
||||
this.packageID,
|
||||
this.patientID,
|
||||
this.projectID,
|
||||
this.referanceRange,
|
||||
this.resultValue,
|
||||
this.resultValueBasedLineItemNo,
|
||||
this.resultValueFlag,
|
||||
this.sampleCollectedOn,
|
||||
this.sampleReceivedOn,
|
||||
this.setupID,
|
||||
this.superVerifiedOn,
|
||||
this.testCode,
|
||||
this.uOM,
|
||||
this.verifiedOn,
|
||||
this.verifiedOnDateTime});
|
||||
|
||||
LabResultHistory.fromJson(Map<String, dynamic> json) {
|
||||
description = json['Description'];
|
||||
femaleInterpretativeData = json['FemaleInterpretativeData'];
|
||||
gender = json['Gender'];
|
||||
isCertificateAllowed = json['IsCertificateAllowed'];
|
||||
lineItemNo = json['LineItemNo'];
|
||||
maleInterpretativeData = json['MaleInterpretativeData'];
|
||||
notes = json['Notes'];
|
||||
orderLineItemNo = json['OrderLineItemNo'];
|
||||
orderNo = json['OrderNo'];
|
||||
packageID = json['PackageID'];
|
||||
patientID = json['PatientID'];
|
||||
projectID = json['ProjectID'];
|
||||
referanceRange = json['ReferanceRange'];
|
||||
resultValue = json['ResultValue'];
|
||||
resultValueBasedLineItemNo = json['ResultValueBasedLineItemNo'];
|
||||
resultValueFlag = json['ResultValueFlag'];
|
||||
sampleCollectedOn = json['SampleCollectedOn'];
|
||||
sampleReceivedOn = json['SampleReceivedOn'];
|
||||
setupID = json['SetupID'];
|
||||
superVerifiedOn = json['SuperVerifiedOn'];
|
||||
testCode = json['TestCode'];
|
||||
uOM = json['UOM'];
|
||||
verifiedOn = json['VerifiedOn'];
|
||||
verifiedOnDateTime = json['VerifiedOnDateTime'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['Description'] = this.description;
|
||||
data['FemaleInterpretativeData'] = this.femaleInterpretativeData;
|
||||
data['Gender'] = this.gender;
|
||||
data['IsCertificateAllowed'] = this.isCertificateAllowed;
|
||||
data['LineItemNo'] = this.lineItemNo;
|
||||
data['MaleInterpretativeData'] = this.maleInterpretativeData;
|
||||
data['Notes'] = this.notes;
|
||||
data['OrderLineItemNo'] = this.orderLineItemNo;
|
||||
data['OrderNo'] = this.orderNo;
|
||||
data['PackageID'] = this.packageID;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['ProjectID'] = this.projectID;
|
||||
data['ReferanceRange'] = this.referanceRange;
|
||||
data['ResultValue'] = this.resultValue;
|
||||
data['ResultValueBasedLineItemNo'] = this.resultValueBasedLineItemNo;
|
||||
data['ResultValueFlag'] = this.resultValueFlag;
|
||||
data['SampleCollectedOn'] = this.sampleCollectedOn;
|
||||
data['SampleReceivedOn'] = this.sampleReceivedOn;
|
||||
data['SetupID'] = this.setupID;
|
||||
data['SuperVerifiedOn'] = this.superVerifiedOn;
|
||||
data['TestCode'] = this.testCode;
|
||||
data['UOM'] = this.uOM;
|
||||
data['VerifiedOn'] = this.verifiedOn;
|
||||
data['VerifiedOnDateTime'] = this.verifiedOnDateTime;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,216 @@
|
||||
class AllSpecialLabResultModel {
|
||||
dynamic actualDoctorRate;
|
||||
dynamic admissionDate;
|
||||
dynamic admissionNumber;
|
||||
dynamic appointmentDate;
|
||||
dynamic appointmentNo;
|
||||
dynamic appointmentTime;
|
||||
String clinicDescription;
|
||||
String clinicDescriptionEnglish;
|
||||
dynamic clinicDescriptionN;
|
||||
dynamic clinicID;
|
||||
dynamic createdOn;
|
||||
double decimalDoctorRate;
|
||||
dynamic doctorID;
|
||||
String doctorImageURL;
|
||||
String doctorName;
|
||||
String doctorNameEnglish;
|
||||
dynamic doctorNameN;
|
||||
dynamic doctorRate;
|
||||
dynamic doctorStarsRate;
|
||||
String doctorTitle;
|
||||
dynamic gender;
|
||||
String genderDescription;
|
||||
bool inOutPatient;
|
||||
String invoiceNo;
|
||||
bool isActiveDoctorProfile;
|
||||
bool isDoctorAllowVedioCall;
|
||||
bool isExecludeDoctor;
|
||||
bool isInOutPatient;
|
||||
dynamic isInOutPatientDescription;
|
||||
dynamic isInOutPatientDescriptionN;
|
||||
bool isLiveCareAppointment;
|
||||
bool isRead;
|
||||
bool isSendEmail;
|
||||
String moduleID;
|
||||
String nationalityFlagURL;
|
||||
dynamic noOfPatientsRate;
|
||||
dynamic orderDate;
|
||||
String orderNo;
|
||||
dynamic patientID;
|
||||
String projectID;
|
||||
String projectName;
|
||||
dynamic projectNameN;
|
||||
String qR;
|
||||
String resultData;
|
||||
String resultDataHTML;
|
||||
dynamic resultDataTxt;
|
||||
String setupID;
|
||||
//List<String> speciality;
|
||||
dynamic status;
|
||||
dynamic statusDesc;
|
||||
String strOrderDate;
|
||||
|
||||
AllSpecialLabResultModel(
|
||||
{this.actualDoctorRate,
|
||||
this.admissionDate,
|
||||
this.admissionNumber,
|
||||
this.appointmentDate,
|
||||
this.appointmentNo,
|
||||
this.appointmentTime,
|
||||
this.clinicDescription,
|
||||
this.clinicDescriptionEnglish,
|
||||
this.clinicDescriptionN,
|
||||
this.clinicID,
|
||||
this.createdOn,
|
||||
this.decimalDoctorRate,
|
||||
this.doctorID,
|
||||
this.doctorImageURL,
|
||||
this.doctorName,
|
||||
this.doctorNameEnglish,
|
||||
this.doctorNameN,
|
||||
this.doctorRate,
|
||||
this.doctorStarsRate,
|
||||
this.doctorTitle,
|
||||
this.gender,
|
||||
this.genderDescription,
|
||||
this.inOutPatient,
|
||||
this.invoiceNo,
|
||||
this.isActiveDoctorProfile,
|
||||
this.isDoctorAllowVedioCall,
|
||||
this.isExecludeDoctor,
|
||||
this.isInOutPatient,
|
||||
this.isInOutPatientDescription,
|
||||
this.isInOutPatientDescriptionN,
|
||||
this.isLiveCareAppointment,
|
||||
this.isRead,
|
||||
this.isSendEmail,
|
||||
this.moduleID,
|
||||
this.nationalityFlagURL,
|
||||
this.noOfPatientsRate,
|
||||
this.orderDate,
|
||||
this.orderNo,
|
||||
this.patientID,
|
||||
this.projectID,
|
||||
this.projectName,
|
||||
this.projectNameN,
|
||||
this.qR,
|
||||
this.resultData,
|
||||
this.resultDataHTML,
|
||||
this.resultDataTxt,
|
||||
this.setupID,
|
||||
//this.speciality,
|
||||
this.status,
|
||||
this.statusDesc,
|
||||
this.strOrderDate});
|
||||
|
||||
AllSpecialLabResultModel.fromJson(Map<String, dynamic> json) {
|
||||
actualDoctorRate = json['ActualDoctorRate'];
|
||||
admissionDate = json['AdmissionDate'];
|
||||
admissionNumber = json['AdmissionNumber'];
|
||||
appointmentDate = json['AppointmentDate'];
|
||||
appointmentNo = json['AppointmentNo'];
|
||||
appointmentTime = json['AppointmentTime'];
|
||||
clinicDescription = json['ClinicDescription'];
|
||||
clinicDescriptionEnglish = json['ClinicDescriptionEnglish'];
|
||||
clinicDescriptionN = json['ClinicDescriptionN'];
|
||||
clinicID = json['ClinicID'];
|
||||
createdOn = json['CreatedOn'];
|
||||
decimalDoctorRate = json['DecimalDoctorRate'];
|
||||
doctorID = json['DoctorID'];
|
||||
doctorImageURL = json['DoctorImageURL'];
|
||||
doctorName = json['DoctorName'];
|
||||
doctorNameEnglish = json['DoctorNameEnglish'];
|
||||
doctorNameN = json['DoctorNameN'];
|
||||
doctorRate = json['DoctorRate'];
|
||||
doctorStarsRate = json['DoctorStarsRate'];
|
||||
doctorTitle = json['DoctorTitle'];
|
||||
gender = json['Gender'];
|
||||
genderDescription = json['GenderDescription'];
|
||||
inOutPatient = json['InOutPatient'];
|
||||
invoiceNo = json['InvoiceNo'];
|
||||
isActiveDoctorProfile = json['IsActiveDoctorProfile'];
|
||||
isDoctorAllowVedioCall = json['IsDoctorAllowVedioCall'];
|
||||
isExecludeDoctor = json['IsExecludeDoctor'];
|
||||
isInOutPatient = json['IsInOutPatient'];
|
||||
isInOutPatientDescription = json['IsInOutPatientDescription'];
|
||||
isInOutPatientDescriptionN = json['IsInOutPatientDescriptionN'];
|
||||
isLiveCareAppointment = json['IsLiveCareAppointment'];
|
||||
isRead = json['IsRead'];
|
||||
isSendEmail = json['IsSendEmail'];
|
||||
moduleID = json['ModuleID'];
|
||||
nationalityFlagURL = json['NationalityFlagURL'];
|
||||
noOfPatientsRate = json['NoOfPatientsRate'];
|
||||
orderDate = json['OrderDate'];
|
||||
orderNo = json['OrderNo'];
|
||||
patientID = json['PatientID'];
|
||||
projectID = json['ProjectID'];
|
||||
projectName = json['ProjectName'];
|
||||
projectNameN = json['ProjectNameN'];
|
||||
qR = json['QR'];
|
||||
resultData = json['ResultData'];
|
||||
resultDataHTML = json['ResultDataHTML'];
|
||||
resultDataTxt = json['ResultDataTxt'];
|
||||
setupID = json['SetupID'];
|
||||
//speciality = json['Speciality'].cast<String>();
|
||||
status = json['Status'];
|
||||
statusDesc = json['StatusDesc'];
|
||||
strOrderDate = json['StrOrderDate'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['ActualDoctorRate'] = this.actualDoctorRate;
|
||||
data['AdmissionDate'] = this.admissionDate;
|
||||
data['AdmissionNumber'] = this.admissionNumber;
|
||||
data['AppointmentDate'] = this.appointmentDate;
|
||||
data['AppointmentNo'] = this.appointmentNo;
|
||||
data['AppointmentTime'] = this.appointmentTime;
|
||||
data['ClinicDescription'] = this.clinicDescription;
|
||||
data['ClinicDescriptionEnglish'] = this.clinicDescriptionEnglish;
|
||||
data['ClinicDescriptionN'] = this.clinicDescriptionN;
|
||||
data['ClinicID'] = this.clinicID;
|
||||
data['CreatedOn'] = this.createdOn;
|
||||
data['DecimalDoctorRate'] = this.decimalDoctorRate;
|
||||
data['DoctorID'] = this.doctorID;
|
||||
data['DoctorImageURL'] = this.doctorImageURL;
|
||||
data['DoctorName'] = this.doctorName;
|
||||
data['DoctorNameEnglish'] = this.doctorNameEnglish;
|
||||
data['DoctorNameN'] = this.doctorNameN;
|
||||
data['DoctorRate'] = this.doctorRate;
|
||||
data['DoctorStarsRate'] = this.doctorStarsRate;
|
||||
data['DoctorTitle'] = this.doctorTitle;
|
||||
data['Gender'] = this.gender;
|
||||
data['GenderDescription'] = this.genderDescription;
|
||||
data['InOutPatient'] = this.inOutPatient;
|
||||
data['InvoiceNo'] = this.invoiceNo;
|
||||
data['IsActiveDoctorProfile'] = this.isActiveDoctorProfile;
|
||||
data['IsDoctorAllowVedioCall'] = this.isDoctorAllowVedioCall;
|
||||
data['IsExecludeDoctor'] = this.isExecludeDoctor;
|
||||
data['IsInOutPatient'] = this.isInOutPatient;
|
||||
data['IsInOutPatientDescription'] = this.isInOutPatientDescription;
|
||||
data['IsInOutPatientDescriptionN'] = this.isInOutPatientDescriptionN;
|
||||
data['IsLiveCareAppointment'] = this.isLiveCareAppointment;
|
||||
data['IsRead'] = this.isRead;
|
||||
data['IsSendEmail'] = this.isSendEmail;
|
||||
data['ModuleID'] = this.moduleID;
|
||||
data['NationalityFlagURL'] = this.nationalityFlagURL;
|
||||
data['NoOfPatientsRate'] = this.noOfPatientsRate;
|
||||
data['OrderDate'] = this.orderDate;
|
||||
data['OrderNo'] = this.orderNo;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['ProjectID'] = this.projectID;
|
||||
data['ProjectName'] = this.projectName;
|
||||
data['ProjectNameN'] = this.projectNameN;
|
||||
data['QR'] = this.qR;
|
||||
data['ResultData'] = this.resultData;
|
||||
data['ResultDataHTML'] = this.resultDataHTML;
|
||||
data['ResultDataTxt'] = this.resultDataTxt;
|
||||
data['SetupID'] = this.setupID;
|
||||
//data['Speciality'] = this.speciality;
|
||||
data['Status'] = this.status;
|
||||
data['StatusDesc'] = this.statusDesc;
|
||||
data['StrOrderDate'] = this.strOrderDate;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,68 @@
|
||||
class AllSpecialLabResultRequestModel {
|
||||
double versionID;
|
||||
int channel;
|
||||
int languageID;
|
||||
String iPAdress;
|
||||
String generalid;
|
||||
int patientOutSA;
|
||||
String sessionID;
|
||||
bool isDentalAllowedBackend;
|
||||
int deviceTypeID;
|
||||
String tokenID;
|
||||
int patientTypeID;
|
||||
int patientType;
|
||||
int patientID;
|
||||
int projectID;
|
||||
|
||||
AllSpecialLabResultRequestModel(
|
||||
{this.versionID,
|
||||
this.channel,
|
||||
this.languageID,
|
||||
this.iPAdress,
|
||||
this.generalid,
|
||||
this.patientOutSA,
|
||||
this.sessionID,
|
||||
this.isDentalAllowedBackend,
|
||||
this.deviceTypeID,
|
||||
this.tokenID,
|
||||
this.patientTypeID,
|
||||
this.patientType,
|
||||
this.patientID,
|
||||
this.projectID});
|
||||
|
||||
AllSpecialLabResultRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
versionID = json['VersionID'];
|
||||
channel = json['Channel'];
|
||||
languageID = json['LanguageID'];
|
||||
iPAdress = json['IPAdress'];
|
||||
generalid = json['generalid'];
|
||||
patientOutSA = json['PatientOutSA'];
|
||||
sessionID = json['SessionID'];
|
||||
isDentalAllowedBackend = json['isDentalAllowedBackend'];
|
||||
deviceTypeID = json['DeviceTypeID'];
|
||||
tokenID = json['TokenID'];
|
||||
patientTypeID = json['PatientTypeID'];
|
||||
patientType = json['PatientType'];
|
||||
patientID = json['PatientID'];
|
||||
projectID = json['ProjectID'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['VersionID'] = this.versionID;
|
||||
data['Channel'] = this.channel;
|
||||
data['LanguageID'] = this.languageID;
|
||||
data['IPAdress'] = this.iPAdress;
|
||||
data['generalid'] = this.generalid;
|
||||
data['PatientOutSA'] = this.patientOutSA;
|
||||
data['SessionID'] = this.sessionID;
|
||||
data['isDentalAllowedBackend'] = this.isDentalAllowedBackend;
|
||||
data['DeviceTypeID'] = this.deviceTypeID;
|
||||
data['TokenID'] = this.tokenID;
|
||||
data['PatientTypeID'] = this.patientTypeID;
|
||||
data['PatientType'] = this.patientType;
|
||||
data['PatientID'] = this.patientID;
|
||||
data['ProjectID'] = this.projectID;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,27 @@
|
||||
class AddPatientToDoctorListRequestModel {
|
||||
int vCID;
|
||||
String tokenID;
|
||||
String generalid;
|
||||
int doctorId;
|
||||
bool isOutKsa;
|
||||
|
||||
AddPatientToDoctorListRequestModel({this.vCID, this.tokenID, this.generalid, this.doctorId, this.isOutKsa});
|
||||
|
||||
AddPatientToDoctorListRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
vCID = json['VC_ID'];
|
||||
tokenID = json['TokenID'];
|
||||
generalid = json['generalid'];
|
||||
doctorId = json['DoctorId'];
|
||||
isOutKsa = json['IsOutKsa'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['VC_ID'] = this.vCID;
|
||||
data['TokenID'] = this.tokenID;
|
||||
data['generalid'] = this.generalid;
|
||||
data['DoctorId'] = this.doctorId;
|
||||
data['IsOutKsa'] = this.isOutKsa;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
import 'package:doctor_app_flutter/config/config.dart';
|
||||
|
||||
class GetNursingProgressNoteRequestModel {
|
||||
int patientID;
|
||||
int admissionNo;
|
||||
int patientTypeID;
|
||||
int patientType;
|
||||
String setupID;
|
||||
|
||||
GetNursingProgressNoteRequestModel(
|
||||
{this.patientID, this.admissionNo, this.patientTypeID = 1, this.patientType = 1, this.setupID });
|
||||
|
||||
GetNursingProgressNoteRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
patientID = json['PatientID'];
|
||||
admissionNo = json['AdmissionNo'];
|
||||
patientTypeID = json['PatientTypeID'];
|
||||
patientType = json['PatientType'];
|
||||
setupID = json['SetupID'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['PatientID'] = this.patientID;
|
||||
data['AdmissionNo'] = this.admissionNo;
|
||||
data['PatientTypeID'] = this.patientTypeID;
|
||||
data['PatientType'] = this.patientType;
|
||||
data['SetupID'] = this.setupID;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
class GetNursingProgressNoteResposeModel {
|
||||
String notes;
|
||||
dynamic conditionType;
|
||||
int createdBy;
|
||||
String createdOn;
|
||||
dynamic editedBy;
|
||||
dynamic editedOn;
|
||||
|
||||
String createdByName;
|
||||
|
||||
String editedByName;
|
||||
|
||||
GetNursingProgressNoteResposeModel(
|
||||
{this.notes,
|
||||
this.conditionType,
|
||||
this.createdBy,
|
||||
this.createdOn,
|
||||
this.editedBy,
|
||||
this.editedOn,
|
||||
this.editedByName,
|
||||
this.createdByName});
|
||||
|
||||
GetNursingProgressNoteResposeModel.fromJson(Map<String, dynamic> json) {
|
||||
notes = json['Notes'];
|
||||
conditionType = json['ConditionType'];
|
||||
createdBy = json['CreatedBy'];
|
||||
createdOn = json['CreatedOn'];
|
||||
editedBy = json['EditedBy'];
|
||||
editedOn = json['EditedOn'];
|
||||
createdByName = json['CreatedByName'];
|
||||
editedByName = json['EditedByName'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['Notes'] = this.notes;
|
||||
data['ConditionType'] = this.conditionType;
|
||||
data['CreatedBy'] = this.createdBy;
|
||||
data['CreatedOn'] = this.createdOn;
|
||||
data['EditedBy'] = this.editedBy;
|
||||
data['EditedOn'] = this.editedOn;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -1,18 +1,22 @@
|
||||
class GetOrderedProcedureRequestModel {
|
||||
String? vidaAuthTokenID;
|
||||
int? patientMRN;
|
||||
int appointmentNo;
|
||||
|
||||
GetOrderedProcedureRequestModel({this.vidaAuthTokenID, this.patientMRN});
|
||||
GetOrderedProcedureRequestModel({this.vidaAuthTokenID, this.patientMRN, this.appointmentNo});
|
||||
|
||||
GetOrderedProcedureRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
vidaAuthTokenID = json['VidaAuthTokenID'];
|
||||
patientMRN = json['PatientMRN'];
|
||||
appointmentNo = json['AppointmentNo'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['VidaAuthTokenID'] = this.vidaAuthTokenID;
|
||||
data['PatientMRN'] = this.patientMRN;
|
||||
data['AppointmentNo'] = this.appointmentNo;
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
class GetSickLeaveDoctorRequestModel {
|
||||
int patientMRN;
|
||||
String appointmentNo;
|
||||
int status;
|
||||
String vidaAuthTokenID;
|
||||
String vidaRefreshTokenID;
|
||||
|
||||
GetSickLeaveDoctorRequestModel(
|
||||
{this.patientMRN, this.appointmentNo, this.status, this.vidaAuthTokenID, this.vidaRefreshTokenID});
|
||||
|
||||
GetSickLeaveDoctorRequestModel.fromJson(Map<String, dynamic> json) {
|
||||
patientMRN = json['PatientMRN'];
|
||||
appointmentNo = json['AppointmentNo'];
|
||||
status = json['status'];
|
||||
vidaAuthTokenID = json['VidaAuthTokenID'];
|
||||
vidaRefreshTokenID = json['VidaRefreshTokenID'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['PatientMRN'] = this.patientMRN;
|
||||
data['AppointmentNo'] = this.appointmentNo;
|
||||
data['status'] = this.status;
|
||||
data['VidaAuthTokenID'] = this.vidaAuthTokenID;
|
||||
data['VidaRefreshTokenID'] = this.vidaRefreshTokenID;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
import 'package:firebase_analytics/firebase_analytics.dart';
|
||||
import 'package:firebase_analytics/observer.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
class AnalyticsService {
|
||||
final FirebaseAnalytics _analytics = FirebaseAnalytics();
|
||||
|
||||
FirebaseAnalyticsObserver getAnalyticsObserver() => FirebaseAnalyticsObserver(analytics: _analytics);
|
||||
|
||||
Future logEvent({@required String eventCategory, @required String eventAction}) async {
|
||||
await _analytics.logEvent(name: 'event', parameters: {
|
||||
"eventCategory": eventCategory,
|
||||
"eventAction": eventAction,
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,108 @@
|
||||
import 'package:doctor_app_flutter/config/config.dart';
|
||||
import 'package:doctor_app_flutter/core/model/PatientRegistration/CheckActivationCodeModel.dart';
|
||||
import 'package:doctor_app_flutter/core/model/PatientRegistration/CheckPatientForRegistrationModel.dart';
|
||||
import 'package:doctor_app_flutter/core/model/PatientRegistration/GetPatientInfoRequestModel.dart';
|
||||
import 'package:doctor_app_flutter/core/model/PatientRegistration/GetPatientInfoResponseModel.dart';
|
||||
import 'package:doctor_app_flutter/core/model/PatientRegistration/PatientRegistrationModel.dart';
|
||||
import 'package:doctor_app_flutter/core/model/PatientRegistration/SendActivationCodebyOTPNotificationTypeForRegistrationModel.dart';
|
||||
import 'package:doctor_app_flutter/core/service/base/base_service.dart';
|
||||
import 'package:doctor_app_flutter/core/viewModel/PatientRegistrationViewModel.dart';
|
||||
|
||||
class PatientRegistrationService extends BaseService {
|
||||
GetPatientInfoResponseModel getPatientInfoResponseModel;
|
||||
String logInTokenID;
|
||||
|
||||
checkPatientForRegistration(
|
||||
CheckPatientForRegistrationModel registrationModel) async {
|
||||
hasError = false;
|
||||
await baseAppClient.post(CHECK_PATIENT_FOR_REGISTRATION,
|
||||
onSuccess: (dynamic response, int statusCode) {
|
||||
//TODO Elham* fix it
|
||||
logInTokenID = "OjEi/qgRekGICZm5/a4jbQ=="; //response["LogInTokenID"];
|
||||
}, onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: registrationModel.toJson());
|
||||
}
|
||||
|
||||
getPatientInfo(GetPatientInfoRequestModel getPatientInfoRequestMode) async {
|
||||
hasError = false;
|
||||
await baseAppClient.post(GET_PATIENT_INFO,
|
||||
onSuccess: (dynamic response, int statusCode) {
|
||||
getPatientInfoResponseModel =
|
||||
GetPatientInfoResponseModel.fromJson(response);
|
||||
print("ddd");
|
||||
}, onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: getPatientInfoRequestMode.toJson());
|
||||
}
|
||||
|
||||
sendActivationCodeByOTPNotificationType(
|
||||
{SendActivationCodeByOTPNotificationTypeForRegistrationModel
|
||||
registrationModel,
|
||||
int otpType,
|
||||
PatientRegistrationViewModel model,
|
||||
CheckPatientForRegistrationModel
|
||||
checkPatientForRegistrationModel}) async {
|
||||
registrationModel =
|
||||
SendActivationCodeByOTPNotificationTypeForRegistrationModel(
|
||||
oTPSendType: otpType,
|
||||
patientIdentificationID: checkPatientForRegistrationModel
|
||||
.patientIdentificationID,
|
||||
patientMobileNumber: checkPatientForRegistrationModel
|
||||
.patientMobileNumber,
|
||||
zipCode: checkPatientForRegistrationModel.zipCode,
|
||||
patientOutSA: 0,
|
||||
healthId: model.getPatientInfoResponseModel.healthId,
|
||||
dOB: checkPatientForRegistrationModel.dOB,
|
||||
isRegister: checkPatientForRegistrationModel.isRegister,
|
||||
isHijri: checkPatientForRegistrationModel.isHijri,
|
||||
sessionID: null,
|
||||
generalid: GENERAL_ID,
|
||||
isDentalAllowedBackend: false,
|
||||
projectOutSA: 0,
|
||||
searchType: 1,
|
||||
versionID: 7.1,
|
||||
channel: 3,
|
||||
nationalID:
|
||||
model.checkPatientForRegistrationModel.patientIdentificationID,
|
||||
patientID: 0,
|
||||
mobileNo: model.checkPatientForRegistrationModel.patientMobileNumber
|
||||
.toString(),
|
||||
loginType: otpType,
|
||||
logInTokenID: logInTokenID);
|
||||
|
||||
hasError = false;
|
||||
await baseAppClient.post(SEND_ACTIVATION_CODE_BY_OTP_NOT_TYPE_FOR_REGISTRATION,
|
||||
onSuccess: (dynamic response, int statusCode) {
|
||||
registrationModel =
|
||||
SendActivationCodeByOTPNotificationTypeForRegistrationModel.fromJson(
|
||||
response);
|
||||
}, onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: registrationModel.toJson());
|
||||
}
|
||||
|
||||
checkActivationCode(CheckActivationCodeModel registrationModel) async {
|
||||
hasError = false;
|
||||
await baseAppClient.post(CHECK_ACTIVATION_CODE_FOR_PATIENT,
|
||||
onSuccess: (dynamic response, int statusCode) {
|
||||
registrationModel = CheckActivationCodeModel.fromJson(response);
|
||||
}, onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: registrationModel.toJson());
|
||||
}
|
||||
|
||||
registrationPatient(PatientRegistrationModel registrationModel) async {
|
||||
hasError = false;
|
||||
await baseAppClient.post(PATIENT_REGISTRATION,
|
||||
onSuccess: (dynamic response, int statusCode) {},
|
||||
onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: registrationModel.toJson());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
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/discharge_summary/GetDischargeSummaryReqModel.dart';
|
||||
import 'package:doctor_app_flutter/models/discharge_summary/GetDischargeSummaryResModel.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/create_update_operation_report_request_model.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/get_operation_details_request_modle.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/get_operation_details_response_modle.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/get_reservations_response_model.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/get_reservations_request_model.dart';
|
||||
|
||||
class DischargeSummaryService extends BaseService {
|
||||
List<GetDischargeSummaryResModel> _pendingDischargeSummaryList = [];
|
||||
List<GetDischargeSummaryResModel> get pendingDischargeSummaryList => _pendingDischargeSummaryList;
|
||||
|
||||
Future getPendingDischargeSummary(
|
||||
{GetDischargeSummaryReqModel getDischargeSummaryReqModel}) async {
|
||||
|
||||
hasError = false;
|
||||
await baseAppClient.post(GET_PENDING_DISCHARGE_SUMMARY,
|
||||
onSuccess: (dynamic response, int statusCode) {
|
||||
_pendingDischargeSummaryList.clear();
|
||||
response['List_PendingDischargeSummary'].forEach(
|
||||
(v) {
|
||||
_pendingDischargeSummaryList.add(GetDischargeSummaryResModel.fromJson(v));
|
||||
},
|
||||
);
|
||||
}, onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: getDischargeSummaryReqModel.toJson());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,68 @@
|
||||
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/operation_report/create_update_operation_report_request_model.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/get_operation_details_request_modle.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/get_operation_details_response_modle.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/get_reservations_response_model.dart';
|
||||
import 'package:doctor_app_flutter/models/operation_report/get_reservations_request_model.dart';
|
||||
|
||||
class OperationReportService extends BaseService {
|
||||
List<GetReservationsResponseModel> _reservationList = [];
|
||||
List<GetReservationsResponseModel> get reservationList => _reservationList;
|
||||
|
||||
List<GetOperationDetailsResponseModel> _operationDetailsList = [];
|
||||
List<GetOperationDetailsResponseModel> get operationDetailsList => _operationDetailsList;
|
||||
|
||||
Future getReservations(
|
||||
{GetReservationsRequestModel getReservationsRequestModel,
|
||||
int patientId}) async {
|
||||
getReservationsRequestModel =
|
||||
GetReservationsRequestModel(patientID: patientId, doctorID: "");
|
||||
|
||||
hasError = false;
|
||||
await baseAppClient.post(GET_RESERVATIONS,
|
||||
onSuccess: (dynamic response, int statusCode) {
|
||||
print("Success");
|
||||
_reservationList.clear();
|
||||
response['List_OTReservationDetails'].forEach(
|
||||
(v) {
|
||||
_reservationList.add(GetReservationsResponseModel.fromJson(v));
|
||||
},
|
||||
);
|
||||
}, onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: getReservationsRequestModel.toJson());
|
||||
}
|
||||
|
||||
Future getOperationReportDetails(
|
||||
{GetOperationDetailsRequestModel getOperationReportRequestModel,
|
||||
}) async {
|
||||
|
||||
hasError = false;
|
||||
await baseAppClient.post(GET_OPERATION_DETAILS,
|
||||
onSuccess: (dynamic response, int statusCode) {
|
||||
print("Success");
|
||||
_operationDetailsList.clear();
|
||||
response['List_OperationDetails'].forEach(
|
||||
(v) {
|
||||
_operationDetailsList.add(GetOperationDetailsResponseModel.fromJson(v));
|
||||
},
|
||||
);
|
||||
}, onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: getOperationReportRequestModel.toJson());
|
||||
}
|
||||
|
||||
Future updateOperationReport(
|
||||
CreateUpdateOperationReportRequestModel
|
||||
createUpdateOperationReport) async {
|
||||
await baseAppClient.post(UPDATE_OPERATION_REPORT,
|
||||
onSuccess: (dynamic response, int statusCode) {},
|
||||
onFailure: (String error, int statusCode) {
|
||||
hasError = true;
|
||||
super.error = error;
|
||||
}, body: createUpdateOperationReport.toJson(), isFallLanguage: true);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue