video call

merge-requests/745/head
mosazaid 5 years ago
parent 13ee7f6491
commit 883778d278

@ -7,6 +7,7 @@ import androidx.annotation.NonNull
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.hmg.hmgDr.Model.GetSessionStatusModel import com.hmg.hmgDr.Model.GetSessionStatusModel
import com.hmg.hmgDr.Model.SessionStatusModel import com.hmg.hmgDr.Model.SessionStatusModel
import com.hmg.hmgDr.ui.VideoCallResponseListener
import com.hmg.hmgDr.ui.fragment.VideoCallFragment import com.hmg.hmgDr.ui.fragment.VideoCallFragment
import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
@ -15,7 +16,7 @@ import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant import io.flutter.plugins.GeneratedPluginRegistrant
class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler { class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler, VideoCallResponseListener {
private val CHANNEL = "Dr.cloudSolution/videoCall" private val CHANNEL = "Dr.cloudSolution/videoCall"
private var result: MethodChannel.Result? = null private var result: MethodChannel.Result? = null
@ -67,7 +68,6 @@ class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler
private fun openVideoCall(apiKey: String?, sessionId: String?, token: String?, appLang: String?, baseUrl: String?, sessionStatusModel: GetSessionStatusModel) { private fun openVideoCall(apiKey: String?, sessionId: String?, token: String?, appLang: String?, baseUrl: String?, sessionStatusModel: GetSessionStatusModel) {
// val videoCallActivity = VideoCallActivity() // val videoCallActivity = VideoCallActivity()
// val intent = Intent(this, VideoCallActivity::class.java) // val intent = Intent(this, VideoCallActivity::class.java)
// intent.putExtra("apiKey", apiKey) // intent.putExtra("apiKey", apiKey)
// intent.putExtra("sessionId", sessionId) // intent.putExtra("sessionId", sessionId)
@ -77,14 +77,23 @@ class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler
// intent.putExtra("sessionStatusModel", sessionStatusModel) // intent.putExtra("sessionStatusModel", sessionStatusModel)
// startActivityForResult(intent, LAUNCH_VIDEO) // startActivityForResult(intent, LAUNCH_VIDEO)
val arguments = Bundle()
arguments.putString("apiKey", apiKey)
arguments.putString("sessionId", sessionId)
arguments.putString("token", token)
arguments.putString("appLang", appLang)
arguments.putString("baseUrl", baseUrl)
arguments.putParcelable("sessionStatusModel", sessionStatusModel)
val transaction = supportFragmentManager.beginTransaction() val transaction = supportFragmentManager.beginTransaction()
dialogFragment = VideoCallFragment.newInstance(Bundle()) dialogFragment = VideoCallFragment.newInstance(arguments)
dialogFragment.isCancelable = false dialogFragment.setCallListener(this)
dialogFragment.isCancelable = true
dialogFragment.show(transaction, "dialog") dialogFragment.show(transaction, "dialog")
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { /* override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
var asd = ""; var asd = "";
if (requestCode == LAUNCH_VIDEO) { if (requestCode == LAUNCH_VIDEO) {
@ -108,6 +117,28 @@ class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler
result?.success(callResponse) result?.success(callResponse)
} }
} }
}*/
override fun onCallFinished(resultCode: Int, intent: Intent?) {
if (resultCode == Activity.RESULT_OK) {
val result : SessionStatusModel? = intent?.getParcelableExtra("sessionStatusNotRespond")
val callResponse : HashMap<String, String> = HashMap()
val sessionStatus : HashMap<String, String> = HashMap()
val gson = GsonBuilder().serializeNulls().create()
callResponse["callResponse"] = "CallNotRespond"
val jsonRes = gson.toJson(result)
callResponse["sessionStatus"] = jsonRes
this.result?.success(callResponse)
}
if (resultCode == Activity.RESULT_CANCELED) {
val callResponse : HashMap<String, String> = HashMap()
callResponse["callResponse"] = "CallEnd"
result?.success(callResponse)
}
} }

@ -0,0 +1,8 @@
package com.hmg.hmgDr.ui
import android.content.Intent
interface VideoCallResponseListener {
fun onCallFinished(resultCode : Int, intent: Intent? = null)
}

@ -10,31 +10,30 @@ import android.graphics.Color
import android.graphics.Point import android.graphics.Point
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.opengl.GLSurfaceView import android.opengl.GLSurfaceView
import android.os.Bundle import android.os.*
import android.os.CountDownTimer
import android.os.Handler
import android.os.Looper
import android.util.Log import android.util.Log
import android.view.* import android.view.*
import android.widget.* import android.widget.*
import androidx.annotation.Nullable import androidx.annotation.Nullable
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import com.hmg.hmgDr.Model.ChangeCallStatusRequestModel
import com.hmg.hmgDr.Model.GetSessionStatusModel import com.hmg.hmgDr.Model.GetSessionStatusModel
import com.hmg.hmgDr.Model.SessionStatusModel import com.hmg.hmgDr.Model.SessionStatusModel
import com.hmg.hmgDr.R import com.hmg.hmgDr.R
import com.hmg.hmgDr.ui.VideoCallContract.VideoCallPresenter import com.hmg.hmgDr.ui.VideoCallContract.VideoCallPresenter
import com.hmg.hmgDr.ui.VideoCallContract.VideoCallView import com.hmg.hmgDr.ui.VideoCallContract.VideoCallView
import com.hmg.hmgDr.ui.VideoCallPresenterImpl import com.hmg.hmgDr.ui.VideoCallPresenterImpl
import com.hmg.hmgDr.ui.VideoCallResponseListener
import com.opentok.android.* import com.opentok.android.*
import com.opentok.android.PublisherKit.PublisherListener import com.opentok.android.PublisherKit.PublisherListener
import pub.devrel.easypermissions.AfterPermissionGranted import pub.devrel.easypermissions.AfterPermissionGranted
import pub.devrel.easypermissions.AppSettingsDialog import pub.devrel.easypermissions.AppSettingsDialog
import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions
import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks
import java.util.*
import kotlin.math.ceil import kotlin.math.ceil
class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.SessionListener, PublisherListener, class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.SessionListener, PublisherListener,
SubscriberKit.VideoListener, VideoCallView { SubscriberKit.VideoListener, VideoCallView {
@ -58,9 +57,11 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
private var mVolRunnable: Runnable? = null private var mVolRunnable: Runnable? = null
private var mConnectedRunnable: Runnable? = null private var mConnectedRunnable: Runnable? = null
private var mPublisherViewContainer: FrameLayout? = null private lateinit var mPublisherViewContainer: FrameLayout
private var mSubscriberViewContainer: RelativeLayout? = null private lateinit var mPublisherViewIcon: View
private var controlPanel: RelativeLayout? = null private lateinit var mSubscriberViewContainer: FrameLayout
private lateinit var mSubscriberViewIcon: ImageView
private var controlPanel: ConstraintLayout? = null
private var apiKey: String? = null private var apiKey: String? = null
private var sessionId: String? = null private var sessionId: String? = null
@ -73,7 +74,9 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
private var isSpeckerClicked = false private var isSpeckerClicked = false
private var isMicClicked = false private var isMicClicked = false
private lateinit var videoCallContainer: LinearLayout private lateinit var parentView: View
private lateinit var videoCallContainer: ConstraintLayout
private lateinit var layoutName: RelativeLayout
private lateinit var mCallBtn: ImageView private lateinit var mCallBtn: ImageView
private lateinit var btnMinimize: ImageView private lateinit var btnMinimize: ImageView
private lateinit var mCameraBtn: ImageView private lateinit var mCameraBtn: ImageView
@ -81,6 +84,11 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
private lateinit var mspeckerBtn: ImageView private lateinit var mspeckerBtn: ImageView
private lateinit var mMicBtn: ImageView private lateinit var mMicBtn: ImageView
private lateinit var patientName: TextView
private lateinit var cmTimer: Chronometer
var elapsedTime: Long = 0
var resume = false
private val progressBar: ProgressBar? = null private val progressBar: ProgressBar? = null
private val countDownTimer: CountDownTimer? = null private val countDownTimer: CountDownTimer? = null
private val progressBarTextView: TextView? = null private val progressBarTextView: TextView? = null
@ -89,6 +97,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
private var isConnected = false private var isConnected = false
private var sessionStatusModel: GetSessionStatusModel? = null private var sessionStatusModel: GetSessionStatusModel? = null
private var videoCallResponseListener: VideoCallResponseListener? =null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -137,16 +146,20 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} }
} }
fun setCallListener(videoCallResponseListener: VideoCallResponseListener){
this.videoCallResponseListener = videoCallResponseListener
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? { savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.activity_video_call, container, false) parentView = inflater.inflate(R.layout.activity_video_call, container, false)
Objects.requireNonNull(requireActivity().actionBar)!!.hide() // Objects.requireNonNull(requireActivity().actionBar)!!.hide()
initUI(view) initUI(parentView)
handleDragDialog() handleDragDialog()
return view return parentView
} }
override fun onPause() { override fun onPause() {
@ -170,14 +183,18 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
override fun onDestroy() { override fun onDestroy() {
disconnectSession() disconnectSession()
cmTimer.stop()
super.onDestroy() super.onDestroy()
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
private fun initUI(view: View) { private fun initUI(view: View) {
videoCallContainer = view.findViewById<LinearLayout>(R.id.video_call_ll) videoCallContainer = view.findViewById(R.id.video_call_ll)
mPublisherViewContainer = view.findViewById<FrameLayout>(R.id.local_video_view_container) layoutName = view.findViewById(R.id.layout_name)
mSubscriberViewContainer = view.findViewById<RelativeLayout>(R.id.remote_video_view_container) mPublisherViewContainer = view.findViewById(R.id.local_video_view_container)
mPublisherViewIcon = view.findViewById(R.id.local_video_view_icon)
mSubscriberViewIcon = view.findViewById(R.id.remote_video_view_icon)
mSubscriberViewContainer = view.findViewById(R.id.remote_video_view_container)
arguments?.run { arguments?.run {
apiKey = getString("apiKey") apiKey = getString("apiKey")
@ -188,7 +205,27 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
sessionStatusModel = getParcelable("sessionStatusModel") sessionStatusModel = getParcelable("sessionStatusModel")
} }
controlPanel = view.findViewById<RelativeLayout>(R.id.control_panel) patientName = view.findViewById<TextView>(R.id.patient_name)
patientName.text = sessionStatusModel!!.patientName
cmTimer = view.findViewById<Chronometer>(R.id.cmTimer)
cmTimer.format = "mm:ss"
cmTimer.onChronometerTickListener = Chronometer.OnChronometerTickListener { arg0: Chronometer? ->
val minutes: Long
val seconds: Long
if (!resume) {
minutes = (SystemClock.elapsedRealtime() - cmTimer.base) / 1000 / 60
seconds = (SystemClock.elapsedRealtime() - cmTimer.base) / 1000 % 60
elapsedTime = SystemClock.elapsedRealtime()
} else {
minutes = (elapsedTime - cmTimer.base) / 1000 / 60
seconds = (elapsedTime - cmTimer.base) / 1000 % 60
elapsedTime = elapsedTime + 1000
}
Log.d(VideoCallFragment.TAG, "onChronometerTick: $minutes : $seconds")
}
controlPanel = view.findViewById(R.id.control_panel)
videoCallPresenter = VideoCallPresenterImpl(this, baseUrl) videoCallPresenter = VideoCallPresenterImpl(this, baseUrl)
mCallBtn = view.findViewById<ImageView>(R.id.btn_call) mCallBtn = view.findViewById<ImageView>(R.id.btn_call)
mCallBtn.setOnClickListener { mCallBtn.setOnClickListener {
@ -295,17 +332,23 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
(mPublisher!!.getView() as GLSurfaceView).setZOrderOnTop(true) (mPublisher!!.getView() as GLSurfaceView).setZOrderOnTop(true)
} }
mSession!!.publish(mPublisher) mSession!!.publish(mPublisher)
if (!resume) {
cmTimer.base = SystemClock.elapsedRealtime()
}
cmTimer.start()
} }
override fun onDisconnected(session: Session) { override fun onDisconnected(session: Session) {
Log.d(TAG, "onDisconnected: disconnected from session " + session.sessionId) Log.d(TAG, "onDisconnected: disconnected from session " + session.sessionId)
mSession = null mSession = null
cmTimer.stop()
} }
override fun onError(session: Session, opentokError: OpentokError) { override fun onError(session: Session, opentokError: OpentokError) {
Log.d(TAG, "onError: Error (" + opentokError.message + ") in session " + session.sessionId) Log.d(TAG, "onError: Error (" + opentokError.message + ") in session " + session.sessionId)
Toast.makeText(requireContext(), "Session error. See the logcat please.", Toast.LENGTH_LONG).show() // Toast.makeText(requireContext(), "Session error. See the logcat please.", Toast.LENGTH_LONG).show()
requireActivity().finish() // requireActivity().finish()
} }
override fun onStreamReceived(session: Session, stream: Stream) { override fun onStreamReceived(session: Session, stream: Stream) {
@ -316,7 +359,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} }
isConnected = true isConnected = true
subscribeToStream(stream) subscribeToStream(stream)
videoCallPresenter.callChangeCallStatus(ChangeCallStatusRequestModel(3, sessionStatusModel!!.doctorId, sessionStatusModel!!.generalid, token, sessionStatusModel!!.vcid)) // videoCallPresenter.callChangeCallStatus(ChangeCallStatusRequestModel(3, sessionStatusModel!!.doctorId, sessionStatusModel!!.generalid, token, sessionStatusModel!!.vcid))
} }
override fun onStreamDropped(session: Session, stream: Stream) { override fun onStreamDropped(session: Session, stream: Stream) {
@ -342,8 +385,8 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
override fun onError(publisherKit: PublisherKit?, opentokError: OpentokError) { override fun onError(publisherKit: PublisherKit?, opentokError: OpentokError) {
Log.d(VideoCallFragment.TAG, "onError: Error (" + opentokError.message + ") in publisher") Log.d(VideoCallFragment.TAG, "onError: Error (" + opentokError.message + ") in publisher")
Toast.makeText(requireContext(), "Session error. See the logcat please.", Toast.LENGTH_LONG).show() // Toast.makeText(requireContext(), "Session error. See the logcat please.", Toast.LENGTH_LONG).show()
requireActivity().finish() // requireActivity().finish()
} }
override fun onVideoDataReceived(subscriberKit: SubscriberKit?) { override fun onVideoDataReceived(subscriberKit: SubscriberKit?) {
@ -367,8 +410,9 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
private fun disconnectSession() { private fun disconnectSession() {
if (mSession == null) { if (mSession == null) {
requireActivity().setResult(Activity.RESULT_CANCELED) videoCallResponseListener?.onCallFinished(Activity.RESULT_CANCELED)
requireActivity().finish() // requireActivity().setResult(Activity.RESULT_CANCELED)
dialog?.dismiss()
return return
} }
if (mSubscriber != null) { if (mSubscriber != null) {
@ -385,8 +429,8 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} }
mSession!!.disconnect() mSession!!.disconnect()
countDownTimer?.cancel() countDownTimer?.cancel()
videoCallPresenter.callChangeCallStatus(ChangeCallStatusRequestModel(16, sessionStatusModel!!.doctorId, sessionStatusModel!!.generalid, token, sessionStatusModel!!.vcid)) // videoCallPresenter.callChangeCallStatus(ChangeCallStatusRequestModel(16, sessionStatusModel!!.doctorId, sessionStatusModel!!.generalid, token, sessionStatusModel!!.vcid))
requireActivity().finish() dialog?.dismiss()
} }
@ -394,8 +438,9 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
if (sessionStatusModel.sessionStatus == 2 || sessionStatusModel.sessionStatus == 3) { if (sessionStatusModel.sessionStatus == 2 || sessionStatusModel.sessionStatus == 3) {
val returnIntent = Intent() val returnIntent = Intent()
returnIntent.putExtra("sessionStatusNotRespond", sessionStatusModel) returnIntent.putExtra("sessionStatusNotRespond", sessionStatusModel)
requireActivity().setResult(Activity.RESULT_OK, returnIntent) videoCallResponseListener?.onCallFinished(Activity.RESULT_OK, returnIntent)
requireActivity().finish() // requireActivity().setResult(Activity.RESULT_OK, returnIntent)
dialog?.dismiss()
} }
} }
@ -403,7 +448,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
override fun onFailure() {} override fun onFailure() {}
fun onSwitchCameraClicked(view: View?) { private fun onSwitchCameraClicked(view: View?) {
if (mPublisher != null) { if (mPublisher != null) {
isSwitchCameraClicked = !isSwitchCameraClicked isSwitchCameraClicked = !isSwitchCameraClicked
mPublisher!!.cycleCamera() mPublisher!!.cycleCamera()
@ -412,11 +457,11 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} }
} }
fun onCallClicked(view: View?) { private fun onCallClicked(view: View?) {
disconnectSession() disconnectSession()
} }
fun onMinimizedClicked(view: View?) { private fun onMinimizedClicked(view: View?) {
if (isFullScreen) { if (isFullScreen) {
dialog?.window?.setLayout( dialog?.window?.setLayout(
400, 400,
@ -429,9 +474,89 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
) )
} }
isFullScreen = !isFullScreen isFullScreen = !isFullScreen
setViewsVisibility()
}
private fun setViewsVisibility() {
initUI(parentView)
val iconSize : Int = context!!.resources.getDimension(R.dimen.video_icon_size).toInt()
val iconSizeSmall : Int = context!!.resources.getDimension(R.dimen.video_icon_size_small).toInt()
val btnMinimizeLayoutParam : ConstraintLayout.LayoutParams = btnMinimize.layoutParams as ConstraintLayout.LayoutParams
val mCallBtnLayoutParam : ConstraintLayout.LayoutParams = mCallBtn.layoutParams as ConstraintLayout.LayoutParams
// val localPreviewMargin : Int = context!!.resources.getDimension(R.dimen.local_preview_margin_top).toInt()
// val localPreviewWidth : Int = context!!.resources.getDimension(R.dimen.local_preview_width).toInt()
// val localPreviewHeight : Int = context!!.resources.getDimension(R.dimen.local_preview_height).toInt()
// val localPreviewIconSize: Int = context!!.resources.getDimension(R.dimen.local_back_icon_size).toInt()
// val localPreviewMarginSmall : Int = context!!.resources.getDimension(R.dimen.local_preview_margin_small).toInt()
// val localPreviewWidthSmall : Int = context!!.resources.getDimension(R.dimen.local_preview_width_small).toInt()
// val localPreviewHeightSmall : Int = context!!.resources.getDimension(R.dimen.local_preview_height_small).toInt()
// val localPreviewIconSmall: Int = context!!.resources.getDimension(R.dimen.local_back_icon_size_small).toInt()
// val localPreviewLayoutIconParam : FrameLayout.LayoutParams
// val localPreviewLayoutParam : RelativeLayout.LayoutParams = mPublisherViewContainer.layoutParams as RelativeLayout.LayoutParams
val remotePreviewIconSize: Int = context!!.resources.getDimension(R.dimen.remote_back_icon_size).toInt()
val remotePreviewIconSizeSmall: Int = context!!.resources.getDimension(R.dimen.remote_back_icon_size_small).toInt()
val remotePreviewLayoutParam : FrameLayout.LayoutParams = mSubscriberViewIcon.layoutParams as FrameLayout.LayoutParams
val constraintSet = ConstraintSet()
//layoutParam.constrain
// constraintSet.
if (isFullScreen) {
layoutName.visibility = View.VISIBLE
mCameraBtn.visibility = View.VISIBLE
mSwitchCameraBtn.visibility = View.VISIBLE
mspeckerBtn.visibility = View.VISIBLE
mMicBtn.visibility = View.VISIBLE
mPublisherViewContainer.visibility = View.VISIBLE
// layoutParam = ConstraintLayout.LayoutParams(iconSize, iconSize)
btnMinimizeLayoutParam.width = iconSize
btnMinimizeLayoutParam.height = iconSize
mCallBtnLayoutParam.width = iconSize
mCallBtnLayoutParam.height = iconSize
// localPreviewLayoutIconParam = FrameLayout.LayoutParams(localPreviewIconSize, localPreviewIconSize)
//// localPreviewLayoutParam = RelativeLayout.LayoutParams(localPreviewWidth, localPreviewHeight)
// localPreviewLayoutParam.width = localPreviewIconSize
// localPreviewLayoutParam.height = localPreviewIconSize
// localPreviewLayoutParam.setMargins(0,localPreviewMargin, localPreviewMargin, 0)
// remotePreviewLayoutParam = FrameLayout.LayoutParams(remotePreviewIconSize, remotePreviewIconSize)
remotePreviewLayoutParam.width = remotePreviewIconSize
remotePreviewLayoutParam.height = remotePreviewIconSize
} else {
layoutName.visibility = View.GONE
mCameraBtn.visibility = View.GONE
mSwitchCameraBtn.visibility = View.GONE
mspeckerBtn.visibility = View.GONE
mMicBtn.visibility = View.GONE
mPublisherViewContainer.visibility = View.GONE
// layoutParam = ConstraintLayout.LayoutParams(iconSizeSmall, iconSizeSmall)
btnMinimizeLayoutParam.width = iconSizeSmall
btnMinimizeLayoutParam.height = iconSizeSmall
mCallBtnLayoutParam.width = iconSizeSmall
mCallBtnLayoutParam.height = iconSizeSmall
// localPreviewLayoutIconParam = FrameLayout.LayoutParams(localPreviewIconSmall, localPreviewIconSmall)
//// localPreviewLayoutParam = RelativeLayout.LayoutParams(localPreviewWidthSmall, localPreviewHeightSmall)
// localPreviewLayoutParam.width = localPreviewWidthSmall
// localPreviewLayoutParam.height = localPreviewWidthSmall
// localPreviewLayoutParam.setMargins(0,localPreviewMarginSmall, localPreviewMarginSmall, 0)
// remotePreviewLayoutParam = FrameLayout.LayoutParams(remotePreviewIconSizeSmall, remotePreviewIconSizeSmall)
remotePreviewLayoutParam.width = remotePreviewIconSizeSmall
remotePreviewLayoutParam.height = remotePreviewIconSizeSmall
}
// mPublisherViewContainer.layoutParams = localPreviewLayoutParam
// mPublisherViewIcon.layoutParams = localPreviewLayoutIconParam
mSubscriberViewIcon.layoutParams = remotePreviewLayoutParam
btnMinimize.layoutParams = btnMinimizeLayoutParam
mCallBtn.layoutParams = mCallBtnLayoutParam
} }
fun onCameraClicked(view: View?) { private fun onCameraClicked(view: View?) {
if (mPublisher != null) { if (mPublisher != null) {
isCameraClicked = !isCameraClicked isCameraClicked = !isCameraClicked
mPublisher!!.publishVideo = !isCameraClicked mPublisher!!.publishVideo = !isCameraClicked
@ -440,7 +565,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} }
} }
fun onMicClicked(view: View?) { private fun onMicClicked(view: View?) {
if (mPublisher != null) { if (mPublisher != null) {
isMicClicked = !isMicClicked isMicClicked = !isMicClicked
mPublisher!!.publishAudio = !isMicClicked mPublisher!!.publishAudio = !isMicClicked
@ -449,7 +574,7 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} }
} }
fun onSpeckerClicked(view: View?) { private fun onSpeckerClicked(view: View?) {
if (mSubscriber != null) { if (mSubscriber != null) {
isSpeckerClicked = !isSpeckerClicked isSpeckerClicked = !isSpeckerClicked
mSubscriber!!.subscribeToAudio = !isSpeckerClicked mSubscriber!!.subscribeToAudio = !isSpeckerClicked
@ -458,12 +583,18 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} }
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
fun handleDragDialog() { fun handleDragDialog() {
mWindowManager = requireActivity().getSystemService(Context.WINDOW_SERVICE) as WindowManager mWindowManager = requireActivity().getSystemService(Context.WINDOW_SERVICE) as WindowManager
getWindowManagerDefaultDisplay() getWindowManagerDefaultDisplay()
videoCallContainer.setOnTouchListener { _, event -> videoCallContainer.setOnTouchListener(dragListener)
// mSubscriberViewContainer.setOnTouchListener(dragListener)
}
@SuppressLint("ClickableViewAccessibility")
val dragListener : View.OnTouchListener = View.OnTouchListener{ _, event ->
//Get Floating widget view params //Get Floating widget view params
//Get Floating widget view params //Get Floating widget view params
val layoutParams: WindowManager.LayoutParams = dialog!!.window!!.attributes val layoutParams: WindowManager.LayoutParams = dialog!!.window!!.attributes
@ -516,7 +647,6 @@ class VideoCallFragment : DialogFragment(), PermissionCallbacks, Session.Session
} }
true true
} }
}
/* Reset position of Floating Widget view on dragging */ /* Reset position of Floating Widget view on dragging */
private fun resetPosition(x_cord_now: Int) { private fun resetPosition(x_cord_now: Int) {

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/text_color"/>
<stroke android:width="3dp" android:color="@color/text_color" />
<corners android:radius="10dp"/>
<padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/video_call_ll" android:id="@+id/video_call_ll"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -8,9 +9,11 @@
android:orientation="vertical"> android:orientation="vertical">
<RelativeLayout <RelativeLayout
android:id="@+id/layout_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="@dimen/padding_space_big"> android:padding="@dimen/padding_space_medium"
app:layout_constraintTop_toTopOf="parent">
<TextView <TextView
android:id="@+id/patient_name" android:id="@+id/patient_name"
@ -31,13 +34,13 @@
android:padding="@dimen/padding_space_small"> android:padding="@dimen/padding_space_small">
<Chronometer <Chronometer
android:id="@+id/cmTimer"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="20sp"
tools:text="25:45"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="20sp"
android:textStyle="bold" android:textStyle="bold"
android:id="@+id/cmTimer" /> tools:text="25:45" />
</FrameLayout> </FrameLayout>
@ -47,7 +50,8 @@
android:id="@+id/activity_clingo_video_call" android:id="@+id/activity_clingo_video_call"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1" app:layout_constraintBottom_toTopOf="@id/control_panel"
app:layout_constraintTop_toBottomOf="@+id/layout_name"
tools:context=".ui.VideoCallActivity"> tools:context=".ui.VideoCallActivity">
<RelativeLayout <RelativeLayout
@ -75,19 +79,20 @@
android:paddingBottom="@dimen/activity_vertical_margin" /> android:paddingBottom="@dimen/activity_vertical_margin" />
</RelativeLayout> </RelativeLayout>
<RelativeLayout <FrameLayout
android:id="@+id/remote_video_view_container" android:id="@+id/remote_video_view_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/remoteBackground"> android:background="@color/remoteBackground">
<ImageView <ImageView
android:id="@+id/remote_video_view_icon"
android:layout_width="@dimen/remote_back_icon_size" android:layout_width="@dimen/remote_back_icon_size"
android:layout_height="@dimen/remote_back_icon_size" android:layout_height="@dimen/remote_back_icon_size"
android:layout_centerInParent="true" android:layout_gravity="center"
android:src="@drawable/video_off_fill" /> android:src="@drawable/video_off_fill" />
</RelativeLayout> </FrameLayout>
<FrameLayout <FrameLayout
android:id="@+id/local_video_view_container" android:id="@+id/local_video_view_container"
@ -96,10 +101,11 @@
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_marginTop="@dimen/local_preview_margin_top" android:layout_marginTop="@dimen/local_preview_margin_top"
android:layout_marginEnd="@dimen/local_preview_margin_right" android:layout_marginEnd="@dimen/local_preview_margin_top"
android:background="@color/localBackground"> android:background="@color/localBackground">
<ImageView <ImageView
android:id="@+id/local_video_view_icon"
android:layout_width="@dimen/local_back_icon_size" android:layout_width="@dimen/local_back_icon_size"
android:layout_height="@dimen/local_back_icon_size" android:layout_height="@dimen/local_back_icon_size"
android:layout_gravity="center" android:layout_gravity="center"
@ -111,66 +117,80 @@
android:id="@+id/btn_switch_camera" android:id="@+id/btn_switch_camera"
android:layout_width="@dimen/video_icon_size" android:layout_width="@dimen/video_icon_size"
android:layout_height="@dimen/video_icon_size" android:layout_height="@dimen/video_icon_size"
android:layout_centerVertical="true"
android:layout_below="@+id/local_video_view_container" android:layout_below="@+id/local_video_view_container"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginTop="@dimen/local_preview_margin_top" android:layout_marginTop="@dimen/local_preview_margin_top"
android:layout_marginEnd="@dimen/local_preview_margin_right" android:layout_marginEnd="@dimen/local_preview_margin_right"
android:layout_alignParentEnd="true"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/flip_enabled" /> android:src="@drawable/flip_enabled" />
</RelativeLayout> </RelativeLayout>
<RelativeLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/control_panel" android:id="@+id/control_panel"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:padding="@dimen/padding_space_big_2"> android:padding="@dimen/padding_space_big"
app:layout_constraintBottom_toBottomOf="parent">
<ImageView <ImageView
android:id="@+id/btn_call" android:id="@+id/btn_call"
android:layout_width="@dimen/video_icon_size" android:layout_width="@dimen/video_icon_size"
android:layout_height="@dimen/video_icon_size" android:layout_height="@dimen/video_icon_size"
android:layout_alignParentEnd="true"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/call" /> android:src="@drawable/call"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView <ImageView
android:id="@+id/btn_minimize" android:id="@+id/btn_minimize"
android:layout_width="@dimen/video_icon_size" android:layout_width="@dimen/video_icon_size"
android:layout_height="@dimen/video_icon_size" android:layout_height="@dimen/video_icon_size"
android:layout_alignParentStart="true"
android:layout_marginEnd="@dimen/padding_space_small" android:layout_marginEnd="@dimen/padding_space_small"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/ic_mini" /> android:src="@drawable/ic_mini"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView <ImageView
android:id="@+id/btn_camera" android:id="@+id/btn_camera"
android:layout_width="@dimen/video_icon_size" android:layout_width="@dimen/video_icon_size"
android:layout_height="@dimen/video_icon_size" android:layout_height="@dimen/video_icon_size"
android:layout_toEndOf="@id/btn_minimize"
android:scaleType="centerCrop"
android:layout_marginEnd="@dimen/padding_space_small" android:layout_marginEnd="@dimen/padding_space_small"
android:src="@drawable/video_enabled" /> android:scaleType="centerCrop"
android:src="@drawable/video_enabled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/btn_minimize"
app:layout_constraintTop_toTopOf="parent"
/>
<ImageView <ImageView
android:id="@+id/btn_mic" android:id="@+id/btn_mic"
android:layout_width="@dimen/video_icon_size" android:layout_width="@dimen/video_icon_size"
android:layout_height="@dimen/video_icon_size" android:layout_height="@dimen/video_icon_size"
android:layout_toEndOf="@id/btn_camera"
android:layout_marginEnd="@dimen/padding_space_small" android:layout_marginEnd="@dimen/padding_space_small"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/mic_enabled" /> android:src="@drawable/mic_enabled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/btn_camera"
app:layout_constraintTop_toTopOf="parent"
/>
<ImageView <ImageView
android:id="@+id/btn_specker" android:id="@+id/btn_specker"
android:layout_width="@dimen/video_icon_size" android:layout_width="@dimen/video_icon_size"
android:layout_height="@dimen/video_icon_size" android:layout_height="@dimen/video_icon_size"
android:layout_toEndOf="@id/btn_mic"
android:scaleType="centerCrop"
android:layout_marginEnd="@dimen/padding_space_small" android:layout_marginEnd="@dimen/padding_space_small"
android:src="@drawable/audio_enabled" /> android:scaleType="centerCrop"
android:src="@drawable/audio_enabled"
</RelativeLayout> app:layout_constraintBottom_toBottomOf="parent"
</LinearLayout> app:layout_constraintStart_toEndOf="@id/btn_mic"
app:layout_constraintTop_toTopOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -3,21 +3,27 @@
<dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="local_preview_margin_top">28dp</dimen> <dimen name="local_preview_margin_top">28dp</dimen>
<dimen name="local_preview_margin_small">12dp</dimen>
<dimen name="local_preview_margin_right">24dp</dimen> <dimen name="local_preview_margin_right">24dp</dimen>
<!-- buttons --> <!-- buttons -->
<dimen name="call_button_size">60dp</dimen> <dimen name="call_button_size">60dp</dimen>
<dimen name="other_button_size">54dp</dimen> <dimen name="other_button_size">54dp</dimen>
<dimen name="video_icon_size">64dp</dimen> <dimen name="video_icon_size">52dp</dimen>
<dimen name="video_icon_size_small">24dp</dimen>
<!-- buttons --> <!-- buttons -->
<dimen name="control_bottom_margin">24dp</dimen> <dimen name="control_bottom_margin">24dp</dimen>
<dimen name="control_bottom_horizontal_margin">25dp</dimen> <dimen name="control_bottom_horizontal_margin">25dp</dimen>
<dimen name="local_preview_width">88dp</dimen> <dimen name="local_preview_width">88dp</dimen>
<dimen name="local_preview_width_small">40dp</dimen>
<dimen name="local_preview_height">117dp</dimen> <dimen name="local_preview_height">117dp</dimen>
<dimen name="local_preview_height_small">50dp</dimen>
<dimen name="local_back_icon_size">50dp</dimen> <dimen name="local_back_icon_size">50dp</dimen>
<dimen name="local_back_icon_size_small">25dp</dimen>
<dimen name="remote_back_icon_size">100dp</dimen> <dimen name="remote_back_icon_size">100dp</dimen>
<dimen name="remote_back_icon_size_small">40dp</dimen>
<dimen name="remote_back_icon_margin_bottom">90dp</dimen> <dimen name="remote_back_icon_margin_bottom">90dp</dimen>
<!-- text--> <!-- text-->

@ -254,8 +254,8 @@ class AuthenticationViewModel extends BaseViewModel {
/// add  token to shared preferences in case of send activation code is success /// add  token to shared preferences in case of send activation code is success
setDataAfterSendActivationSuccess(SendActivationCodeForDoctorAppResponseModel sendActivationCodeForDoctorAppResponseModel) { setDataAfterSendActivationSuccess(SendActivationCodeForDoctorAppResponseModel sendActivationCodeForDoctorAppResponseModel) {
print("VerificationCode : " + print("VerificationCode : " + sendActivationCodeForDoctorAppResponseModel.verificationCode);
sendActivationCodeForDoctorAppResponseModel.verificationCode); DrAppToastMsg.showSuccesToast("VerificationCode : " + sendActivationCodeForDoctorAppResponseModel.verificationCode);
sharedPref.setString(VIDA_AUTH_TOKEN_ID, sharedPref.setString(VIDA_AUTH_TOKEN_ID,
sendActivationCodeForDoctorAppResponseModel.vidaAuthTokenID); sendActivationCodeForDoctorAppResponseModel.vidaAuthTokenID);
sharedPref.setString(VIDA_REFRESH_TOKEN_ID, sharedPref.setString(VIDA_REFRESH_TOKEN_ID,

@ -17,6 +17,7 @@ import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart'; import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart'; import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart'; import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-app-bar.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/patient-profile-header-new-design-app-bar.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart'; import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart'; import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';

@ -21,8 +21,10 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
final bool isDischargedPatient; final bool isDischargedPatient;
final bool isFromLiveCare; final bool isFromLiveCare;
final Stream<String> videoCallDurationStream;
PatientProfileHeaderNewDesignAppBar( PatientProfileHeaderNewDesignAppBar(
this.patient, this.patientType, this.arrivalType, {this.height = 0.0, this.isInpatient=false, this.isDischargedPatient=false, this.isFromLiveCare = false}); this.patient, this.patientType, this.arrivalType, {this.height = 0.0, this.isInpatient=false, this.isDischargedPatient=false, this.isFromLiveCare = false, this.videoCallDurationStream});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -88,6 +90,23 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
), ),
), ),
), ),
StreamBuilder(
stream: videoCallDurationStream,
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if(snapshot.hasData && snapshot.data != null)
return InkWell(
onTap: (){
},
child: Container(
decoration: BoxDecoration(color: Colors.red, borderRadius: BorderRadius.circular(20)),
padding: EdgeInsets.symmetric(vertical: 2, horizontal: 10),
child: Text(snapshot.data, style: TextStyle(color: Colors.white),),
),
);
else
return Container();
},
),
]), ]),
), ),
Row(children: [ Row(children: [

Loading…
Cancel
Save