zoom sdk integrated

flutter_3.16.0_zoom
Sultan khan 1 year ago
parent baff15d04d
commit 11ec24c77e

@ -26,7 +26,7 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 33
compileSdkVersion 34
signingConfigs {
release {
@ -48,8 +48,8 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.hmg.hmgDr"
minSdkVersion 21
targetSdkVersion 33
minSdkVersion 24
targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@ -100,6 +100,12 @@ dependencies {
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
//ZOOM
implementation "us.zoom.videosdk:zoomvideosdk-core:1.10.1"
implementation "us.zoom.videosdk:zoomvideosdk-annotation:1.10.1"
implementation "us.zoom.videosdk:zoomvideosdk-videoeffects:1.10.1"
//openTok
implementation 'com.opentok.android:opentok-android-sdk:2.20.1'
//permissions

@ -6,7 +6,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.3'
classpath 'com.android.tools.build:gradle:7.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.3'
}

@ -4,14 +4,14 @@ const MAX_SMALL_SCREEN = 660;
const ONLY_NUMBERS = "[0-9]";
const ONLY_LETTERS = "[a-zA-Z &'\"]";
const ONLY_DATE = "[0-9/]";
const BASE_URL_LIVE_CARE = 'https://livecare.hmg.com/';
// const BASE_URL_LIVE_CARE = 'https://livecare.hmg.com/';
const DOCTOR_ROTATION = 'https://doctorrota.hmg.com/';
// const BASE_URL_LIVE_CARE = 'https://livecareuat.hmg.com/';
// const BASE_URL = 'https://hmgwebservices.com/';
const BASE_URL_LIVE_CARE = 'https://livecareuat.hmg.com/';
const BASE_URL = 'https://hmgwebservices.com/';
// const BASE_URL = 'http://10.20.200.111:1010/';
// const BASE_URL = 'https://uat.hmgwebservices.com/';
const BASE_URL = 'https://webservices.hmg.com/';
// const BASE_URL = 'https://webservices.hmg.com/';
// const BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; //Vida Plus URL

@ -53,16 +53,16 @@ class LiveCarePatientServices extends BaseService {
});
/// remove items.
List<PatiantInformtion> removedPatientList = [];
_patientList.forEach((element) {
if (localPatientList.any((it) => it.patientId == element.patientId)) {
removedPatientList.add(element);
}
});
removedPatientList.forEach((element) {
_patientList.remove(element);
});
// List<PatiantInformtion> removedPatientList = [];
// _patientList.forEach((element) {
// if (localPatientList.any((it) => it.patientId == element.patientId)) {
// removedPatientList.add(element);
// }
// });
// removedPatientList.forEach((element) {
// _patientList.remove(element);
// });
},
onFailure: (String error, int statusCode) {
hasError = true;

@ -30,6 +30,7 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
AppGlobal.CONTEX = context;
return LayoutBuilder(
builder: (context, constraints) {
return OrientationBuilder(builder: (context, orientation) {

@ -30,6 +30,7 @@ import 'package:doctor_app_flutter/screens/patients/profile/vte_assessment/vte_a
import 'package:doctor_app_flutter/screens/prescription/new_prescriptions_page.dart';
import 'package:doctor_app_flutter/screens/prescription/old_prescriptions_page.dart';
import 'package:doctor_app_flutter/screens/procedures/procedure_screen.dart';
import 'package:doctor_app_flutter/screens/video_call_zoom/zoom_video_call.dart';
import './screens/auth/login_screen.dart';
import './screens/patients/profile/vital_sign/vital_sign_details_screen.dart';
import 'landing_page.dart';
@ -87,6 +88,8 @@ const String DISCHARGE_SUMMARY = 'discharge_summary';
const String PHARMACY_INTERVENTION = 'new_medication';
const String INTERVENTION_MEDICATION = 'intervention_medication';
const String ZOOM_CALL_PAGE ='zoom-call';
//todo: change the routing way.
var routes = {
ROOT: (_) => RootPage(),
@ -139,4 +142,6 @@ var routes = {
DIABETIC_CHART_VALUES: (_) => DiabeticChart(),
PHARMACY_INTERVENTION: (_) => PharmacyInterventionScreen(),
VTE_ASSESSMENT: (_) => VteAssessmentScreen(),
ZOOM_CALL_PAGE: (_) => CallScreen(),
};

@ -30,9 +30,12 @@ import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils
import 'package:doctor_app_flutter/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter_zoom_videosdk/native/zoom_videosdk.dart';
import 'package:provider/provider.dart';
import 'package:sticky_headers/sticky_headers/widget.dart';
import '../../utils/notification_permission_utils.dart';
import '../video_call_zoom/zoom_video_call.dart';
import 'label.dart';
class HomeScreen extends StatefulWidget {
@ -76,6 +79,8 @@ class _HomeScreenState extends State<HomeScreen> {
print("onModelReady radiologyCriticalFindingModel EMPTYYYY!!!");
}
});
startZoom();
},
builder: (_, model, w) => AppScaffold(
baseViewModel: model,
@ -98,7 +103,26 @@ class _HomeScreenState extends State<HomeScreen> {
onPressed: () => Scaffold.of(context).openDrawer(),
),
),
Column(children: <Widget>[
InkWell(onTap: (){
AppPermissionsUtils.requestVideoCallPermission(
context: context,
onTapGrant: () {
Navigator.pushNamed(
context,
"zoom-call",
arguments: CallArguments("ZoomTestHMG", "123", "Doctor", "40", "0", true),
);
});
},
child: Text("Zoom Call"),
),
ProfileWelcomeWidget(
Row(
mainAxisAlignment: MainAxisAlignment.start,
@ -483,4 +507,13 @@ class _HomeScreenState extends State<HomeScreen> {
colorIndex = 0;
}
}
void startZoom(){
var zoom = ZoomVideoSdk();
InitConfig initConfig = InitConfig(
domain: "zoom.us",
enableLog: true,
);
zoom.initSdk(initConfig);
}
}

@ -0,0 +1,4 @@
const Map configs = {
'ZOOM_SDK_KEY': 'b9T74nhfTg-ioP9urm970A',
'ZOOM_SDK_SECRET': 'KOzmjBNXQ1f4IPHpnngfL29uZvJMufSy2Fk8',
};

@ -0,0 +1,40 @@
import 'dart:math';
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'config.dart';
String makeId(int length) {
String result = "";
String characters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
int charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters[Random().nextInt(charactersLength)];
}
return result;
}
String generateJwt(String sessionName, String roleType) {
try {
var iat = DateTime.now();
var exp = DateTime.now().add(Duration(days: 2));
final jwt = JWT(
{
'app_key': configs["ZOOM_SDK_KEY"],
'version': 1,
'user_identity': makeId(10),
'iat': (iat.millisecondsSinceEpoch / 1000).round(),
'exp': (exp.millisecondsSinceEpoch / 1000).round(),
'tpc': sessionName,
'role_type': int.parse(roleType),
'cloud_recording_option': 1,
},
);
var token = jwt.sign(SecretKey(configs["ZOOM_SDK_SECRET"]));
return token;
} catch (e) {
print(e);
return '';
}
}

@ -0,0 +1,258 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_zoom_videosdk/flutter_zoom_view.dart' as FlutterZoomView;
import 'package:flutter_zoom_videosdk/native/zoom_videosdk.dart';
const SHOW_TALKING_ICON_DURATION = 2000;
class VideoView extends FlutterZoomView.ZoomView {
const VideoView({
super.key,
required super.user,
required super.sharing,
required super.preview,
required super.focused,
required super.hasMultiCamera,
required super.multiCameraIndex,
required super.videoAspect,
required super.fullScreen,
required super.resolution,
required super.isPiPView,
});
@override
Widget build(BuildContext context) {
var isVideoOn = useState(false);
var isTalking = useState(false);
var isMuted = useState(false);
var isMounted = useIsMounted();
var zoom = ZoomVideoSdk();
var isSharing = useState(false);
user?.audioStatus?.isMuted().then((muted) => isMuted.value = muted);
useEffect(() {
updateVideoStatus() {
if (user == null) return;
Future<void>.microtask(() async {
if (isMounted()) {
isVideoOn.value = (await user!.videoStatus!.isOn());
isSharing.value = sharing;
}
});
}
resetAudioStatus() {
isTalking.value = false;
isMuted.value = false;
}
updateAudioStatus() async {
if (!isMounted()) return;
var talking = await user?.audioStatus?.isTalking();
var muted = await user?.audioStatus?.isMuted();
isMuted.value = muted!;
isTalking.value = talking!;
if (talking) {
Timer(
const Duration(milliseconds: SHOW_TALKING_ICON_DURATION),
() => {
if (isMounted())
{
isTalking.value = false,
}
});
}
}
updateVideoStatus();
return null;
}, [zoom, user]);
ImageIcon audioStatusIcon;
if (isTalking.value) {
audioStatusIcon = const ImageIcon(
AssetImage("assets/imgaes/zoom/talking@2x.png"),
);
} else if (isMuted.value) {
audioStatusIcon = const ImageIcon(
AssetImage("assets/imgaes/zoom/muted@2x.png"),
);
}
// Pass parameters to the platform side.
final Map<String, dynamic> creationParams = <String, dynamic>{};
creationParams.putIfAbsent("userId", () => user?.userId);
creationParams.putIfAbsent("sharing", () => sharing);
creationParams.putIfAbsent("preview", () => preview);
creationParams.putIfAbsent("focused", () => focused);
creationParams.putIfAbsent("hasMultiCamera", () => hasMultiCamera);
if (videoAspect.isEmpty) {
creationParams.putIfAbsent("videoAspect", () => VideoAspect.PanAndScan);
} else {
creationParams.putIfAbsent("videoAspect", () => videoAspect);
}
creationParams.putIfAbsent("fullScreen", () => fullScreen);
if (resolution.isNotEmpty) {
creationParams.putIfAbsent("videoAspect", () => videoAspect);
}
if (fullScreen) {
if (sharing) {
return Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
alignment: Alignment.center,
child: FlutterZoomView.View(creationParams: creationParams),
);
} else if (isVideoOn.value) {
return Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
alignment: Alignment.center,
child: FlutterZoomView.View(creationParams: creationParams),
);
} else {
return Container(
margin: const EdgeInsets.symmetric(vertical: 0),
child: Container(
alignment: Alignment.center,
child: const Image(
image: AssetImage("assets/imgaes/zoom/default-avatar.png"),
)),
);
}
} else {
if (isVideoOn.value || sharing) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 8),
height: 110,
width: 110,
child: Stack(
children: [
Container(
height: 110,
width: 110,
decoration: BoxDecoration(
color: const Color(0xff232323),
border: Border.all(
color: const Color(0xff666666),
width: 1,
),
borderRadius: const BorderRadius.all(Radius.circular(8)),
),
alignment: Alignment.center,
child: FlutterZoomView.View(creationParams: creationParams),
),
Container(
height: 110,
width: 110,
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(8)),
),
),
Container(
alignment: Alignment.bottomCenter,
child: Container(
height: 20,
width: 110,
decoration: const BoxDecoration(
color: Colors.black26,
borderRadius: BorderRadius.all(Radius.circular(8)),
),
),
),
Container(
alignment: Alignment.bottomLeft,
margin: const EdgeInsets.only(left: 5),
child: Text(
user!.userName,
textAlign: TextAlign.left,
style: const TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
Container(
alignment: Alignment.bottomRight,
margin: const EdgeInsets.only(right: 5, bottom: 5),
// height: 110,
// width: 110,
child: Image(
height: 12,
width: 12,
image: isMuted.value ? const AssetImage("assets/imgaes/zoom/muted@2x.png") : const AssetImage("assets/imgaes/zoom/talking@2x.png"),
fit: BoxFit.cover,
),
)
],
),
);
} else {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 8),
height: 110,
width: 110,
child: Stack(
children: [
Container(
height: 110,
width: 110,
decoration: BoxDecoration(
color: const Color(0xff232323),
border: Border.all(
color: const Color(0xff666666),
width: 1,
),
borderRadius: const BorderRadius.all(Radius.circular(8)),
),
alignment: Alignment.center,
child: Container(
alignment: Alignment.center,
child: const Image(
height: 60,
width: 60,
image: AssetImage("assets/imgaes/zoom/default-avatar.png"),
)),
),
Align(
alignment: Alignment.bottomCenter,
child: Container(
height: 20,
width: 110,
decoration: const BoxDecoration(
color: Colors.black26,
borderRadius: BorderRadius.all(Radius.circular(8)),
),
),
),
Container(
alignment: Alignment.bottomLeft,
margin: const EdgeInsets.only(left: 5),
child: Text(
user!.userName,
textAlign: TextAlign.left,
style: const TextStyle(
color: Colors.white,
fontSize: 12,
),
),
),
Container(
alignment: Alignment.bottomRight,
margin: const EdgeInsets.only(right: 5, bottom: 5),
child: Image(
height: 12,
width: 12,
image: isMuted.value ? const AssetImage("assets/imgaes/zoom/muted@2x.png") : const AssetImage("assets/imgaes/zoom/talking@2x.png"),
fit: BoxFit.cover,
),
),
],
),
);
}
}
}
}

File diff suppressed because it is too large Load Diff

@ -130,6 +130,10 @@ dependencies:
flutter_math_fork: ^0.7.2
#zoom video plugin
flutter_zoom_videosdk: ^1.10.11
dart_jsonwebtoken: ^2.14.0
dependency_overrides:
@ -167,6 +171,8 @@ flutter:
- assets/images/svgs/bottom_nav/
- assets/images/patient/
- assets/images/patient/vital_signs/
- assets/images/zoom/
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.

Loading…
Cancel
Save