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

@ -1170,5 +1170,10 @@ const Map localizedValues = {
"ar": "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(), onModelReady: (model) => model.getPatientRadOrders(),
builder: (_, model, wi) => AppScaffold( builder: (_, model, wi) => AppScaffold(
isShowDecPage: false, isShowDecPage: false,
isHelp:true,
body: Container( body: Container(
width: double.infinity, width: double.infinity,
child: SingleChildScrollView( child: SingleChildScrollView(

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

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

@ -41,19 +41,15 @@ class _AppDrawerState extends State<AppDrawer> {
var familyFileProvider = FamilyFilesProvider(); var familyFileProvider = FamilyFilesProvider();
AuthenticatedUser user; AuthenticatedUser user;
AuthenticatedUser mainUser; AuthenticatedUser mainUser;
AuthenticatedUserObject authenticatedUserObject = locator< AuthenticatedUserObject authenticatedUserObject =
AuthenticatedUserObject>(); locator<AuthenticatedUserObject>();
VitalSignService _vitalSignService = locator<VitalSignService>(); VitalSignService _vitalSignService = locator<VitalSignService>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
projectProvider = Provider.of(context); projectProvider = Provider.of(context);
return SizedBox( return SizedBox(
width: MediaQuery width: MediaQuery.of(context).size.width * 0.75,
.of(context)
.size
.width * 0.75,
child: Container( child: Container(
color: Colors.white, color: Colors.white,
child: Drawer( child: Drawer(
@ -107,8 +103,7 @@ class _AppDrawerState extends State<AppDrawer> {
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
AppText( AppText(
TranslationBase TranslationBase.of(
.of(
context) context)
.fileno + .fileno +
": " + ": " +
@ -144,9 +139,7 @@ class _AppDrawerState extends State<AppDrawer> {
children: <Widget>[ children: <Widget>[
InkWell( InkWell(
child: DrawerItem( child: DrawerItem(
TranslationBase TranslationBase.of(context).arabicChange,
.of(context)
.arabicChange,
Icons.translate), Icons.translate),
onTap: () { onTap: () {
// Navigator.of(context).pushNamed( // Navigator.of(context).pushNamed(
@ -163,12 +156,11 @@ class _AppDrawerState extends State<AppDrawer> {
? Column( ? Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[ children: <Widget>[
user.isFamily == null || user.isFamily == false user.isFamily == null ||
user.isFamily == false
? InkWell( ? InkWell(
child: DrawerItem( child: DrawerItem(
TranslationBase TranslationBase.of(context).family,
.of(context)
.family,
Icons.group, Icons.group,
textColor: Color(0xFF40ACC9), textColor: Color(0xFF40ACC9),
iconColor: Color(0xFF40ACC9), iconColor: Color(0xFF40ACC9),
@ -236,25 +228,10 @@ class _AppDrawerState extends State<AppDrawer> {
flex: 7, flex: 7,
child: Column( child: Column(
crossAxisAlignment: crossAxisAlignment:
CrossAxisAlignment CrossAxisAlignment.start,
.start, children: <Widget>[
children: < AppText(mainUser.firstName + ' ' + mainUser.lastName),
Widget>[ AppText(TranslationBase.of(context).fileno + ": " + mainUser.patientID.toString()),
AppText(
mainUser
.firstName +
' ' +
mainUser
.lastName),
AppText(
TranslationBase
.of(
context)
.fileno +
": " +
mainUser
.patientID
.toString()),
])), ])),
], ],
))) )))
@ -285,63 +262,20 @@ class _AppDrawerState extends State<AppDrawer> {
}, },
child: Row( child: Row(
crossAxisAlignment: crossAxisAlignment:
CrossAxisAlignment CrossAxisAlignment.start,
.start,
children: < children: <
Widget>[ Widget>[
Expanded( Expanded(
child: child:
Icon(Icons Icon(Icons.person, color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black),
.person,
color: result
.responseID ==
user
.patientID
? Color(
0xFF40ACC9)
: Colors
.black),
), ),
Expanded( Expanded(
flex: 7, flex: 7,
child: Padding( child: Padding(
padding: EdgeInsets padding: EdgeInsets.only(left: 5, right: 5),
.only( child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
left: 5, AppText(result.patientName, color: result.responseID == user.patientID ? Color(0xFF40ACC9) : Colors.black),
right: 5), 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(
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),
]))), ]))),
], ],
))) )))
@ -354,8 +288,7 @@ class _AppDrawerState extends State<AppDrawer> {
), ),
InkWell( InkWell(
child: DrawerItem( child: DrawerItem(
TranslationBase TranslationBase.of(context)
.of(context)
.notification, .notification,
Icons.notifications), Icons.notifications),
onTap: () { onTap: () {
@ -370,9 +303,7 @@ class _AppDrawerState extends State<AppDrawer> {
), ),
InkWell( InkWell(
child: DrawerItem( child: DrawerItem(
TranslationBase TranslationBase.of(context).appsetting,
.of(context)
.appsetting,
Icons.settings_input_composite), Icons.settings_input_composite),
onTap: () { onTap: () {
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
@ -382,9 +313,7 @@ class _AppDrawerState extends State<AppDrawer> {
), ),
InkWell( InkWell(
child: DrawerItem( child: DrawerItem(
TranslationBase TranslationBase.of(context).rateApp,
.of(context)
.rateApp,
Icons.star), Icons.star),
onTap: () { onTap: () {
if (Platform.isIOS) { if (Platform.isIOS) {
@ -398,9 +327,7 @@ class _AppDrawerState extends State<AppDrawer> {
), ),
InkWell( InkWell(
child: DrawerItem( child: DrawerItem(
TranslationBase TranslationBase.of(context).logout,
.of(context)
.logout,
Icons.lock_open), Icons.lock_open),
onTap: () { onTap: () {
logout(); logout();
@ -410,9 +337,7 @@ class _AppDrawerState extends State<AppDrawer> {
) )
: InkWell( : InkWell(
child: DrawerItem( child: DrawerItem(
TranslationBase TranslationBase.of(context).loginregister,
.of(context)
.loginregister,
Icons.lock_open), Icons.lock_open),
onTap: () { onTap: () {
login(); login();
@ -436,9 +361,7 @@ class _AppDrawerState extends State<AppDrawer> {
children: [ children: [
Column( Column(
children: <Widget>[ children: <Widget>[
Text(TranslationBase Text(TranslationBase.of(context).poweredBy),
.of(context)
.poweredBy),
Image.asset( Image.asset(
'assets/images/cs_logo_container.png', 'assets/images/cs_logo_container.png',
width: SizeConfig.imageSizeMultiplier * 30, width: SizeConfig.imageSizeMultiplier * 30,
@ -531,8 +454,7 @@ class _AppDrawerState extends State<AppDrawer> {
.then((value) { .then((value) {
GifLoaderDialogUtils.hideDialog(context); GifLoaderDialogUtils.hideDialog(context);
loginAfter(value, context); loginAfter(value, context);
}) }).catchError((err) {
.catchError((err) {
GifLoaderDialogUtils.hideDialog(context); GifLoaderDialogUtils.hideDialog(context);
print(err); print(err);
AppToast.showErrorToast(message: 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/others/bottom_bar.dart';
import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.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/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.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/others/bottom_bar.dart';
import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart'; import 'package:diplomaticquarterapp/widgets/progress_indicator/app_loader_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.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/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:provider/provider.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 '../../locator.dart';
import 'floating_button_search.dart'; import 'floating_button_search.dart';
import '../progress_indicator/app_loader_widget.dart'; import '../progress_indicator/app_loader_widget.dart';
import 'arrow_back.dart'; import 'arrow_back.dart';
import 'network_base_view.dart'; import 'network_base_view.dart';
import 'not_auh_page.dart'; import 'not_auh_page.dart';
import 'package:diplomaticquarterapp/widgets/weather_slider/weather_slider.dart';
class AppScaffold extends StatelessWidget { class AppScaffold extends StatelessWidget {
final String appBarTitle; final String appBarTitle;
@ -47,9 +49,12 @@ class AppScaffold extends StatelessWidget {
final List<Widget> appBarIcons; final List<Widget> appBarIcons;
final PreferredSizeWidget appBarWidget; final PreferredSizeWidget appBarWidget;
ProjectViewModel projectProvider;
AuthenticatedUserObject authenticatedUserObject = AuthenticatedUserObject authenticatedUserObject =
locator<AuthenticatedUserObject>(); locator<AuthenticatedUserObject>();
AppScaffold( AppScaffold(
{@required this.body, {@required this.body,
this.appBarTitle = '', this.appBarTitle = '',
@ -70,13 +75,14 @@ class AppScaffold extends StatelessWidget {
this.appBarWidget, this.appBarWidget,
this.image, this.image,
this.infoList, this.infoList,
this.isHelp}); this.isHelp =false});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
AppGlobal.context = context; AppGlobal.context = context;
PreferredSizeWidget appBar; PreferredSizeWidget appBar;
projectProvider = Provider.of(context);
if (this.appBarWidget == null) { if (this.appBarWidget == null) {
PreferredSizeWidget appBarWidget = AppBarWidget( PreferredSizeWidget appBarWidget = AppBarWidget(
appBarTitle, appBarTitle,
@ -108,10 +114,10 @@ class AppScaffold extends StatelessWidget {
) )
: baseViewModel != null : baseViewModel != null
? NetworkBaseView( ? NetworkBaseView(
child: buildBodyWidget(), child: buildBodyWidget(context),
baseViewModel: baseViewModel, baseViewModel: baseViewModel,
) )
: buildBodyWidget(), : buildBodyWidget(context),
bottomSheet: bottomSheet, bottomSheet: bottomSheet,
// floatingActionButton: floatingActionButton ?? floatingActionButton, // floatingActionButton: floatingActionButton ?? floatingActionButton,
// bottomNavigationBar: // bottomNavigationBar:
@ -124,61 +130,12 @@ class AppScaffold extends StatelessWidget {
return isLoading ? AppLoaderWidget() : Container(); return isLoading ? AppLoaderWidget() : Container();
} }
buildBodyWidget() { buildBodyWidget(context) {
// return body; //Stack(children: <Widget>[body, buildAppLoaderWidget(isLoading)]); // return body; //Stack(children: <Widget>[body, buildAppLoaderWidget(isLoading)]);
return Stack(children: <Widget>[ return Stack(children: <Widget>[
body, body,
isHelp ?? isHelp ? RobotIcon() : Container()
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)
/*FloatingSearchButton()*/ /*FloatingSearchButton()*/
]); ]);
@ -278,3 +235,81 @@ class AppBarWidget extends StatelessWidget with PreferredSizeWidget {
@override @override
Size get preferredSize => Size(double.maxFinite, 60); 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:io';
import 'dart:math'; import 'dart:math';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/shared_pref_kay.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/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/locator.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorListResponse.dart';
import 'package:diplomaticquarterapp/models/Appointments/DoctorProfile.dart'; import 'package:diplomaticquarterapp/models/Appointments/DoctorProfile.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.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/blood_donation.dart';
import 'package:diplomaticquarterapp/pages/Blood/my_balance_page.dart'; import 'package:diplomaticquarterapp/pages/Blood/my_balance_page.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/widgets/BranchView.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/ContactUs/findus/findus_page.dart';
import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart'; import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart';
import 'package:diplomaticquarterapp/pages/ErService/AmbulanceReq.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/DoctorProfile.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart'; import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart';
import 'package:flutter/cupertino.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:smart_progress_bar/smart_progress_bar.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/%E2%80%8B%20health_calculators.dart';
class FloatingSearchButton extends StatefulWidget { class FloatingSearchButton extends StatefulWidget {
@override @override
@ -93,10 +99,10 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
var sharedPref = new AppSharedPreferences(); var sharedPref = new AppSharedPreferences();
bool _hasSpeech = false; bool _hasSpeech = false;
ProjectViewModel projectProvider; ProjectViewModel projectProvider;
bool isAnimationEnable = true;
AnimationController controller; AnimationController controller;
Animation<Offset> offset; Animation<Offset> offset;
String networkImage;
@override @override
void initState() { void initState() {
controller = controller =
@ -104,6 +110,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
offset = Tween<Offset>(begin: Offset.zero, end: Offset(0.0, 1.0)) offset = Tween<Offset>(begin: Offset.zero, end: Offset(0.0, 1.0))
.animate(controller); .animate(controller);
controller.reverse(); controller.reverse();
initialSpeak();
Future.delayed(const Duration(seconds: 2), () { Future.delayed(const Duration(seconds: 2), () {
requestPermissions(); requestPermissions();
getUserData(); getUserData();
@ -122,14 +129,23 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
super.initState(); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
projectProvider = Provider.of(context); projectProvider = Provider.of(context);
return Container( return Container(
child: child: SlideTransition(position: offset, child: getStack()));
SlideTransition(
position: offset,
child: getStack()));
} }
Widget getStack() { Widget getStack() {
@ -138,10 +154,15 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
width: 150, width: 150,
margin: EdgeInsets.only(left: 20.0), margin: EdgeInsets.only(left: 20.0),
child: Stack(children: <Widget>[ child: Stack(children: <Widget>[
GestureDetector( GestureDetector(
child: Container( 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: () { onTap: () {
initSpeechState().then((value) => {startVoiceSearch()}); initSpeechState().then((value) => {startVoiceSearch()});
@ -244,7 +265,6 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
} }
void errorListener(SpeechRecognitionError error) { void errorListener(SpeechRecognitionError error) {
print(error);
event.setValue({"searchText": 'null'}); event.setValue({"searchText": 'null'});
//setState(() { //setState(() {
// reconizedWord = "${error.errorMsg} - ${error.permanent}"; // reconizedWord = "${error.errorMsg} - ${error.permanent}";
@ -283,64 +303,6 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
doctorId: result['DoctorId'], doctorId: result['DoctorId'],
doctorName: null, 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; break;
case '102': case '102':
@ -639,6 +601,7 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
case '44': case '44':
{ {
//chat need be implmented here. //chat need be implmented here.
Navigator.push(context, FadePage(page: LiveChatPage()));
} }
break; break;
case '45': case '45':
@ -656,14 +619,54 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
Navigator.push(context, FadePage(page: FeedbackHomePage())); Navigator.push(context, FadePage(page: FeedbackHomePage()));
} }
break; 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: default:
{ {
// Navigator.pushAndRemoveUntil(
// context,
// MaterialPageRoute(
// builder: (context) => LandingPage()),
// (Route<dynamic> r) => false);
speak(); speak();
} }
break; break;
@ -783,17 +786,22 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
} }
speak() async { speak() async {
// var voice = await flutterTts.getVoices; setState(() {
this.networkImage = results['AnimationURL'];
this.isAnimationEnable = true;
});
if (_currentLocaleId == 'en' && results['ReturnMessage'] != null) { 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']); await flutterTts.speak(results['ReturnMessage']);
} else if (results['ReturnMessage_Ar'] != null) { } 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']); await flutterTts.speak(results['ReturnMessage_Ar']);
} }
// Future.delayed(const Duration(seconds: 10), () {
// initSpeechState().then((value) => startVoiceSearch()); stopAnimation();
// });
} }
goToClinic(List ids) { goToClinic(List ids) {
@ -816,6 +824,50 @@ class _FloatingSearchButton extends State<FloatingSearchButton>
user = AuthenticatedUser.fromJson( user = AuthenticatedUser.fromJson(
await this.sharedPref.getObject(USER_PROFILE)); 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 google_maps_flutter: ^1.0.3
# Qr code Scanner TODO fix it # Qr code Scanner TODO fix it
barcode_scanner: ^1.0.1 # barcode_scanner: ^1.0.1
barcode_scan: any barcode_scan: any
# Qr code Scanner # Qr code Scanner
barcode_scan_fix: ^1.0.2 barcode_scan_fix: ^1.0.2
@ -146,7 +146,7 @@ dependencies:
screen: ^0.0.5 screen: ^0.0.5
#google maps places #google maps places
google_maps_place_picker: ^1.0.0 google_maps_place_picker: ^1.0.0
animated_text_kit: ^2.5.4 typewriter: ^0.0.3
#Dependencies for video call implementation #Dependencies for video call implementation
native_device_orientation: ^0.3.0 native_device_orientation: ^0.3.0
enum_to_string: ^1.0.9 enum_to_string: ^1.0.9
@ -154,6 +154,7 @@ dependencies:
wakelock: ^0.1.4 wakelock: ^0.1.4
after_layout: ^1.0.7 after_layout: ^1.0.7
twilio_programmable_video: ^0.5.0+3 twilio_programmable_video: ^0.5.0+3
cached_network_image: ^2.4.1
flutter_tts: flutter_tts:
path: flutter_tts-voice_enhancement path: flutter_tts-voice_enhancement
vibration: ^1.7.2 vibration: ^1.7.2

Loading…
Cancel
Save