no message

videocall_popup
Zohaib Iqbal Kambrani 5 years ago
parent 63526113f4
commit 1b4988e5f0

@ -27,6 +27,8 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
@ -36,8 +38,8 @@
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@ -59,6 +61,8 @@
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"

@ -171,8 +171,13 @@
<constraint firstItem="lar-xK-rhR" firstAttribute="width" secondItem="lar-xK-rhR" secondAttribute="height" multiplier="1:1" id="R46-j0-zPf"/>
<constraint firstItem="UZ6-EY-a59" firstAttribute="height" secondItem="NUO-2p-pzL" secondAttribute="height" id="kK6-uF-bf6"/>
<constraint firstItem="N2h-FX-kF5" firstAttribute="height" secondItem="NUO-2p-pzL" secondAttribute="height" id="o4R-49-iMe"/>
<constraint firstAttribute="height" priority="900" constant="30" id="y90-hA-p5Z"/>
<constraint firstAttribute="height" constant="30" id="y90-hA-p5Z"/>
</constraints>
<variation key="default">
<mask key="constraints">
<exclude reference="y90-hA-p5Z"/>
</mask>
</variation>
</stackView>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="AoF-Up-Yu5" userLabel="hangUpButton">
<rect key="frame" x="363" y="15" width="50" height="50"/>
@ -185,10 +190,12 @@
</connections>
</button>
</subviews>
<color key="backgroundColor" red="0.18431372549019609" green="0.1764705882352941" blue="0.16470588235294117" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="displayP3"/>
<color key="backgroundColor" red="0.18431372549019609" green="0.1764705882352941" blue="0.16470588235294117" alpha="0.5" colorSpace="custom" customColorSpace="displayP3"/>
<constraints>
<constraint firstItem="r9w-8l-Zxj" firstAttribute="top" secondItem="sK0-tB-H9u" secondAttribute="top" constant="15" id="00C-1i-sGc"/>
<constraint firstItem="AoF-Up-Yu5" firstAttribute="bottom" secondItem="r9w-8l-Zxj" secondAttribute="bottom" id="1kB-OK-b0L"/>
<constraint firstItem="r9w-8l-Zxj" firstAttribute="leading" secondItem="sK0-tB-H9u" secondAttribute="leading" priority="900" constant="5" id="6B7-94-Myo"/>
<constraint firstAttribute="trailing" secondItem="AoF-Up-Yu5" secondAttribute="trailing" priority="900" constant="5" id="DgE-WQ-KQm"/>
<constraint firstItem="r9w-8l-Zxj" firstAttribute="top" secondItem="sK0-tB-H9u" secondAttribute="top" priority="900" constant="5" id="Ft5-cy-2d0"/>
<constraint firstAttribute="bottom" secondItem="r9w-8l-Zxj" secondAttribute="bottom" constant="30" id="G9u-kw-mVz"/>
<constraint firstItem="AoF-Up-Yu5" firstAttribute="top" secondItem="r9w-8l-Zxj" secondAttribute="top" id="H4s-Y8-HAI"/>
@ -200,6 +207,21 @@
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="2nj-Va-L7c" userLabel="TopBar">
<rect key="frame" x="0.0" y="0.0" width="428" height="100"/>
<subviews>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="n8H-om-4LV">
<rect key="frame" x="393" y="75" width="25" height="25"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="dyc-7x-bTk"/>
<constraint firstAttribute="width" constant="25" id="tYx-Ul-0Pf"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="60"/>
<state key="normal" image="hide_video_icon">
<color key="titleColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</state>
<connections>
<action selector="hideVideoBtnTapped:" destination="t2c-G5-7AE" eventType="touchUpInside" id="2mC-ry-Lis"/>
</connections>
</button>
<stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="10" translatesAutoresizingMaskIntoConstraints="NO" id="bvC-Fa-s3m">
<rect key="frame" x="15" y="50" width="398" height="30"/>
<subviews>
@ -209,22 +231,11 @@
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="n8H-om-4LV">
<rect key="frame" x="333" y="-21" width="40" height="72"/>
<constraints>
<constraint firstAttribute="width" constant="40" id="tYx-Ul-0Pf"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="60"/>
<state key="normal" image="hide_video_icon"/>
<connections>
<action selector="hideVideoBtnTapped:" destination="t2c-G5-7AE" eventType="touchUpInside" id="2mC-ry-Lis"/>
</connections>
</button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="8Xn-w6-Mox">
<rect key="frame" x="338" y="3" width="60" height="24"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="10:30" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Btq-Ll-BPH">
<rect key="frame" x="12.666666666666686" y="5.0000000000000009" width="34.666666666666664" height="14.333333333333336"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="-- : --" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Btq-Ll-BPH">
<rect key="frame" x="13.333333333333314" y="5.0000000000000009" width="33.666666666666664" height="14.333333333333336"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="12"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@ -250,11 +261,13 @@
<color key="backgroundColor" red="0.18431372549019609" green="0.1764705882352941" blue="0.16470588235294117" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="displayP3"/>
<constraints>
<constraint firstAttribute="height" constant="100" id="6eP-Zl-97q"/>
<constraint firstAttribute="trailing" secondItem="n8H-om-4LV" secondAttribute="trailing" constant="10" id="7Uq-4Q-ywD"/>
<constraint firstAttribute="bottom" secondItem="bvC-Fa-s3m" secondAttribute="bottom" priority="900" constant="5" id="HgY-Dw-B9R"/>
<constraint firstAttribute="bottom" secondItem="n8H-om-4LV" secondAttribute="bottom" id="Nr2-zL-avJ"/>
<constraint firstAttribute="bottom" secondItem="bvC-Fa-s3m" secondAttribute="bottom" constant="20" id="PWn-Sb-O8B"/>
<constraint firstItem="bvC-Fa-s3m" firstAttribute="leading" secondItem="2nj-Va-L7c" secondAttribute="leading" constant="15" id="YH4-fV-fkQ"/>
<constraint firstAttribute="trailing" secondItem="bvC-Fa-s3m" secondAttribute="trailing" constant="15" id="oq6-Oi-i7g"/>
<constraint firstAttribute="height" priority="900" constant="20" id="s8H-wK-WPB"/>
<constraint firstAttribute="height" priority="900" constant="25" id="s8H-wK-WPB"/>
</constraints>
</view>
</subviews>
@ -281,6 +294,7 @@
</view>
<navigationItem key="navigationItem" id="s5b-6P-Hwj"/>
<connections>
<outlet property="camSwitchBtn" destination="lar-xK-rhR" id="tde-s5-Mji"/>
<outlet property="controlButtons" destination="sK0-tB-H9u" id="mDK-cq-oQz"/>
<outlet property="draggableBoundryDefiner" destination="O5s-CJ-RFv" id="npi-81-C23"/>
<outlet property="hideVideoBtn" destination="n8H-om-4LV" id="tTp-Ep-XKS"/>
@ -288,18 +302,24 @@
<outlet property="lblRemoteUsername" destination="Zct-62-YE6" id="OQ0-mf-mvc"/>
<outlet property="localVideo" destination="0ZP-s2-kM5" id="C68-k7-h5j"/>
<outlet property="localVideoMutedBg" destination="6y1-an-W7F" id="5FF-Ak-Vxb"/>
<outlet property="micMuteBtn" destination="N2h-FX-kF5" id="AVo-sY-x2z"/>
<outlet property="micMuteBtn" destination="N2h-FX-kF5" id="zgK-g1-Ndr"/>
<outlet property="remoteVideo" destination="eOT-Jr-GUl" id="VKE-el-YGR"/>
<outlet property="remoteVideoMutedIndicator" destination="CL1-2v-m1L" id="aJ0-QC-m9Y"/>
<outlet property="videoMuteBtn" destination="NUO-2p-pzL" id="XCc-nu-N8P"/>
<outletCollection property="maximisedConstraint" destination="00C-1i-sGc" collectionClass="NSMutableArray" id="22d-C9-unV"/>
<outletCollection property="maximisedConstraint" destination="sK0-tB-H9u" collectionClass="NSMutableArray" id="bbn-c9-Vz9"/>
<outletCollection property="maximisedConstraint" destination="3L0-3h-Bxg" collectionClass="NSMutableArray" id="aSR-qc-kmn"/>
<outletCollection property="maximisedConstraint" destination="6eP-Zl-97q" collectionClass="NSMutableArray" id="5qG-eU-f1V"/>
<outletCollection property="maximisedConstraint" destination="2nj-Va-L7c" collectionClass="NSMutableArray" id="sSt-7N-End"/>
<outletCollection property="minimizeConstraint" destination="sK0-tB-H9u" collectionClass="NSMutableArray" id="fVM-C7-UAN"/>
<outletCollection property="minimizeConstraint" destination="sK0-tB-H9u" collectionClass="NSMutableArray" id="p6x-N9-60o"/>
<outletCollection property="minimizeConstraint" destination="y90-hA-p5Z" collectionClass="NSMutableArray" id="97Z-hF-vZa"/>
<outletCollection property="minimizeConstraint" destination="s8H-wK-WPB" collectionClass="NSMutableArray" id="XTM-jR-Cos"/>
<outletCollection property="minimizeConstraint" destination="HgY-Dw-B9R" collectionClass="NSMutableArray" id="Fi8-YX-9iQ"/>
<outletCollection property="minimizeConstraint" destination="Ft5-cy-2d0" collectionClass="NSMutableArray" id="Ze3-H8-gj4"/>
<outletCollection property="minimizeConstraint" destination="n0r-vM-wKh" collectionClass="NSMutableArray" id="IaQ-TS-ng8"/>
<outletCollection property="maximisedConstraint" destination="G9u-kw-mVz" collectionClass="NSMutableArray" id="TaK-5m-byK"/>
<outletCollection property="maximisedConstraint" destination="00C-1i-sGc" collectionClass="NSMutableArray" id="vmx-rp-JZI"/>
<outletCollection property="maximisedConstraint" destination="PWn-Sb-O8B" collectionClass="NSMutableArray" id="pK4-yA-36p"/>
<outletCollection property="maximisedConstraint" destination="6eP-Zl-97q" collectionClass="NSMutableArray" id="dxk-ol-uAW"/>
<outletCollection property="maximisedConstraint" destination="3L0-3h-Bxg" collectionClass="NSMutableArray" id="w3Q-AR-TQY"/>
<outletCollection property="minimizeConstraint" destination="y90-hA-p5Z" collectionClass="NSMutableArray" id="INL-Bc-eTM"/>
<outletCollection property="minimizeConstraint" destination="DgE-WQ-KQm" collectionClass="NSMutableArray" id="zy0-aI-bnY"/>
<outletCollection property="maximisedConstraint" destination="flB-AR-zo3" collectionClass="NSMutableArray" id="hwu-U4-5s5"/>
<outletCollection property="minimizeConstraint" destination="6B7-94-Myo" collectionClass="NSMutableArray" id="epM-Kg-2yi"/>
<outletCollection property="maximisedConstraint" destination="x13-gZ-cYp" collectionClass="NSMutableArray" id="uLI-UQ-yIo"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="x33-EE-6Ak" sceneMemberID="firstResponder"/>

@ -27,9 +27,10 @@ class MainAppViewController: FlutterViewController{
super.viewDidAppear(animated)
}
var videoCallChannel:FlutterMethodChannel?
private func initFlutterBridge(){
let videoCallChannel = FlutterMethodChannel(name: "Dr.cloudSolution/videoCall", binaryMessenger: binaryMessenger)
videoCallChannel.setMethodCallHandler({
videoCallChannel = FlutterMethodChannel(name: "Dr.cloudSolution/videoCall", binaryMessenger: binaryMessenger)
videoCallChannel?.setMethodCallHandler({
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
switch call.method {
case "openVideoCall":
@ -86,6 +87,10 @@ extension MainAppViewController : ICallProtocol{
}
videoCallViewController.onHide = {
self.videoCallContainer.isHidden = true
self.videoCallChannel?.invokeMethod("onHide", arguments: nil)
}
videoCallViewController.onVideoDuration = { duration in
self.videoCallChannel?.invokeMethod("onVideoDuration", arguments: duration)
}
videoCallViewController.onClose = videoCallClosed
videoCallViewController.callBack = self

@ -36,6 +36,7 @@ class VideoCallViewController: UIViewController {
var onMinimize:((Bool)->Void)? = nil
var onHide:(()->Void)? = nil
var onVideoDuration:((String)->Void)? = nil
var onClose:(()->Void)? = nil
@ -44,6 +45,7 @@ class VideoCallViewController: UIViewController {
// Bottom Actions
@IBOutlet weak var videoMuteBtn: UIButton!
@IBOutlet weak var micMuteBtn: UIButton!
@IBOutlet weak var camSwitchBtn: UIButton!
@IBOutlet var minimizeConstraint: [NSLayoutConstraint]!
@IBOutlet var maximisedConstraint: [NSLayoutConstraint]!
@ -110,6 +112,10 @@ class VideoCallViewController: UIViewController {
sessionDisconnect()
}
@IBAction func hideVideoBtnTapped(_ sender: Any) {
onHide?()
}
var minimized = false
@IBAction func onMinimize(_ sender: UIButton) {
minimized = !minimized
@ -122,11 +128,13 @@ class VideoCallViewController: UIViewController {
lblRemoteUsername.isHidden = minimized
hideVideoBtn.isHidden = !minimized
lblCallDuration.superview?.isHidden = !hideVideoBtn.isHidden
let min_ = minimized
UIView.animate(withDuration: 0.5) {
self.videoMuteBtn.isHidden = min_
self.micMuteBtn.isHidden = min_
self.camSwitchBtn.isHidden = min_
let localVdoSize = self.localVideo.bounds.size
let remoteVdoSize = self.remoteVideo.bounds.size
@ -137,8 +145,20 @@ class VideoCallViewController: UIViewController {
}
}
@IBAction func hideVideoBtnTapped(_ sender: Any) {
onHide?()
var durationTimer:Timer?;
func startUpdateCallDuration(){
var seconds = 0
durationTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
seconds = seconds+1
let durationSegments = (seconds / 3600, (seconds % 3600) / 60, (seconds % 3600) % 60)
let hours = String(format: "%02d", durationSegments.0)
let mins = String(format: "%02d", durationSegments.1)
let secs = String(format: "%02d", durationSegments.2)
let durationString = "\(mins):\(secs)"
self.lblCallDuration.text = durationString
self.onVideoDuration?(durationString)
}
}
func start(params:VideoCallRequestParameters){
@ -410,8 +430,11 @@ extension VideoCallViewController: OTSessionDelegate {
guard let subscriberView = subscriber.view else {
return
}
subscriberView.frame = CGRect(x: 0, y: 0, width: remoteVideo.bounds.width, height: remoteVideo.bounds.height)
remoteVideo.addSubview(subscriberView)
startUpdateCallDuration()
}
func setupSubscribe(_ stream: OTStream?) {
@ -474,7 +497,7 @@ extension VideoCallViewController: OTSubscriberDelegate {
print("The subscriber failed to connect to the stream.")
}
@objc func hideControlButtons() {
controlButtons.isHidden = true
// controlButtons.isHidden = true
}
}

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/viewModel/LiveCarePatientViewModel.dart';
@ -46,10 +48,15 @@ class _PatientProfileScreenState extends State<PatientProfileScreen>
TabController _tabController;
int index = 0;
int _activeTab = 0;
StreamController<String> videoCallDurationStreamController;
Stream<String> videoCallDurationStream = (() async*{})();
@override
void initState() {
_tabController = TabController(length: 2, vsync: this);
super.initState();
videoCallDurationStreamController = StreamController();
videoCallDurationStream = videoCallDurationStreamController.stream;
}
@override
@ -103,16 +110,20 @@ class _PatientProfileScreenState extends State<PatientProfileScreen>
Column(
children: [
PatientProfileHeaderNewDesignAppBar(
patient, arrivalType ?? '0', patientType,
isInpatient: isInpatient,
isFromLiveCare: isFromLiveCare,
height: (patient.patientStatusType != null &&
patient.patientStatusType == 43)
? 210
: isDischargedPatient
? 240
: 0,
isDischargedPatient: isDischargedPatient),
patient, arrivalType ?? '0', patientType,
videoCallDurationStream: videoCallDurationStream,
onVideoDurationTap: (){
VideoChannel.show();
},
isInpatient: isInpatient,
isFromLiveCare: isFromLiveCare,
height: (patient.patientStatusType != null &&
patient.patientStatusType == 43)
? 210
: isDischargedPatient
? 240
: 0,
isDischargedPatient: isDischargedPatient),
Container(
height: !isSearchAndOut
? isDischargedPatient
@ -311,6 +322,9 @@ class _PatientProfileScreenState extends State<PatientProfileScreen>
onFailure: (String error) {
DrAppToastMsg.showErrorToast(error);
},
onVideoDuration: (duration){
videoCallDurationStreamController.sink.add(duration);
},
onCallEnd: () {
var asd="";
// WidgetsBinding.instance.addPostFrameCallback((_) {

@ -4,15 +4,30 @@ import 'dart:io' show Platform;
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/models/livecare/session_status_model.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class VideoChannel{
/// channel name
static const _channel = const MethodChannel("Dr.cloudSolution/videoCall");
static openVideoCallScreen(
{kApiKey, kSessionId, kToken, callDuration, warningDuration,int vcId,String tokenID,String generalId,int doctorId, Function() onCallEnd , Function(SessionStatusModel sessionStatusModel) onCallNotRespond ,Function(String error) onFailure}) async {
static openVideoCallScreen({kApiKey, kSessionId, kToken, callDuration, warningDuration,int vcId,String tokenID,
String generalId,int doctorId, Function() onCallEnd ,
Function(SessionStatusModel sessionStatusModel) onCallNotRespond ,Function(String error) onFailure, VoidCallback onHide, Function(String) onVideoDuration}) async {
onHide = onHide ?? (){};
onVideoDuration = onVideoDuration ?? (v){};
var result;
try {
_channel.setMethodCallHandler((call) {
if(call.method == 'onHide'){
onHide();
}else if(call.method == 'onVideoDuration'){
onVideoDuration(call.arguments);
}
return true as dynamic;
});
result = await _channel.invokeMethod(
'openVideoCall',
{
@ -29,6 +44,7 @@ class VideoChannel{
);
if(result['callResponse'] == 'CallEnd') {
onCallEnd();
onVideoDuration(null);
}
else {
SessionStatusModel sessionStatusModel = SessionStatusModel.fromJson(Platform.isIOS ?result['sessionStatus'] :json.decode(result['sessionStatus']));
@ -41,5 +57,9 @@ class VideoChannel{
}
static show(){
_channel.invokeMethod("showVideo");
}
}

@ -21,8 +21,11 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
final bool isDischargedPatient;
final bool isFromLiveCare;
final Stream<String> videoCallDurationStream;
final VoidCallback onVideoDurationTap;
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, this.onVideoDurationTap});
@override
Widget build(BuildContext context) {
@ -88,6 +91,25 @@ class PatientProfileHeaderNewDesignAppBar extends StatelessWidget
),
),
),
StreamBuilder(
stream: videoCallDurationStream,
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if(snapshot.hasData)
return InkWell(
onTap: (){
if(onVideoDurationTap != null)
onVideoDurationTap();
},
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: [

Loading…
Cancel
Save