voice command updated

merge-update-with-lab-changes
Sultan Khan 5 years ago
parent f083912d43
commit c050c3f189

@ -7,9 +7,9 @@ if (localPropertiesFile.exists()) {
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
//if (flutterRoot == null) {
// throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
//}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
@ -74,7 +74,7 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "com.google.firebase:firebase-messaging:20.3.0"
implementation 'pub.devrel:easypermissions:0.4.0'
implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'
// implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'
implementation 'com.google.guava:guava:27.0.1-android'
// Dependency on local binaries
implementation fileTree(dir: 'libs', include: ['*.jar'])

@ -1170,5 +1170,10 @@ const Map localizedValues = {
"ar":
"هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي."
},
"help": {"en": "Help", "ar": "مساعدة"}
"help": {"en": "Help", "ar": "مساعدة"},
"habibRobotText":{
"en":"Hi, This is HABIB, your personal assistant. I'm here to assist you by voice commands. How can I help?",
"ar":"مرحباً ، معك حبيب مساعدك الشخصي. أنا هنا لمساعدتك بالأوامر الصوتية."
}
};

@ -63,6 +63,7 @@ class _HomePageState extends State<HomePage> {
onModelReady: (model) => model.getPatientRadOrders(),
builder: (_, model, wi) => AppScaffold(
isShowDecPage: false,
isHelp:true,
body: Container(
width: double.infinity,
child: SingleChildScrollView(

@ -1127,6 +1127,9 @@ class TranslationBase {
String get infoTodo => localizedValues['info-todo'][locale.languageCode];
String get familyInfo => localizedValues['family-info'][locale.languageCode];
String get help => localizedValues['help'][locale.languageCode];
String get habibRobotText => localizedValues['habibRobotText'][locale.languageCode];
}
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -35,7 +35,8 @@ class _BottomNavBarState extends State<BottomNavBar> {
color: Colors.white,
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 18),
child: Row(
child: Directionality(
textDirection:TextDirection.ltr, child:Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
@ -97,7 +98,7 @@ class _BottomNavBarState extends State<BottomNavBar> {
name: TranslationBase.of(context).help,
)
],
),
)),
),
);
}

@ -41,19 +41,15 @@ class _AppDrawerState extends State<AppDrawer> {
var familyFileProvider = FamilyFilesProvider();
AuthenticatedUser user;
AuthenticatedUser mainUser;
AuthenticatedUserObject authenticatedUserObject = locator<
AuthenticatedUserObject>();
AuthenticatedUserObject authenticatedUserObject =
locator<AuthenticatedUserObject>();
VitalSignService _vitalSignService = locator<VitalSignService>();
@override
Widget build(BuildContext context) {
projectProvider = Provider.of(context);
return SizedBox(
width: MediaQuery
.of(context)
.size
.width * 0.75,
width: MediaQuery.of(context).size.width * 0.75,
child: Container(
color: Colors.white,
child: Drawer(
@ -72,67 +68,66 @@ class _AppDrawerState extends State<AppDrawer> {
children: <Widget>[
Container(
child:
Image.asset('assets/images/DQ/DQ_logo.png'),
Image.asset('assets/images/DQ/DQ_logo.png'),
margin: EdgeInsets.all(
SizeConfig.imageSizeMultiplier * 4),
),
(user != null && projectProvider.isLogin)
? Padding(
padding: EdgeInsets.all(15),
child: Column(
mainAxisAlignment:
MainAxisAlignment.start,
children: <Widget>[
Row(
padding: EdgeInsets.all(15),
child: Column(
mainAxisAlignment:
MainAxisAlignment.start,
children: <Widget>[
Padding(
padding: EdgeInsets.only(
right: 5),
child: Icon(
Icons.account_circle,
Row(
children: <Widget>[
Padding(
padding: EdgeInsets.only(
right: 5),
child: Icon(
Icons.account_circle,
color: Color(0xFF40ACC9),
)),
AppText(
user.firstName +
' ' +
user.lastName,
color: Color(0xFF40ACC9),
)),
AppText(
user.firstName +
' ' +
user.lastName,
color: Color(0xFF40ACC9),
)
],
),
Row(children: <Widget>[
Padding(
padding: EdgeInsets.only(
left: 30, top: 5),
child: Column(
children: <Widget>[
AppText(
TranslationBase
.of(
context)
.fileno +
": " +
user.patientID
.toString(),
color:
Color(0xFF40ACC9),
fontSize: SizeConfig
.textMultiplier *
1.5,
),
AppText(
user.bloodGroup != null
? 'Blood Group: ' +
user.bloodGroup
: '',
fontSize: SizeConfig
.textMultiplier *
1.5,
),
],
))
])
]))
)
],
),
Row(children: <Widget>[
Padding(
padding: EdgeInsets.only(
left: 30, top: 5),
child: Column(
children: <Widget>[
AppText(
TranslationBase.of(
context)
.fileno +
": " +
user.patientID
.toString(),
color:
Color(0xFF40ACC9),
fontSize: SizeConfig
.textMultiplier *
1.5,
),
AppText(
user.bloodGroup != null
? 'Blood Group: ' +
user.bloodGroup
: '',
fontSize: SizeConfig
.textMultiplier *
1.5,
),
],
))
])
]))
: SizedBox(),
],
),
@ -144,9 +139,7 @@ class _AppDrawerState extends State<AppDrawer> {
children: <Widget>[
InkWell(
child: DrawerItem(
TranslationBase
.of(context)
.arabicChange,
TranslationBase.of(context).arabicChange,
Icons.translate),
onTap: () {
// Navigator.of(context).pushNamed(
@ -161,263 +154,195 @@ class _AppDrawerState extends State<AppDrawer> {
),
(user != null && projectProvider.isLogin)
? Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
user.isFamily == null || user.isFamily == false
? InkWell(
child: DrawerItem(
TranslationBase
.of(context)
.family,
Icons.group,
textColor: Color(0xFF40ACC9),
iconColor: Color(0xFF40ACC9),
bottomLine: false,
sideArrow: true,
),
onTap: () {
Navigator.of(context).pushNamed(
MY_FAMILIY,
);
},
)
: SizedBox(),
FutureBuilder(
future: getFamilyFiles(), // async work
builder: (BuildContext context,
AsyncSnapshot<
GetAllSharedRecordsByStatusResponse>
snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Padding(
padding: EdgeInsets.all(10),
child: Text('Loading....'));
default:
if (snapshot.hasError)
return Padding(
padding: EdgeInsets.all(10),
child: Text(snapshot.error));
else
return Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
// <--- left side
color: Colors.grey[200],
width: 1.0,
),
)),
child: Column(
children: [
user.isFamily == true
? Container(
padding:
EdgeInsets.only(
bottom: 5),
child: InkWell(
onTap: () {
switchUser(
mainUser,
context);
},
child: Row(
crossAxisAlignment:
CrossAxisAlignment
.start,
children: <
Widget>[
Expanded(
child: Icon(
Icons
.person),
),
Expanded(
flex: 7,
child: Column(
crossAxisAlignment:
CrossAxisAlignment
.start,
children: <
Widget>[
AppText(
mainUser
.firstName +
' ' +
mainUser
.lastName),
AppText(
TranslationBase
.of(
context)
.fileno +
": " +
mainUser
.patientID
.toString()),
])),
],
)))
: SizedBox(),
Column(
mainAxisAlignment:
MainAxisAlignment
.start,
mainAxisSize:
MainAxisSize.min,
children: snapshot.data
.getAllSharedRecordsByStatusList
.map<Widget>(
(result) {
return result
.status ==
3
? Container(
padding: EdgeInsets
.only(
bottom:
5),
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
user.isFamily == null ||
user.isFamily == false
? InkWell(
child: DrawerItem(
TranslationBase.of(context).family,
Icons.group,
textColor: Color(0xFF40ACC9),
iconColor: Color(0xFF40ACC9),
bottomLine: false,
sideArrow: true,
),
onTap: () {
Navigator.of(context).pushNamed(
MY_FAMILIY,
);
},
)
: SizedBox(),
FutureBuilder(
future: getFamilyFiles(), // async work
builder: (BuildContext context,
AsyncSnapshot<
GetAllSharedRecordsByStatusResponse>
snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Padding(
padding: EdgeInsets.all(10),
child: Text('Loading....'));
default:
if (snapshot.hasError)
return Padding(
padding: EdgeInsets.all(10),
child: Text(snapshot.error));
else
return Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
// <--- left side
color: Colors.grey[200],
width: 1.0,
),
)),
child: Column(
children: [
user.isFamily == true
? Container(
padding:
EdgeInsets.only(
bottom: 5),
child: InkWell(
onTap: () {
switchUser(
result,
mainUser,
context);
},
child: Row(
crossAxisAlignment:
CrossAxisAlignment
.start,
CrossAxisAlignment
.start,
children: <
Widget>[
Expanded(
child:
Icon(Icons
.person,
color: result
.responseID ==
user
.patientID
? Color(
0xFF40ACC9)
: Colors
.black),
child: Icon(
Icons
.person),
),
Expanded(
flex: 7,
child: Padding(
padding: EdgeInsets
.only(
left: 5,
right: 5),
child: Column(
crossAxisAlignment: CrossAxisAlignment
.start,
children: <
Widget>[
AppText(
result
.patientName,
color: result
.responseID ==
user
.patientID
? Color(
0xFF40ACC9)
: Colors
.black),
AppText(
TranslationBase
.of(
context)
.fileno +
": " +
result
.iD
.toString(),
color: result
.responseID ==
user
.patientID
? Color(
0xFF40ACC9)
: Colors
.black),
]))),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
AppText(mainUser.firstName + ' ' + mainUser.lastName),
AppText(TranslationBase.of(context).fileno + ": " + mainUser.patientID.toString()),
])),
],
)))
: SizedBox();
}).toList())
],
));
}
},
),
InkWell(
child: DrawerItem(
TranslationBase
.of(context)
.notification,
Icons.notifications),
onTap: () {
//NotificationsPage
Navigator.of(context).pop();
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
NotificationsPage()));
},
),
InkWell(
child: DrawerItem(
TranslationBase
.of(context)
.appsetting,
Icons.settings_input_composite),
onTap: () {
Navigator.of(context).pushNamed(
SETTINGS,
);
},
),
InkWell(
child: DrawerItem(
TranslationBase
.of(context)
.rateApp,
Icons.star),
onTap: () {
if (Platform.isIOS) {
launch(
"https://apps.apple.com/sa/app/dr-suliaman-alhabib/id733503978");
} else {
launch(
"https://play.google.com/store/apps/details?id=com.ejada.hmg&hl=en");
}
},
),
InkWell(
child: DrawerItem(
TranslationBase
.of(context)
.logout,
Icons.lock_open),
onTap: () {
logout();
},
)
],
)
: SizedBox(),
Column(
mainAxisAlignment:
MainAxisAlignment
.start,
mainAxisSize:
MainAxisSize.min,
children: snapshot.data
.getAllSharedRecordsByStatusList
.map<Widget>(
(result) {
return result
.status ==
3
? Container(
padding: EdgeInsets
.only(
bottom:
5),
child: InkWell(
onTap: () {
switchUser(
result,
context);
},
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <
Widget>[
Expanded(
child:
Icon(Icons.person, color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black),
),
Expanded(
flex: 7,
child: Padding(
padding: EdgeInsets.only(left: 5, right: 5),
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
AppText(result.patientName, color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black),
AppText(TranslationBase.of(context).fileno + ": " + result.iD.toString(), color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black),
]))),
],
)))
: SizedBox();
}).toList())
],
));
}
},
),
InkWell(
child: DrawerItem(
TranslationBase.of(context)
.notification,
Icons.notifications),
onTap: () {
//NotificationsPage
Navigator.of(context).pop();
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
NotificationsPage()));
},
),
InkWell(
child: DrawerItem(
TranslationBase.of(context).appsetting,
Icons.settings_input_composite),
onTap: () {
Navigator.of(context).pushNamed(
SETTINGS,
);
},
),
InkWell(
child: DrawerItem(
TranslationBase.of(context).rateApp,
Icons.star),
onTap: () {
if (Platform.isIOS) {
launch(
"https://apps.apple.com/sa/app/dr-suliaman-alhabib/id733503978");
} else {
launch(
"https://play.google.com/store/apps/details?id=com.ejada.hmg&hl=en");
}
},
),
InkWell(
child: DrawerItem(
TranslationBase.of(context).logout,
Icons.lock_open),
onTap: () {
logout();
},
)
],
)
: InkWell(
child: DrawerItem(
TranslationBase
.of(context)
.loginregister,
Icons.lock_open),
onTap: () {
login();
},
),
child: DrawerItem(
TranslationBase.of(context).loginregister,
Icons.lock_open),
onTap: () {
login();
},
),
],
)
],
@ -436,9 +361,7 @@ class _AppDrawerState extends State<AppDrawer> {
children: [
Column(
children: <Widget>[
Text(TranslationBase
.of(context)
.poweredBy),
Text(TranslationBase.of(context).poweredBy),
Image.asset(
'assets/images/cs_logo_container.png',
width: SizeConfig.imageSizeMultiplier * 30,
@ -527,12 +450,11 @@ class _AppDrawerState extends State<AppDrawer> {
this
.familyFileProvider
.silentLoggin(user is AuthenticatedUser ? null : user,
mainUser: user is AuthenticatedUser)
mainUser: user is AuthenticatedUser)
.then((value) {
GifLoaderDialogUtils.hideDialog(context);
loginAfter(value, context);
})
.catchError((err) {
}).catchError((err) {
GifLoaderDialogUtils.hideDialog(context);
print(err);
AppToast.showErrorToast(message: err);

@ -8,8 +8,6 @@ import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart';
import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart';
import 'package:diplomaticquarterapp/widgets/robo-search/search.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

@ -12,18 +12,20 @@ import 'package:diplomaticquarterapp/widgets/data_display/text.dart';
import 'package:diplomaticquarterapp/widgets/others/bottom_bar.dart';
import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart';
import 'package:diplomaticquarterapp/widgets/typewriter/typewiter.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.dart';
import 'package:animated_text_kit/animated_text_kit.dart';
import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart';
import '../../locator.dart';
import 'floating_button_search.dart';
import '../progress_indicator/app_loader_widget.dart';
import 'arrow_back.dart';
import 'network_base_view.dart';
import 'not_auh_page.dart';
import 'package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart';
class AppScaffold extends StatelessWidget {
final String appBarTitle;
@ -47,9 +49,12 @@ class AppScaffold extends StatelessWidget {
final List<Widget> appBarIcons;
final PreferredSizeWidget appBarWidget;
ProjectViewModel projectProvider;
AuthenticatedUserObject authenticatedUserObject =
locator<AuthenticatedUserObject>();
AppScaffold(
{@required this.body,
this.appBarTitle = '',
@ -70,13 +75,14 @@ class AppScaffold extends StatelessWidget {
this.appBarWidget,
this.image,
this.infoList,
this.isHelp});
this.isHelp =false});
@override
Widget build(BuildContext context) {
AppGlobal.context = context;
PreferredSizeWidget appBar;
projectProvider = Provider.of(context);
if (this.appBarWidget == null) {
PreferredSizeWidget appBarWidget = AppBarWidget(
appBarTitle,
@ -108,10 +114,10 @@ class AppScaffold extends StatelessWidget {
)
: baseViewModel != null
? NetworkBaseView(
child: buildBodyWidget(),
child: buildBodyWidget(context),
baseViewModel: baseViewModel,
)
: buildBodyWidget(),
: buildBodyWidget(context),
bottomSheet: bottomSheet,
// floatingActionButton: floatingActionButton ?? floatingActionButton,
// bottomNavigationBar:
@ -124,61 +130,12 @@ class AppScaffold extends StatelessWidget {
return isLoading ? AppLoaderWidget() : Container();
}
buildBodyWidget() {
buildBodyWidget(context) {
// return body; //Stack(children: <Widget>[body, buildAppLoaderWidget(isLoading)]);
return Stack(children: <Widget>[
body,
isHelp ??
Positioned(
child: Column(
children: [
Container(
height: 100,
width: 150,
padding: EdgeInsets.all(5),
margin: EdgeInsets.only(right: 10.0, bottom: 0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: Colors.white,
boxShadow: [
BoxShadow(color: Colors.grey, spreadRadius: 3),
],
),
child: TyperAnimatedTextKit(
onTap: () {},
text: [
"Discipline is the best tool",
"Design first, then code",
"Do not patch bugs out, rewrite them",
"Do not test bugs out, design them out",
],
textStyle:
TextStyle(fontSize: 14.0, color: Colors.black54),
speed: Duration(milliseconds: 100),
textAlign: TextAlign.start,
alignment: AlignmentDirectional
.topStart // or Alignment.topLeft
)),
Positioned(
child: Stack(
children: [
Positioned(
top: 0,
right: 50,
child: Container(
height: 0,
width: 0,
decoration: ShapeDecoration(
color: Colors.grey,
shape: MessageBorder(reverse: true),
))),
FloatingSearchButton()
],
))
],
),
left: SizeConfig.screenWidth - 160,
bottom: 50)
isHelp ? RobotIcon() : Container()
/*FloatingSearchButton()*/
]);
@ -278,3 +235,81 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget {
@override
Size get preferredSize => Size(double.maxFinite, 60);
}
class RobotIcon extends StatefulWidget {
@override
_RobotIcon createState() => _RobotIcon();
}
class _RobotIcon extends State<RobotIcon> {
var event = RobotProvider();
bool isAnimation =true;
@override
void initState() {
event.controller.stream.listen((p) {
if (p['animationEnable'] == 'false') {
setState(() {
if (this.mounted) {
this.isAnimation = false;
}
});
}
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Positioned(
child :
Column(
children: [
isAnimation ? Container(height:150,width:200,padding:EdgeInsets.all(5),margin:EdgeInsets.only(right:35.0,bottom:0
),decoration :BoxDecoration(
borderRadius:BorderRadius.circular(10),
color:Colors.white,
boxShadow:
[BoxShadow(
color: Colors.black,
spreadRadius:
1
),
],
),
child:TyperAnimatedTextKit(text:Provider.of<ProjectViewModel>(context,listen:false).isArabic == true ?
"هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي."
: "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.",
textLength: Provider.of<ProjectViewModel>(context,listen:false).isArabic== true ? "هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.".length: "Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file.".length
)
) : Container(),
Stack(
children:
[ isAnimation ? Positioned(top:0,right:40,child:
Container(height:0,width:0,
decoration:
ShapeDecoration(
color:
Colors.grey,
shape:
MessageBorder(
reverse
:
true
),
)
)
) :Container(),
FloatingSearchButton()
],
)
],
),
right: -30,bottom:50
);
}
}

@ -2,9 +2,13 @@ import 'dart:collection';
import 'dart:io';
import 'dart:math';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart';
import 'package:diplomaticquarterapp/core/service/medical/vital_sign_service.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorProfile.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
@ -13,6 +17,7 @@ import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/parking_page.da
import 'package:diplomaticquarterapp/pages/Blood/blood_donation.dart';
import 'package:diplomaticquarterapp/pages/Blood/my_balance_page.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.dart';
import 'package:diplomaticquarterapp/pages/ContactUs/LiveChat/livechat_page.dart';
import 'package:diplomaticquarterapp/pages/ContactUs/findus/findus_page.dart';
import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart';
import 'package:diplomaticquarterapp/pages/ErService/AmbulanceReq.dart';
@ -55,9 +60,10 @@ import 'package:speech_to_text/speech_to_text.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/DoctorProfile.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart';
import 'package:flutter/cupertino.dart';
import 'package:diplomaticquarterapp/pages/pharmacies/screens/pharmacy_module_page.dart';
import 'package:smart_progress_bar/smart_progress_bar.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/%E2%80%8B%20health_calculators.dart';
class FloatingSearchButton extends StatefulWidget {
@override
@ -93,10 +99,10 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
var sharedPref = new AppSharedPreferences();
bool _hasSpeech = false;
ProjectViewModel projectProvider;
bool isAnimationEnable = true;
AnimationController controller;
Animation<Offset> offset;
String networkImage;
@override
void initState() {
controller =
@ -104,6 +110,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
offset = Tween<Offset>(begin: Offset.zero, end: Offset(0.0, 1.0))
.animate(controller);
controller.reverse();
initialSpeak();
Future.delayed(const Duration(seconds: 2), () {
requestPermissions();
getUserData();
@ -122,14 +129,23 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
super.initState();
}
@override
void didUpdateWidget(FloatingSearchButton oldWidget) {
super.didUpdateWidget(oldWidget);
// event.controller.stream.listen((p) {
// if (p['animationEnable'] != 'false') {
// initialSpeak();
// }
// });
}
AuthenticatedUserObject authenticatedUserObject =
locator<AuthenticatedUserObject>();
VitalSignService _vitalSignService = locator<VitalSignService>();
@override
Widget build(BuildContext context) {
projectProvider = Provider.of(context);
return Container(
child:
SlideTransition(
position: offset,
child: getStack()));
child: SlideTransition(position: offset, child: getStack()));
}
Widget getStack() {
@ -138,10 +154,15 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
width: 150,
margin: EdgeInsets.only(left: 20.0),
child: Stack(children: <Widget>[
GestureDetector(
child: Container(
child: Image.asset('assets/images/gif/robot-idle.gif'),
child:networkImage !=null ? CachedNetworkImage(
imageUrl: networkImage,
placeholder: (context, url) =>Image.asset('assets/images/gif/robot-idle.gif'),
errorWidget: (context, url, error) => Icon(Icons.error),
) : Image.asset(isAnimationEnable == true
? 'assets/images/gif/robot-speaking.gif'
: 'assets/images/gif/robot-idle.gif'),
),
onTap: () {
initSpeechState().then((value) => {startVoiceSearch()});
@ -244,7 +265,6 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
}
void errorListener(SpeechRecognitionError error) {
print(error);
event.setValue({"searchText": 'null'});
//setState(() {
// reconizedWord = "${error.errorMsg} - ${error.permanent}";
@ -283,64 +303,6 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
doctorId: result['DoctorId'],
doctorName: null,
);
// List clnicID = unique(result['ClinicId']);
// if (result['ProjectId'] != 0 &&
// clnicID.length > 0 &&
// result['DoctorId'].length > 0) {
// if (clnicID.length == 1) {
// getDoctorsList(
// result['ProjectId'],
// clnicID[0],
// context,
// doctorId: result['DoctorId'],
// doctorName: null,
// );
// } else {
// goToClinic(clnicID);
// }
// } else if (result['ProjectId'] != 0 &&
// clnicID.length > 0 &&
// result['DoctorId'].length == 0) {
// if (clnicID.length == 1) {
// getDoctorsList(
// result['ProjectId'],
// clnicID[0],
// context,
// );
// } else {
// goToClinic(clnicID);
// }
// } else if (result['ProjectId'] == 0 &&
// clnicID.length > 0 &&
// result['DoctorId'].length == 0) {
// if (clnicID.length == 1) {
// getDoctorsList(
// result['ProjectId'],
// clnicID[0],
// context,
// );
// } else {
// goToClinic(clnicID);
// }
// } else if (result['ProjectId'] == 0 &&
// clnicID.length > 0 &&
// result['DoctorId'].length > 0) {
// if (clnicID.length == 1) {
// getDoctorsList(
// result['ProjectId'],
// clnicID[0],
// context,
// doctorId: result['DoctorId'],
// doctorName: null,
// );
// } else {
// goToClinic(clnicID);
// }
// } else {
// goToClinic(clnicID);
// }
// speak();
}
break;
case '102':
@ -639,6 +601,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
case '44':
{
//chat need be implmented here.
Navigator.push(context, FadePage(page: LiveChatPage()));
}
break;
case '45':
@ -656,14 +619,54 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
Navigator.push(context, FadePage(page: FeedbackHomePage()));
}
break;
case '45':
{
launch('https://hmg.com/ir/ar/Pages/ShareInformation/home.aspx');
break;
}
case '46':
{
launch('https://hmg.com/ir/ar/pages/home.aspx');
break;
}
case '47':
{
//this.cs.sharedService.setSharedData(true, "isComingFromVoiceCommand");
//this.cs.openFeedback();
Navigator.push(context, FadePage(page: FeedbackHomePage()));
break;
}
case '48':
{
Navigator.push(context, FadePage(page: PharmacyPage()));
break;
}
case '50':
{
this.signOut();
break;
}
case '51':
{
// Women health calculator
//this.cs.sharedService.setSharedData(true, "isOpenWomenHealthCalculator");
//this.cs.navigateForward('/calculators/calculator');
Navigator.push(context, FadePage(page: HealthCalculators()));
break;
}
case '52':
{
//this.bridge.openMyInvoices();
break;
}
case '53':
{
launch("tel://920066666");
break;
}
default:
{
// Navigator.pushAndRemoveUntil(
// context,
// MaterialPageRoute(
// builder: (context) => LandingPage()),
// (Route<dynamic> r) => false);
speak();
}
break;
@ -783,17 +786,22 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
}
speak() async {
// var voice = await flutterTts.getVoices;
setState(() {
this.networkImage = results['AnimationURL'];
this.isAnimationEnable = true;
});
if (_currentLocaleId == 'en' && results['ReturnMessage'] != null) {
await flutterTts.setVoice({"name":"en-au-x-aub-network", "locale":"en-AU"});
await flutterTts
.setVoice({"name": "en-au-x-aub-network", "locale": "en-AU"});
await flutterTts.speak(results['ReturnMessage']);
} else if (results['ReturnMessage_Ar'] != null) {
await flutterTts.setVoice({"name":"ar-xa-x-ard-network", "locale":"ar"});
await flutterTts
.setVoice({"name": "ar-xa-x-ard-network", "locale": "ar"});
await flutterTts.speak(results['ReturnMessage_Ar']);
}
// Future.delayed(const Duration(seconds: 10), () {
// initSpeechState().then((value) => startVoiceSearch());
// });
stopAnimation();
}
goToClinic(List ids) {
@ -816,6 +824,50 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
user = AuthenticatedUser.fromJson(
await this.sharedPref.getObject(USER_PROFILE));
}
//await flutterTts.setVoice("en-us-x-sfg#male_1-local");
}
initialSpeak() async {
results = {
'ReturnMessage_Ar':
"هذه الخدمة تم تصميمها لتتمكن من ربط الملفات الطبية للعائلة بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.",
'ReturnMessage':
"Through this service, you will be able to link your family medical files to your medical file so that you can manage their records by login to your medical file."
};
this.speak();
if (Provider.of<ProjectViewModel>(context, listen: false).isArabic ==
false &&
results['ReturnMessage'] != null) {
await flutterTts
.setVoice({"name": "en-au-x-aub-network", "locale": "en-AU"});
await flutterTts.speak(results['ReturnMessage']);
} else if (results['ReturnMessage_Ar'] != null) {
await flutterTts
.setVoice({"name": "ar-xa-x-ard-network", "locale": "ar"});
await flutterTts.speak(results['ReturnMessage_Ar']);
}
this.isAnimationEnable = true;
stopAnimation();
}
stopAnimation(){
flutterTts.setCompletionHandler(() => {
event.setValue({"animationEnable": 'false'}),
setState(() {
this.networkImage = null;
this.isAnimationEnable = false;
})
});
}
signOut() async{
authenticatedUserObject.logout();
projectProvider.isLogin = false;
await authenticatedUserObject.getUser();
_vitalSignService.heightCm = "";
_vitalSignService.weightKg = "";
await sharedPref.clear();
this.user = null;
Navigator.of(context).pushNamed(HOME);
}
}

@ -0,0 +1,72 @@
import 'package:flutter/material.dart';
class TyperAnimatedTextKit extends StatefulWidget {
final String text;
final int textLength;
TyperAnimatedTextKit({this.text, this.textLength});
@override
_TyperState createState() => _TyperState();
}
class _TyperState extends State<TyperAnimatedTextKit>
with TickerProviderStateMixin {
Animation<int> _characterCount;
AnimationController _controller;
int _stringIndex;
@override
void initState() {
_controller = new AnimationController(
duration: const Duration(seconds: 7),
vsync: this,
);
Future.delayed(const Duration(milliseconds: 500), () {
setState(() {
_stringIndex = _stringIndex == null ? 0 : _stringIndex + 1;
_characterCount = new StepTween(begin: 0, end: widget.textLength)
.animate(new CurvedAnimation(parent: _controller, curve: Curves.easeIn));
});
_controller.forward();
});
super.initState();
}
@override
void didUpdateWidget(TyperAnimatedTextKit oldWidget) {
super.didUpdateWidget(oldWidget);
_controller = new AnimationController(
duration: const Duration(seconds: 7),
vsync: this,
);
setState(() {
_stringIndex = _stringIndex == null ? 0 : _stringIndex + 1;
_characterCount = new StepTween(begin: 0, end: widget.textLength)
.animate(new CurvedAnimation(parent: _controller, curve: Curves.easeIn));
});
_controller.forward();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
child: _characterCount == null ? null : new AnimatedBuilder(
animation: _characterCount,
builder: (BuildContext context, Widget child) {
String text = widget.text.substring(0, _characterCount.value);
return Text(text, style: TextStyle(color:Colors.black, fontSize: 12), textAlign: TextAlign.start,
);
},
));
}
}

@ -83,7 +83,7 @@ dependencies:
google_maps_flutter: ^1.0.3
# Qr code Scanner TODO fix it
barcode_scanner: ^1.0.1
# barcode_scanner: ^1.0.1
barcode_scan: any
# Qr code Scanner
barcode_scan_fix: ^1.0.2
@ -146,7 +146,7 @@ dependencies:
screen: ^0.0.5
#google maps places
google_maps_place_picker: ^1.0.0
animated_text_kit: ^2.5.4
typewriter: ^0.0.3
#Dependencies for video call implementation
native_device_orientation: ^0.3.0
enum_to_string: ^1.0.9
@ -154,6 +154,7 @@ dependencies:
wakelock: ^0.1.4
after_layout: ^1.0.7
twilio_programmable_video: ^0.5.0+3
cached_network_image: ^2.4.1
flutter_tts:
path: flutter_tts-voice_enhancement
vibration: ^1.7.2

Loading…
Cancel
Save