From d22ce32cdb79ba3ea93877ff63eb8e1ac78090c1 Mon Sep 17 00:00:00 2001 From: Mohammad ALjammal Date: Sun, 5 Jul 2020 14:09:16 +0300 Subject: [PATCH] add call back android --- android/app/build.gradle | 5 + android/app/src/main/AndroidManifest.xml | 2 +- .../Model/GetSessionStatusModel.java | 115 ++++++++++++++++++ .../Model/SessionStatusModel.java | 106 ++++++++++++++++ .../Service/AppRetrofit.java | 69 +++++++++++ .../Service/SessionStatusAPI.java | 15 +++ .../{ => ui}/VideoCallActivity.java | 92 ++++++++++---- .../ui/VideoCallContract.java | 18 +++ .../ui/VideoCallPresenterImpl.java | 49 ++++++++ .../doctor_app_flutter/MainActivity.kt | 102 ++++++++++++---- .../main/res/layout/activity_video_call.xml | 2 +- lib/models/livecare/session_status_model.dart | 28 +++++ lib/screens/dashboard_screen.dart | 20 ++- lib/util/VideoChannel.dart | 31 +++-- 14 files changed, 592 insertions(+), 62 deletions(-) create mode 100644 android/app/src/main/java/com/example/doctor_app_flutter/Model/GetSessionStatusModel.java create mode 100644 android/app/src/main/java/com/example/doctor_app_flutter/Model/SessionStatusModel.java create mode 100644 android/app/src/main/java/com/example/doctor_app_flutter/Service/AppRetrofit.java create mode 100644 android/app/src/main/java/com/example/doctor_app_flutter/Service/SessionStatusAPI.java rename android/app/src/main/java/com/example/doctor_app_flutter/{ => ui}/VideoCallActivity.java (82%) create mode 100644 android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallContract.java create mode 100644 android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallPresenterImpl.java create mode 100644 lib/models/livecare/session_status_model.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 048dea59..ae87782e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -72,4 +72,9 @@ dependencies { implementation 'com.opentok.android:opentok-android-sdk:2.16.5' //permissions implementation 'pub.devrel:easypermissions:0.4.0' + + //retrofit + implementation 'com.squareup.retrofit2:retrofit:2.6.2' + implementation 'com.squareup.retrofit2:converter-gson:2.6.2' + implementation 'com.squareup.okhttp3:logging-interceptor:3.14.1' } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index fda3b312..51b33a46 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -15,7 +15,7 @@ android:name="io.flutter.app.FlutterApplication" android:icon="@mipmap/ic_launcher" android:label="doctor_app_flutter"> - + CREATOR = new Creator() { + @Override + public GetSessionStatusModel createFromParcel(Parcel in) { + return new GetSessionStatusModel(in); + } + + @Override + public GetSessionStatusModel[] newArray(int size) { + return new GetSessionStatusModel[size]; + } + }; + + public Integer getVCID() { + return vCID; + } + + public void setVCID(Integer vCID) { + this.vCID = vCID; + } + + public String getTokenID() { + return tokenID; + } + + public void setTokenID(String tokenID) { + this.tokenID = tokenID; + } + + public String getGeneralid() { + return generalid; + } + + public void setGeneralid(String generalid) { + this.generalid = generalid; + } + + public Integer getDoctorId() { + return doctorId; + } + + public void setDoctorId(Integer doctorId) { + this.doctorId = doctorId; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + if (vCID == null) { + dest.writeByte((byte) 0); + } else { + dest.writeByte((byte) 1); + dest.writeInt(vCID); + } + dest.writeString(tokenID); + dest.writeString(generalid); + if (doctorId == null) { + dest.writeByte((byte) 0); + } else { + dest.writeByte((byte) 1); + dest.writeInt(doctorId); + } + } +} diff --git a/android/app/src/main/java/com/example/doctor_app_flutter/Model/SessionStatusModel.java b/android/app/src/main/java/com/example/doctor_app_flutter/Model/SessionStatusModel.java new file mode 100644 index 00000000..da6bba1d --- /dev/null +++ b/android/app/src/main/java/com/example/doctor_app_flutter/Model/SessionStatusModel.java @@ -0,0 +1,106 @@ +package com.example.doctor_app_flutter.Model; + +import android.os.Parcel; +import android.os.Parcelable; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class SessionStatusModel implements Parcelable { + + @SerializedName("Result") + @Expose + private String result; + @SerializedName("SessionStatus") + @Expose + private Integer sessionStatus; + @SerializedName("IsAuthenticated") + @Expose + private Boolean isAuthenticated; + @SerializedName("MessageStatus") + @Expose + private Integer messageStatus; + + protected SessionStatusModel(Parcel in) { + result = in.readString(); + if (in.readByte() == 0) { + sessionStatus = null; + } else { + sessionStatus = in.readInt(); + } + byte tmpIsAuthenticated = in.readByte(); + isAuthenticated = tmpIsAuthenticated == 0 ? null : tmpIsAuthenticated == 1; + if (in.readByte() == 0) { + messageStatus = null; + } else { + messageStatus = in.readInt(); + } + } + + public static final Creator CREATOR = new Creator() { + @Override + public SessionStatusModel createFromParcel(Parcel in) { + return new SessionStatusModel(in); + } + + @Override + public SessionStatusModel[] newArray(int size) { + return new SessionStatusModel[size]; + } + }; + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public Integer getSessionStatus() { + return sessionStatus; + } + + public void setSessionStatus(Integer sessionStatus) { + this.sessionStatus = sessionStatus; + } + + public Boolean getIsAuthenticated() { + return isAuthenticated; + } + + public void setIsAuthenticated(Boolean isAuthenticated) { + this.isAuthenticated = isAuthenticated; + } + + public Integer getMessageStatus() { + return messageStatus; + } + + public void setMessageStatus(Integer messageStatus) { + this.messageStatus = messageStatus; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(result); + if (sessionStatus == null) { + dest.writeByte((byte) 0); + } else { + dest.writeByte((byte) 1); + dest.writeInt(sessionStatus); + } + dest.writeByte((byte) (isAuthenticated == null ? 0 : isAuthenticated ? 1 : 2)); + if (messageStatus == null) { + dest.writeByte((byte) 0); + } else { + dest.writeByte((byte) 1); + dest.writeInt(messageStatus); + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/example/doctor_app_flutter/Service/AppRetrofit.java b/android/app/src/main/java/com/example/doctor_app_flutter/Service/AppRetrofit.java new file mode 100644 index 00000000..6646bd6f --- /dev/null +++ b/android/app/src/main/java/com/example/doctor_app_flutter/Service/AppRetrofit.java @@ -0,0 +1,69 @@ +package com.example.doctor_app_flutter.Service; + +import android.app.Activity; +import android.app.Application; + +import androidx.annotation.CallSuper; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.util.concurrent.TimeUnit; + +import io.flutter.view.FlutterMain; +import okhttp3.ConnectionPool; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class AppRetrofit extends Application { + private static final int MY_SOCKET_TIMEOUT_MS = 20000; + + @Override + @CallSuper + public void onCreate() { + super.onCreate(); + FlutterMain.startInitialization(this); + } + + private Activity mCurrentActivity = null; + + public Activity getCurrentActivity() { + return mCurrentActivity; + } + + public void setCurrentActivity(Activity mCurrentActivity) { + this.mCurrentActivity = mCurrentActivity; + } + + public static Retrofit getRetrofit( String baseUrl) { + + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + Gson gson = new GsonBuilder().serializeNulls().create(); + OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(chain -> { + okhttp3.Request originalRequest = chain.request(); + okhttp3.Request newRequest = originalRequest.newBuilder() + .addHeader("Content-Type","application/json") + .addHeader("Accept","application/json") + .build(); + + return chain.proceed(newRequest); + }) + .addInterceptor(interceptor) + .callTimeout(MY_SOCKET_TIMEOUT_MS, TimeUnit.SECONDS) + .connectTimeout(MY_SOCKET_TIMEOUT_MS, TimeUnit.SECONDS) + .readTimeout(MY_SOCKET_TIMEOUT_MS, TimeUnit.SECONDS) + .connectionPool(new ConnectionPool(0, 5 * 60 * 1000, TimeUnit.SECONDS)) + .retryOnConnectionFailure(false) + .build(); + + + return new Retrofit.Builder() + .baseUrl(baseUrl) + .addConverterFactory(GsonConverterFactory.create(gson)) + .client(okHttpClient) + .build(); + } +} diff --git a/android/app/src/main/java/com/example/doctor_app_flutter/Service/SessionStatusAPI.java b/android/app/src/main/java/com/example/doctor_app_flutter/Service/SessionStatusAPI.java new file mode 100644 index 00000000..fbc8d1d3 --- /dev/null +++ b/android/app/src/main/java/com/example/doctor_app_flutter/Service/SessionStatusAPI.java @@ -0,0 +1,15 @@ +package com.example.doctor_app_flutter.Service; + +import com.example.doctor_app_flutter.Model.GetSessionStatusModel; +import com.example.doctor_app_flutter.Model.SessionStatusModel; + + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.POST; + +public interface SessionStatusAPI { + + @POST("LiveCareApi/DoctorApp/GetSessionStatus") + Call getSessionStatusModelData(@Body GetSessionStatusModel getSessionStatusModel); +} diff --git a/android/app/src/main/java/com/example/doctor_app_flutter/VideoCallActivity.java b/android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallActivity.java similarity index 82% rename from android/app/src/main/java/com/example/doctor_app_flutter/VideoCallActivity.java rename to android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallActivity.java index 146a3d54..adc32d38 100644 --- a/android/app/src/main/java/com/example/doctor_app_flutter/VideoCallActivity.java +++ b/android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallActivity.java @@ -1,18 +1,17 @@ -package com.example.doctor_app_flutter; +package com.example.doctor_app_flutter.ui; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.Manifest; import android.annotation.SuppressLint; -import android.content.res.ColorStateList; -import android.graphics.Color; +import android.app.Activity; +import android.content.Intent; import android.opengl.GLSurfaceView; import android.os.Bundle; import android.os.CountDownTimer; import android.os.Handler; import android.util.Log; -import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; @@ -21,6 +20,9 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import com.example.doctor_app_flutter.Model.GetSessionStatusModel; +import com.example.doctor_app_flutter.Model.SessionStatusModel; +import com.example.doctor_app_flutter.R; import com.opentok.android.Session; import com.opentok.android.Stream; import com.opentok.android.Publisher; @@ -40,31 +42,32 @@ import pub.devrel.easypermissions.EasyPermissions; public class VideoCallActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, Session.SessionListener, Publisher.PublisherListener, - Subscriber.VideoListener { - + Subscriber.VideoListener, VideoCallContract.VideoCallView { private static final String TAG = VideoCallActivity.class.getSimpleName(); + VideoCallContract.VideoCallPresenter videoCallPresenter; + private static final int RC_SETTINGS_SCREEN_PERM = 123; private static final int RC_VIDEO_APP_PERM = 124; + private Session mSession; private Publisher mPublisher; private Subscriber mSubscriber; - private Handler mVolHandler; - private Runnable mVolRunnable; + private Handler mVolHandler, mConnectedHandler; + private Runnable mVolRunnable, mConnectedRunnable; private FrameLayout mPublisherViewContainer; private RelativeLayout mSubscriberViewContainer; private RelativeLayout controlPanel; - private String apiKey; - private String sessionId; - private String token; - private String callDuration; - private String warningDuration; - private String appLang; + private String apiKey; + private String sessionId; + private String token; + private String appLang; + private String baseUrl; private boolean isSwitchCameraClicked; private boolean isCameraClicked; @@ -82,6 +85,10 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi private TextView progressBarTextView; private RelativeLayout progressBarLayout; + private boolean isConnected = false; + + private GetSessionStatusModel sessionStatusModel; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -132,11 +139,14 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi apiKey = getIntent().getStringExtra("apiKey"); sessionId = getIntent().getStringExtra("sessionId"); token = getIntent().getStringExtra("token"); - // callDuration = getIntent().getStringExtra("callDuration"); - // warningDuration = getIntent().getStringExtra("warningDuration"); - appLang=getIntent().getStringExtra("appLang"); + appLang = getIntent().getStringExtra("appLang"); + baseUrl = getIntent().getStringExtra("baseUrl"); + sessionStatusModel = getIntent().getParcelableExtra("sessionStatusModel"); + + controlPanel = findViewById(R.id.control_panel); + + videoCallPresenter = new VideoCallPresenterImpl(this, baseUrl); - controlPanel=findViewById(R.id.control_panel); mCallBtn = findViewById(R.id.btn_call); mCameraBtn = findViewById(R.id.btn_camera); @@ -144,17 +154,19 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi mspeckerBtn = findViewById(R.id.btn_specker); mMicBtn = findViewById(R.id.btn_mic); - // progressBarLayout=findViewById(R.id.progressBar); - // progressBar=findViewById(R.id.progress_bar); + // progressBarLayout=findViewById(R.id.progressBar); + // progressBar=findViewById(R.id.progress_bar); // progressBarTextView=findViewById(R.id.progress_bar_text); // progressBar.setVisibility(View.GONE); hiddenButtons(); + checkClientConnected(); + mSubscriberViewContainer.setOnTouchListener((v, event) -> { controlPanel.setVisibility(View.VISIBLE); mVolHandler.removeCallbacks(mVolRunnable); - mVolHandler.postDelayed(mVolRunnable, 5*1000); + mVolHandler.postDelayed(mVolRunnable, 5 * 1000); return true; }); @@ -164,16 +176,25 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi } + private void checkClientConnected() { + mConnectedHandler = new Handler(); + mConnectedRunnable = () -> { + if (!isConnected) { + videoCallPresenter.callClintConnected(sessionStatusModel); + } + }; + mConnectedHandler.postDelayed(mConnectedRunnable, 7 * 1000); + } - private void hiddenButtons(){ + private void hiddenButtons() { mVolHandler = new Handler(); mVolRunnable = new Runnable() { public void run() { controlPanel.setVisibility(View.GONE); } }; - mVolHandler.postDelayed(mVolRunnable,5*1000); + mVolHandler.postDelayed(mVolRunnable, 5 * 1000); } @Override @@ -225,7 +246,7 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi mPublisherViewContainer.addView(mPublisher.getView()); - if (mPublisher.getView() instanceof GLSurfaceView){ + if (mPublisher.getView() instanceof GLSurfaceView) { ((GLSurfaceView) mPublisher.getView()).setZOrderOnTop(true); } @@ -250,10 +271,11 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi @Override public void onStreamReceived(Session session, Stream stream) { Log.d(TAG, "onStreamReceived: New stream " + stream.getStreamId() + " in session " + session.getSessionId()); - if (mSubscriber != null) { + isConnected = true; return; } + isConnected = true; subscribeToStream(stream); } @@ -325,6 +347,7 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi private void disconnectSession() { if (mSession == null) { + setResult(Activity.RESULT_CANCELED); finish(); return; } @@ -343,7 +366,7 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi mPublisher = null; } mSession.disconnect(); - if(countDownTimer!=null) { + if (countDownTimer != null) { countDownTimer.cancel(); } finish(); @@ -375,7 +398,9 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi mspeckerBtn.setImageResource(res); } } + public void onMicClicked(View view) { + if (mPublisher != null) { isMicClicked = !isMicClicked; mPublisher.setPublishAudio(!isMicClicked); @@ -387,4 +412,19 @@ public class VideoCallActivity extends AppCompatActivity implements EasyPermissi public void onCallClicked(View view) { disconnectSession(); } + + @Override + public void onCallSuccessful(SessionStatusModel sessionStatusModel) { + if (sessionStatusModel.getSessionStatus() == 2 || sessionStatusModel.getSessionStatus() == 3) { + Intent returnIntent = new Intent(); + returnIntent.putExtra("sessionStatusNotRespond", sessionStatusModel); + setResult(Activity.RESULT_OK, returnIntent); + finish(); + } + } + + @Override + public void onFailure() { + + } } \ No newline at end of file diff --git a/android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallContract.java b/android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallContract.java new file mode 100644 index 00000000..21122239 --- /dev/null +++ b/android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallContract.java @@ -0,0 +1,18 @@ +package com.example.doctor_app_flutter.ui; + +import com.example.doctor_app_flutter.Model.GetSessionStatusModel; +import com.example.doctor_app_flutter.Model.SessionStatusModel; + +public interface VideoCallContract { + + interface VideoCallView{ + + void onCallSuccessful(SessionStatusModel sessionStatusModel); + void onFailure(); + } + + interface VideoCallPresenter { + + void callClintConnected(GetSessionStatusModel statusModel); + } +} diff --git a/android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallPresenterImpl.java b/android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallPresenterImpl.java new file mode 100644 index 00000000..363d1ca8 --- /dev/null +++ b/android/app/src/main/java/com/example/doctor_app_flutter/ui/VideoCallPresenterImpl.java @@ -0,0 +1,49 @@ +package com.example.doctor_app_flutter.ui; + +import com.example.doctor_app_flutter.Model.GetSessionStatusModel; +import com.example.doctor_app_flutter.Model.SessionStatusModel; +import com.example.doctor_app_flutter.Service.AppRetrofit; +import com.example.doctor_app_flutter.Service.SessionStatusAPI; + +import org.jetbrains.annotations.NotNull; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class VideoCallPresenterImpl implements VideoCallContract.VideoCallPresenter { + + private VideoCallContract.VideoCallView view; + private SessionStatusAPI sessionStatusAPI; + private String baseUrl; + + public VideoCallPresenterImpl(VideoCallContract.VideoCallView view, String baseUrl) { + this.view = view; + this.baseUrl = baseUrl; + } + + @Override + public void callClintConnected(GetSessionStatusModel statusModel) { + + + sessionStatusAPI = AppRetrofit.getRetrofit(baseUrl).create(SessionStatusAPI.class); + + Call call = sessionStatusAPI.getSessionStatusModelData(statusModel); + + call.enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) { + if (response.isSuccessful()) { + view.onCallSuccessful(response.body()); + } else + view.onFailure(); + } + + @Override + public void onFailure(@NotNull Call call, @NotNull Throwable t) { + view.onFailure(); + } + }); + + } +} diff --git a/android/app/src/main/kotlin/com/example/doctor_app_flutter/MainActivity.kt b/android/app/src/main/kotlin/com/example/doctor_app_flutter/MainActivity.kt index d1d710ad..1a203368 100644 --- a/android/app/src/main/kotlin/com/example/doctor_app_flutter/MainActivity.kt +++ b/android/app/src/main/kotlin/com/example/doctor_app_flutter/MainActivity.kt @@ -1,45 +1,101 @@ package com.example.doctor_app_flutter +import android.app.Activity import android.content.Intent -import androidx.annotation.NonNull; -import io.flutter.embedding.android.FlutterActivity -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugins.GeneratedPluginRegistrant +import androidx.annotation.NonNull +import com.example.doctor_app_flutter.Model.GetSessionStatusModel +import com.example.doctor_app_flutter.Model.SessionStatusModel +import com.example.doctor_app_flutter.ui.VideoCallActivity +import com.google.gson.GsonBuilder import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel +import io.flutter.plugins.GeneratedPluginRegistrant -class MainActivity: FlutterFragmentActivity() { +class MainActivity : FlutterFragmentActivity(), MethodChannel.MethodCallHandler { private val CHANNEL = "Dr.cloudSolution/videoCall" + private var result: MethodChannel.Result? = null + private var call: MethodCall? = null + private val LAUNCH_VIDEO: Int = 1 override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine) - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { - call, result -> - if (call.method == "openVideoCall") { - val apiKey = call.argument("kApiKey") - val sessionId = call.argument("kSessionId") - val token = call.argument("kToken") - // val callDuration = call.argument("callDuration") - // val warningDuration = call.argument("warningDuration") - val appLang = call.argument("appLang") - openVideoCall(apiKey,sessionId,token/*,callDuration,warningDuration*/,appLang) - } else { - result.notImplemented() - } - } + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler(this) } - private fun openVideoCall(apiKey: String?, sessionId: String?, token: String?/*, callDuration: String?, warningDuration: String?*/, appLang: String?) { + + override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { + + this.result = result + this.call = call + + if (call.method == "openVideoCall") { + val apiKey = call.argument("kApiKey") + val sessionId = call.argument("kSessionId") + val token = call.argument("kToken") + val appLang = call.argument("appLang") + val baseUrl = call.argument("baseUrl") + + // Session Status model + val VC_ID = call.argument("VC_ID") + val tokenID = call.argument("TokenID") + val generalId = call.argument("generalId") + val doctorId = call.argument("DoctorId") + + val sessionStatusModel = GetSessionStatusModel(VC_ID, tokenID, generalId, doctorId) + + + openVideoCall(apiKey, sessionId, token, appLang, baseUrl, sessionStatusModel) + + } else { + result.notImplemented() + } + } + + private fun openVideoCall(apiKey: String?, sessionId: String?, token: String?, appLang: String?, baseUrl: String?, sessionStatusModel: GetSessionStatusModel) { + // val videoCallActivity = VideoCallActivity() + val intent = Intent(this, VideoCallActivity::class.java) intent.putExtra("apiKey", apiKey) intent.putExtra("sessionId", sessionId) intent.putExtra("token", token) - // intent.putExtra("callDuration", callDuration) - //intent.putExtra("warningDuration", warningDuration) intent.putExtra("appLang", appLang) - startActivity(intent) + intent.putExtra("baseUrl", baseUrl) + intent.putExtra("sessionStatusModel", sessionStatusModel) + startActivityForResult(intent, LAUNCH_VIDEO) + + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + var asd = ""; + if (requestCode == LAUNCH_VIDEO) { + if (resultCode == Activity.RESULT_OK) { + val result : SessionStatusModel? = data?.getParcelableExtra("sessionStatusNotRespond") + val callResponse : HashMap = HashMap() + + val sessionStatus : HashMap = HashMap() + val gson = GsonBuilder().serializeNulls().create() + + callResponse["callResponse"] = "CallNotRespond" + val jsonRes = gson.toJson(result) + callResponse["sessionStatus"] = jsonRes + + this.result?.success(gson.toJson(callResponse)) + } + if (resultCode == Activity.RESULT_CANCELED) { + val callResponse : HashMap = HashMap() + callResponse["callResponse"] = "CallEnd" + + result?.success(callResponse) + } + } } + + } diff --git a/android/app/src/main/res/layout/activity_video_call.xml b/android/app/src/main/res/layout/activity_video_call.xml index c7500b6c..2dcf2ba4 100644 --- a/android/app/src/main/res/layout/activity_video_call.xml +++ b/android/app/src/main/res/layout/activity_video_call.xml @@ -4,7 +4,7 @@ android:id="@+id/activity_clingo_video_call" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".VideoCallActivity"> + tools:context=".ui.VideoCallActivity"> json) { + isAuthenticated = json['IsAuthenticated']; + messageStatus = json['MessageStatus']; + result = json['Result']; + sessionStatus = json['SessionStatus']; + } + + Map toJson() { + final Map data = new Map(); + data['IsAuthenticated'] = this.isAuthenticated; + data['MessageStatus'] = this.messageStatus; + data['Result'] = this.result; + data['SessionStatus'] = this.sessionStatus; + return data; + } +} diff --git a/lib/screens/dashboard_screen.dart b/lib/screens/dashboard_screen.dart index ad64d89a..52ecf34f 100644 --- a/lib/screens/dashboard_screen.dart +++ b/lib/screens/dashboard_screen.dart @@ -1,9 +1,12 @@ +import 'dart:convert'; + import 'package:doctor_app_flutter/config/shared_pref_kay.dart'; import 'package:doctor_app_flutter/config/size_config.dart'; import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart'; import 'package:doctor_app_flutter/models/doctor/clinic_model.dart'; import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart'; import 'package:doctor_app_flutter/models/doctor/profile_req_Model.dart'; +import 'package:doctor_app_flutter/models/livecare/session_status_model.dart'; import 'package:doctor_app_flutter/providers/auth_provider.dart'; import 'package:doctor_app_flutter/providers/doctor_reply_provider.dart'; import 'package:doctor_app_flutter/providers/hospital_provider.dart'; @@ -101,10 +104,19 @@ class _DashboardScreenState extends State { crossAxisAlignment: CrossAxisAlignment.end, children: [ InkWell( - onTap: () { - showCupertinoPicker( - context: context, - actionList: authProvider.doctorsClinicList); + onTap: () async { + await VideoChannel.openVideoCallScreen( + kToken: 'T1==cGFydG5lcl9pZD00NjgwMzIyNCZzaWc9NWRhNmExMzU4ZDViZGU3OTA5NDY4ODRhNzI4ZGUxZTRmMjZmNzcwMjpzZXNzaW9uX2lkPTFfTVg0ME5qZ3dNekl5Tkg1LU1UVTVNelk0TXpZek9EWXdNMzV1Y0V4V1lWUlZTbTVIY3k5dVdHWm1NMWxPYTNjelpIVi1mZyZjcmVhdGVfdGltZT0xNTkzNjgzNjYyJm5vbmNlPTAuODAxMzMzMzUxMDQwNzE5NSZyb2xlPXB1Ymxpc2hlciZleHBpcmVfdGltZT0xNTk2Mjc1NjYyJmluaXRpYWxfbGF5b3V0X2NsYXNzX2xpc3Q9', + kSessionId: '1_MX40NjgwMzIyNH5-MTU5MzY4MzYzODYwM35ucExWYVRVSm5Hcy9uWGZmM1lOa3czZHV-fg', + kApiKey: '46803224', + onFailure: (String error) {}, + onCallEnd: () {}, + callNotRespond: (SessionStatusModel sessionStatusModel) {}); + + +// showCupertinoPicker( +// context: context, +// actionList: authProvider.doctorsClinicList); }, child: Container( margin: diff --git a/lib/util/VideoChannel.dart b/lib/util/VideoChannel.dart index c5bf278e..73b17930 100644 --- a/lib/util/VideoChannel.dart +++ b/lib/util/VideoChannel.dart @@ -1,28 +1,45 @@ +import 'dart:convert'; + +import 'package:doctor_app_flutter/config/config.dart'; +import 'package:doctor_app_flutter/models/livecare/session_status_model.dart'; import 'package:flutter/services.dart'; class VideoChannel{ /// channel name static const _channel = const MethodChannel("Dr.cloudSolution/videoCall"); - static Future openVideoCallScreen( - {kApiKey, kSessionId, kToken, callDuration, warningDuration}) { + static openVideoCallScreen( + {kApiKey, kSessionId, kToken, callDuration, warningDuration, Function() onCallEnd , Function(SessionStatusModel sessionStatusModel) callNotRespond ,Function(String error) onFailure}) async { var result; try { - result = _channel.invokeMethod( + result = await _channel.invokeMethod( 'openVideoCall', { "kApiKey": kApiKey, "kSessionId": kSessionId, "kToken": kToken, - /* "callDuration": callDuration, - "warningDuration": warningDuration,*/ "appLang": "en", + "baseUrl": BASE_URL, + "VC_ID": 3245, + "TokenID": "hfkjshdf347r8743", + "generalId": 'Cs2020@2016\$2958', + "DoctorId": 1485 , }, ); + if(result['callResponse'] == 'CallEnd') { + onCallEnd(); + } + else { + var asd = result['sessionStatus']; + var parsed = json.decode(result['sessionStatus']); + SessionStatusModel sessionStatusModel = SessionStatusModel.fromJson(parsed); + callNotRespond(sessionStatusModel); + } + } on PlatformException catch (e) { - result = e.toString(); + onFailure(e.toString()); } - return result; + }