Compare commits

...

6 Commits

Author SHA1 Message Date
Sultan Khan c246248d3b Merge branch 'update_flutter_3.16.0' into update_3.16.0_CR5439_Pharmacy_Intervention
# Conflicts:
#	lib/config/config.dart
7 months ago
Sultan Khan cee04fb71e Merge branch 'flutter_3.16.0_zoom' into update_3.16.0_CR5439_Pharmacy_Intervention
# Conflicts:
#	lib/screens/home/home_screen.dart
7 months ago
sultan khan 4ff7a7e42b Merge branch 'update_flutter_3.16.0' of http://34.17.52.180/Haroon6138/doctor_app_flutter into flutter_3.16.0_zoom
# Conflicts:
#	android/app/build.gradle
#	ios/Runner.xcodeproj/project.pbxproj
#	lib/config/config.dart
#	lib/screens/patients/profile/diagnosis/diagnosis_screen.dart
#	lib/screens/prescription/new_prescriptions_page.dart
#	pubspec.yaml
10 months ago
sultan khan f7e378ba4a live care done. 10 months ago
haroon amjad cc0450a188 Zoom fixes 11 months ago
Sultan khan 11ec24c77e zoom sdk integrated 1 year ago

@ -48,7 +48,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.hmg.hmgDr"
minSdkVersion 21
minSdkVersion 24
targetSdkVersion 34
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
@ -79,6 +79,17 @@ android {
// productionDebugImplementation
// productionReleaseImplementation
// }
packagingOptions {
exclude 'META-INF/proguard/androidx-annotations.pro'
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst '**/*.so'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
@ -100,6 +111,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

@ -4,13 +4,19 @@ 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://uat.hmgwebservices.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://hmgwebservices.com/';
// const BASE_URL = 'https://uat.hmgwebservices.com/';
// const BASE_URL = 'https://webservices.hmg.com/';
// const BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; //Vida Plus URL

@ -40,7 +40,7 @@ class LiveCarePatientServices extends BaseService {
GET_PENDING_PATIENT_ER_FOR_DOCTOR_APP,
onSuccess: (dynamic response, int statusCode) {
List<PatiantInformtion> localPatientList = [];
_patientList =[];
response['List_PendingPatientList'].forEach((v) {
localPatientList.add(PatiantInformtion.fromJson(v));
});
@ -53,12 +53,12 @@ class LiveCarePatientServices extends BaseService {
});
/// remove items.
List<PatiantInformtion> removedPatientList = [];
_patientList.forEach((element) {
if (localPatientList.any((it) => it.patientId == element.patientId)) {
removedPatientList.add(element);
}
});
// List<PatiantInformtion> removedPatientList = [];
// _patientList.forEach((element) {
// if (localPatientList.any((it) => it.patientId == element.patientId)) {
// removedPatientList.add(element);
// }
// });
// removedPatientList.forEach((element) {
// _patientList.remove(element);

@ -269,4 +269,7 @@ class LiveCarePatientViewModel extends BaseViewModel {
setState(ViewState.Idle);
}
}
}

@ -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) {

@ -32,6 +32,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';
@ -90,6 +91,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(),
@ -145,4 +148,6 @@ var routes = {
DIABETIC_CHART_VALUES: (_) => DiabeticChart(),
PHARMACY_INTERVENTION: (_) => PharmacyInterventionScreen(),
VTE_ASSESSMENT: (_) => VteAssessmentScreen(),
ZOOM_CALL_PAGE: (_) => CallScreen(),
};

@ -32,9 +32,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 '../patients/profile/soap_update/shared_soap_widgets/bottom_sheet_title.dart';
import 'label.dart';
@ -93,6 +96,7 @@ class _HomeScreenState extends State<HomeScreen> {
}
}
});
startZoom();
});
},
builder: (_, model, w) => AppScaffold(
@ -120,7 +124,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,
@ -620,4 +643,12 @@ class _HomeScreenState extends State<HomeScreen> {
},
);
}
void startZoom(){
var zoom = ZoomVideoSdk();
InitConfig initConfig = InitConfig(
domain: "zoom.us",
enableLog: true,
);
zoom.initSdk(initConfig);
}
}

@ -34,6 +34,9 @@ class _ProgressNoteState extends State<DiagnosisScreen> {
{bool isLocalBusy = false}) async {
final routeArgs = ModalRoute.of(context)!.settings.arguments as Map;
PatiantInformtion patient = routeArgs['patient'];
// String type = await sharedPref.getString(SLECTED_PATIENT_TYPE);
//
// print(type);
String type = await sharedPref.getString(SLECTED_PATIENT_TYPE) == '0' ? "2" : "1";
print(type);

@ -3,6 +3,7 @@ import 'dart:async';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/enum/view_state.dart';
import 'package:doctor_app_flutter/core/model/PatientRegistration/GetPatientInfoRequestModel.dart';
import 'package:doctor_app_flutter/core/model/SOAP/in_patient/post_episode_for_Inpatient_request_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/post_episode_req_model.dart';
import 'package:doctor_app_flutter/core/model/patient/patiant_info_model.dart';
@ -21,8 +22,11 @@ import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
import 'package:doctor_app_flutter/utils/utils.dart';
import 'package:doctor_app_flutter/widgets/patients/profile/app_bar/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_texts_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/text_fields/app-textfield-custom.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:hexcolor/hexcolor.dart';
@ -31,6 +35,7 @@ import 'package:quiver/async.dart';
import '../../../../locator.dart';
import '../../../../routes.dart';
import '../../../video_call_zoom/zoom_video_call.dart';
class PatientProfileScreen extends StatefulWidget {
@override
@ -59,7 +64,8 @@ class _PatientProfileScreenState extends State<PatientProfileScreen> with Single
late TabController _tabController;
int index = 0;
int _activeTab = 0;
String noteValidation ="";
TextEditingController noteController = TextEditingController();
late StreamController<String> videoCallDurationStreamController;
late Stream<String> videoCallDurationStream;
@ -370,18 +376,33 @@ class _PatientProfileScreenState extends State<PatientProfileScreen> with Single
Utils.showErrorToast(model.error);
} else {
await model.getDoctorProfile();
patient.appointmentNo = int.parse(model.startCallRes!.appointmentNo.toString());
patient.appointmentNo = int.parse(model.startCallRes!.appointmentNo.toString());
patient.episodeNo = 0;
model.updateInCallPatient(patient: patient, appointmentNo: int.parse(model.startCallRes!.appointmentNo.toString()));
model.updateInCallPatient(patient: patient, appointmentNo: int.parse(model.startCallRes!.appointmentNo.toString()));
setState(() {
isCallStarted = true;
});
GifLoaderDialogUtils.hideDialog(context);
AppPermissionsUtils.requestVideoCallPermission(
// AppPermissionsUtils.requestVideoCallPermission(
// context: context,
// onTapGrant: () {
// locator<VideoCallService>()
// .openVideo(model.startCallRes!, patient, model.startCallRes != null ? model.startCallRes!.isRecording! : true, callConnected, callDisconnected);
// });
// model.startCallRes!.openTokenID!
AppPermissionsUtils.requestVideoCallPermission(
context: context,
onTapGrant: () {
locator<VideoCallService>()
.openVideo(model.startCallRes!, patient, model.startCallRes != null ? model.startCallRes!.isRecording! : true, callConnected, callDisconnected);
Navigator.pushNamed(
context,
"zoom-call",
arguments: CallArguments(model.startCallRes!.openSessionID!, "123", "doctor", "40", "0", true,1),
).then((completion) {
Future<void>.delayed(const Duration(seconds: 1))
.then((_) async {
_showEndCallPopup(context, model, patient, patient.vcId!);
});
});
});
}
}
@ -400,7 +421,65 @@ class _PatientProfileScreenState extends State<PatientProfileScreen> with Single
),
);
}
void _showEndCallPopup(BuildContext context,LiveCarePatientViewModel model, PatiantInformtion patient, int vcID) {
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Call Ended'),
content:SizedBox(
height: 150,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AppTextFieldCustom(onChanged: (val){}, onFieldSubmitted: (){}, hintText: "Please enter Notes", height: 100, validationError: noteValidation, controller: noteController, ),
],)),
actions: [
AppButton(
onPressed: () {
_transferToAdmin(model, patient, vcID);
},
title: 'Transfer to Admin',
color: Colors.grey,
fontColor: Colors.white,
fontSize: 14,
),
SizedBox(height: 15,),
AppButton(
onPressed: () {
_endWithCharge(model, patient, vcID);
},
title: 'End with Charge',
color: Colors.red,
fontColor: Colors.white,
fontSize: 14,
)
],
);
},
);
}
_transferToAdmin(LiveCarePatientViewModel model, PatiantInformtion patient, int vcID){
if(noteController.text.isEmpty){
noteValidation ='Please Enter Notes';
setState(() {
});
}else {
model.transferToAdmin(vcID,noteController.text );
Navigator.of(context).pop();
}
}
_endWithCharge(LiveCarePatientViewModel model, PatiantInformtion patient, int vcID){
model.endCallWithCharge(vcID, true);
Navigator.of(context).pop();
}
createEpisode({required PatiantInformtion patient, required SOAPViewModel model}) async {
await locator<AnalyticsService>().logEvent(
eventCategory: "Patient Profile",

@ -1,8 +1,11 @@
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/core/model/SOAP/selected_items/my_selected_allergy.dart';
import 'package:doctor_app_flutter/screens/patients/In_patient/NoData.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update/shared_soap_widgets/remark_text.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update/shared_soap_widgets/remove_button.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update_vida_plus/subjective/allergies/reactions_selection.dart';
import 'package:doctor_app_flutter/utils/extenstions_utils.dart';
import 'package:doctor_app_flutter/utils/utils.dart';
import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
@ -15,7 +18,7 @@ import 'add_allergies.dart';
// ignore: must_be_immutable
class UpdateAllergiesWidget extends StatefulWidget {
List<MySelectedAllergy>? myAllergiesList;
List<MySelectedAllergy>? myAllergiesList =[];
UpdateAllergiesWidget({Key? key, this.myAllergiesList});
@ -29,7 +32,7 @@ class _UpdateAllergiesWidgetState extends State<UpdateAllergiesWidget> {
ProjectViewModel projectViewModel = Provider.of(context);
changeAllState() {
setState(() {
print(widget.myAllergiesList);
});
}
@ -44,7 +47,7 @@ class _UpdateAllergiesWidgetState extends State<UpdateAllergiesWidget> {
SizedBox(
height: 20,
),
Container(
widget.myAllergiesList !=null ? Container(
margin: EdgeInsets.only(left: 15, right: 15, top: 15),
child: Column(
children: widget.myAllergiesList!.map((selectedAllergy) {
@ -110,7 +113,7 @@ class _UpdateAllergiesWidgetState extends State<UpdateAllergiesWidget> {
],
);
}).toList()),
)
) : SizedBox()
],
);
}

@ -206,7 +206,7 @@ class _UpdateSubjectivePageState extends State<UpdateSubjectivePage> implements
},
child: Column(
children: [
UpdateAllergiesWidget(),
UpdateAllergiesWidget(myAllergiesList: myAllergiesList,),
SizedBox(
height: 30,
),

@ -120,9 +120,10 @@ class _MasterKeyCheckboxSearchAllergiesWidgetState
color: Color(0xffD02127),
),
style: ButtonStyle(
iconColor:
WidgetStateProperty.all<
Color>(Color(0xffD02127)),
// iconColor:
// WidgetStateProperty.all<
// Color>()),
),
onPressed: () {
openReaction(

@ -78,9 +78,9 @@ class _ReactionsSelectionAllergiesWidgetState
controller: controllers![index],
key: Key(index.toString()),
dense: false,
enableFeedback: false,
showTrailingIcon: false,
// dense: false,
// enableFeedback: false,
// showTrailingIcon: false,
initiallyExpanded: widget
.mySelectedAllergy!
.allergyReactionDTOs![index]
@ -234,9 +234,9 @@ class _ReactionsSelectionAllergiesWidgetState
return Column(children: [
ExpansionTile(
key: Key(index.toString()),
dense: false,
enableFeedback: false,
showTrailingIcon: false,
// dense: false,
// enableFeedback: false,
// showTrailingIcon: false,
initiallyExpanded: widget
.editSelectedAllergy!
.patientsAllergyReactionsDTOs![index]

@ -29,6 +29,7 @@ class NewPrescriptionsPage extends StatelessWidget {
onModelReady: (model) async {
await model.getPrescriptionListNew(mrn: patient.patientMRN, appNo: patient.appointmentNo == null ? 0 : int.parse(patient.appointmentNo.toString()));
await model.isPrincipalCovered(patient: patient);
},
builder: (_, model, w) => AppScaffold(
baseViewModel: model,

@ -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/images/zoom/muted@2x.png") : const AssetImage("assets/images/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/images/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/images/zoom/muted@2x.png") : const AssetImage("assets/images/zoom/talking@2x.png"),
fit: BoxFit.cover,
),
),
],
),
);
}
}
}
}

File diff suppressed because it is too large Load Diff

@ -41,7 +41,7 @@ class _ShowTimerState extends State<ShowTimer> {
Future.delayed(Duration(seconds: 1), () {
if (this.remainingTime > 0) {
startShowTimer();
startShowTimer();
}
});
}

@ -14,7 +14,7 @@ import maps_launcher
import path_provider_foundation
import shared_preferences_foundation
import speech_to_text_macos
import sqflite
import sqflite_darwin
import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {

Loading…
Cancel
Save