workouttest_app/lib/view/settings.dart

289 lines
9.8 KiB
Dart

import 'dart:io';
import 'package:aitrainer_app/bloc/menu/menu_bloc.dart';
import 'package:aitrainer_app/bloc/settings/settings_bloc.dart';
import 'package:aitrainer_app/bloc/tutorial/tutorial_bloc.dart';
import 'package:aitrainer_app/library/custom_icon_icons.dart';
import 'package:aitrainer_app/util/app_language.dart';
import 'package:aitrainer_app/model/cache.dart';
import 'package:aitrainer_app/util/common.dart';
import 'package:aitrainer_app/util/enums.dart';
import 'package:aitrainer_app/util/track.dart';
import 'package:aitrainer_app/util/trans.dart';
import 'package:aitrainer_app/widgets/app_bar_min.dart';
import 'package:aitrainer_app/widgets/bottom_nav.dart';
import 'package:aitrainer_app/widgets/dialog_web_browser.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:modal_progress_hud_nsn/modal_progress_hud_nsn.dart';
import 'package:toggle_switch/toggle_switch.dart';
import 'package:flutter/services.dart';
import 'dart:async';
// ignore: must_be_immutable
class SettingsPage extends StatelessWidget with Trans {
@override
Widget build(BuildContext context) {
// ignore: close_sinks
SettingsBloc settingsBloc = BlocProvider.of<SettingsBloc>(context);
settingsBloc.setLocale(AppLanguage().appLocal);
settingsBloc.context = context;
setContext(context);
MenuBloc menuBloc = BlocProvider.of<MenuBloc>(context);
return Scaffold(
appBar: AppBarMin(),
body: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('asset/image/WT_light_background.jpg'),
fit: BoxFit.cover,
alignment: Alignment.center,
),
),
child: Form(
child: BlocConsumer<SettingsBloc, SettingsState>(listener: (context, state) {
if (state is SettingsError) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(backgroundColor: Colors.orange, content: Text(state.message, style: TextStyle(color: Colors.white))));
} else if (state is SettingsReady) {
menuBloc.add(MenuRecreateTree());
Navigator.of(context).pushNamed("home");
}
}, builder: (context, state) {
return ModalProgressHUD(
child: settingsUI(context, settingsBloc, menuBloc),
inAsyncCall: state is SettingsLoading,
opacity: 0.5,
color: Colors.black54,
progressIndicator: CircularProgressIndicator(),
);
}),
),
),
bottomNavigationBar: BottomNavigator(bottomNavIndex: 4));
}
ListView settingsUI(BuildContext context, SettingsBloc settingsBloc, MenuBloc menuBloc) {
return ListView(padding: EdgeInsets.only(top: 150), children: <Widget>[
ListTile(
leading: Icon(Icons.language),
subtitle: Text(t("Change App Language")),
title: DropdownButton(
value: settingsBloc.getLocale() == Locale('en') ? t("English") : t("Hungarian"),
items: [t("English"), t("Hungarian")].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (lang) => {
settingsBloc.add(SettingsChangeLanguage(language: lang as String)),
Track().track(TrackingEvent.settings_lang, eventValue: lang)
})),
getServer(settingsBloc),
//getTuturialBasic(settingsBloc),
getTermsOfUse(),
getPrivacy(),
getFaq(),
getVersion(),
//getDevice(settingsBloc),
]);
}
ListTile getServer(SettingsBloc settingsBloc) {
if (Cache().userLoggedIn == null || Cache().userLoggedIn!.admin != 1) {
return ListTile(
title: Container(),
);
}
return ListTile(
leading: Icon(Icons.data_usage_sharp),
subtitle: Text("For Test purpuses select Test-Server. After that please restart the the App"),
title: ToggleSwitch(
minWidth: 120.0,
minHeight: 30.0,
fontSize: 14.0,
initialLabelIndex: Cache().liveServer
? Cache().testEnvironment == "1"
? 1
: 0
: 1,
activeBgColor: Colors.indigo,
activeFgColor: Colors.white,
inactiveBgColor: Colors.white60,
inactiveFgColor: Colors.grey[900],
labels: [t('Live-Server'), t('Test-Server')],
onToggle: (index) {
settingsBloc.add(SettingsSetServer(live: index == 0));
},
),
);
}
ListTile getDevice(SettingsBloc settingsBloc) {
return ListTile(
leading: Common.badgedIcon(Colors.grey, CustomIcon.cog, "hardware"),
subtitle: Text("Do you have Smart watch, or any device which collects the fit/health data?"),
title: ToggleSwitch(
minWidth: 120.0,
minHeight: 30.0,
fontSize: 14.0,
initialLabelIndex: Cache().hasHardware! ? 0 : 1,
activeBgColor: Colors.indigo,
activeFgColor: Colors.white,
inactiveBgColor: Colors.white60,
inactiveFgColor: Colors.grey[900],
labels: [t('Yes'), t('No')],
onToggle: (index) {
settingsBloc.add(SettingsSetHardware(hasHardware: index == 0));
},
),
);
}
ListTile getTuturialBasic(SettingsBloc settingsBloc) {
final TutorialBloc tutorialBloc = BlocProvider.of<TutorialBloc>(context);
return ListTile(
leading: Icon(Icons.not_started),
subtitle: Text(t("Activating the basic tutorial")),
title: ToggleSwitch(
minWidth: 120.0,
minHeight: 30.0,
fontSize: 14.0,
initialLabelIndex: 0,
activeBgColor: Colors.indigo,
activeFgColor: Colors.white,
inactiveBgColor: Colors.white60,
inactiveFgColor: Colors.grey[900],
labels: [t('Basic Tutorial'), t('Activate')],
onToggle: (index) {
ActivityDone activity = ActivityDone.tutorialExecuteFirstTest;
if (Cache().userLoggedIn != null) {
if (Cache().userLoggedIn!.sex == "m") {
activity = ActivityDone.tutorialBasicChestPress;
} else {
activity = ActivityDone.tutorialBasicLegPress;
}
}
settingsBloc.add(SettingsActivateTutorial(activity: activity));
tutorialBloc.add(TutorialStart());
Track().track(TrackingEvent.tutorial_activate);
},
),
);
}
ListTile getTermsOfUse() {
return ListTile(
leading: Icon(CustomIcon.user_cog),
title: TextButton(
child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Text("Terms Of Use", style: TextStyle(color: Colors.black)),
Icon(
Icons.arrow_forward_ios,
color: Colors.indigo,
),
]),
style: TextButton.styleFrom(
backgroundColor: Colors.white70,
onSurface: Colors.grey,
),
onPressed: () => {
Track().track(TrackingEvent.terms_of_use),
showDialog(
context: context,
builder: (BuildContext context) {
return DialogWebBrowser(url: 'https://workouttest.com/terms-of-use/', javascriptEnabled: true);
})
},
),
);
}
ListTile getPrivacy() {
return ListTile(
leading: Icon(Icons.enhanced_encryption),
title: TextButton(
child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Text("Data Privacy", style: TextStyle(color: Colors.black)),
Icon(
Icons.arrow_forward_ios,
color: Colors.indigo,
),
]),
style: TextButton.styleFrom(
backgroundColor: Colors.white70,
onSurface: Colors.grey,
),
onPressed: () => {
Track().track(TrackingEvent.data_privacy),
showDialog(
context: context,
builder: (BuildContext context) {
return DialogWebBrowser(url: 'https://workouttest.com/privacy/', javascriptEnabled: true);
})
},
),
);
}
ListTile getFaq() {
return ListTile(
leading: Icon(CustomIcon.question),
title: TextButton(
child: Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Text("Frequently Asked Questions", style: TextStyle(color: Colors.indigo)),
Icon(
Icons.arrow_forward_ios,
color: Colors.indigo,
),
]),
style: TextButton.styleFrom(
backgroundColor: Colors.white70,
onSurface: Colors.grey,
),
onPressed: () => {
Navigator.of(context).pushNamed("faqPage"),
Track().track(TrackingEvent.faq),
},
),
);
}
ListTile getVersion() {
final String version = Cache().packageInfo != null ? Cache().packageInfo!.version + "+" + Cache().packageInfo!.buildNumber : "";
return ListTile(
title: Text(
"Version: $version",
style: GoogleFonts.inter(fontSize: 12),
),
);
}
Future<void> _printAndCopy(String cmd) async {
print(cmd);
await Clipboard.setData(ClipboardData(text: cmd));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Copied to Clipboard')),
);
}
void link1() {
String? cmd;
String cmdSuffix;
if (Platform.isIOS) {
cmd = '/usr/bin/xcrun simctl openurl booted';
} else if (Platform.isAndroid) {
cmd = '\$ANDROID_HOME/platform-tools/adb shell \'am start'
' -a android.intent.action.VIEW'
' -c android.intent.category.BROWSABLE -d';
cmdSuffix = "'";
}
}
}