NovySoft/novyNaplo

View on GitHub
lib/ui/screens/settings/ui_settings.dart

Summary

Maintainability
Test Coverage
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/material.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:novynaplo/global.dart' as globals;
import 'package:novynaplo/helpers/ui/themeHelper.dart';
import 'package:novynaplo/i18n/translationProvider.dart';
import 'package:dynamic_theme/dynamic_theme.dart';

String dropDown;

class UIsettings extends StatefulWidget {
  @override
  _UIsettingsState createState() => _UIsettingsState();
}

class _UIsettingsState extends State<UIsettings> {
  Widget status = Icon(
    MdiIcons.closeCircle, /*check*/
  );

  @override
  void initState() {
    if (globals.markCardTheme == "Dark" &&
        globals.timetableCardTheme == "Dark" &&
        globals.homeworkCardTheme == "Dark" &&
        globals.examsCardTheme == "Dark" &&
        globals.noticesAndEventsCardTheme == "Dark" &&
        globals.statisticsCardTheme == "Dark") {
      status = Icon(MdiIcons.check);
    } else {
      status = Icon(
        MdiIcons.closeCircle, /*check*/
      );
    }
    WidgetsBinding.instance.addPostFrameCallback(
      (_) {
        setState(() {
          dropDown = DynamicTheme.of(context).themeMode == ThemeMode.light
              ? "Light"
              : DynamicTheme.of(context).themeMode == ThemeMode.dark &&
                      globals.darker
                  ? "Darker"
                  : "Dark";
        });
      },
    );
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
  }

  void setDarkCards() {
    //Marks
    globals.markCardTheme = "Dark";
    FirebaseCrashlytics.instance.setCustomKey(
      "markCardTheme",
      globals.markCardTheme,
    );
    globals.prefs.setString(
      "markCardTheme",
      globals.markCardTheme,
    );
    //Marks text
    globals.marksTextColEval = true;
    FirebaseCrashlytics.instance.setCustomKey(
      "marksTextColEval",
      globals.marksTextColEval,
    );
    globals.prefs.setBool(
      "marksTextColEval",
      globals.marksTextColEval,
    );
    if (globals.marksTextColSubject) {
      globals.marksTextColSubject = false;
      FirebaseCrashlytics.instance.setCustomKey(
        "marksTextColSubject",
        globals.marksTextColSubject,
      );
      globals.prefs.setBool(
        "marksTextColSubject",
        globals.marksTextColSubject,
      );
    }
    //Timetable
    globals.timetableCardTheme = "Dark";
    FirebaseCrashlytics.instance.setCustomKey(
      "timetableCardTheme",
      globals.timetableCardTheme,
    );
    globals.prefs.setString(
      "timetableCardTheme",
      globals.timetableCardTheme,
    );
    //Timetable text
    globals.timetableTextColSubject = true;
    FirebaseCrashlytics.instance.setCustomKey(
      "timetableTextColSubject",
      globals.timetableTextColSubject,
    );
    globals.prefs.setBool(
      "timetableTextColSubject",
      globals.timetableTextColSubject,
    );
    //Homework
    globals.homeworkCardTheme = "Dark";
    FirebaseCrashlytics.instance.setCustomKey(
      "homeworkCardTheme",
      globals.homeworkCardTheme,
    );
    globals.prefs.setString(
      "homeworkCardTheme",
      globals.homeworkCardTheme,
    );
    //Homework text
    globals.homeworkTextColSubject = true;
    FirebaseCrashlytics.instance.setCustomKey(
      "homeworkTextColSubject",
      globals.homeworkTextColSubject,
    );
    globals.prefs.setBool(
      "homeworkTextColSubject",
      globals.homeworkTextColSubject,
    );
    //Exams
    globals.examsCardTheme = "Dark";
    FirebaseCrashlytics.instance.setCustomKey(
      "examsCardTheme",
      globals.examsCardTheme,
    );
    globals.prefs.setString(
      "examsCardTheme",
      globals.examsCardTheme,
    );
    //Exams text
    globals.examsTextColSubject = true;
    FirebaseCrashlytics.instance.setCustomKey(
      "examsTextColSubject",
      globals.examsTextColSubject,
    );
    globals.prefs.setBool(
      "examsTextColSubject",
      globals.examsTextColSubject,
    );
    //Notices and events
    globals.noticesAndEventsCardTheme = "Dark";
    FirebaseCrashlytics.instance.setCustomKey(
      "noticesAndEventsCardTheme",
      globals.noticesAndEventsCardTheme,
    );
    globals.prefs.setString(
      "noticesAndEventsCardTheme",
      globals.noticesAndEventsCardTheme,
    );
    //Statistics
    globals.statisticsCardTheme = "Dark";
    FirebaseCrashlytics.instance.setCustomKey(
      "statisticsCardTheme",
      globals.statisticsCardTheme,
    );
    globals.prefs.setString(
      "statisticsCardTheme",
      globals.statisticsCardTheme,
    );
    //Statistics text
    globals.statisticsTextColSubject = true;
    FirebaseCrashlytics.instance.setCustomKey(
      "statisticsTextColSubject",
      globals.statisticsTextColSubject,
    );
    globals.prefs.setBool(
      "statisticsTextColSubject",
      globals.statisticsTextColSubject,
    );
    // App bar
    globals.appBarColoredByUser = false;
    globals.prefs.setBool(
      "appBarColoredByUser",
      globals.appBarColoredByUser,
    );
    globals.appBarTextColoredByUser = true;
    globals.prefs.setBool(
      "appBarTextColoredByUser",
      globals.appBarTextColoredByUser,
    );
  }

  void disableDarkCards() {
    //Marks card
    if (globals.markCardTheme == "Dark") {
      globals.markCardTheme = "Értékelés nagysága";
      FirebaseCrashlytics.instance.setCustomKey(
        "markCardTheme",
        globals.markCardTheme,
      );
      globals.prefs.setString(
        "markCardTheme",
        globals.markCardTheme,
      );
    }
    //Marks card text
    if (globals.marksTextColSubject) {
      globals.marksTextColSubject = false;
      FirebaseCrashlytics.instance.setCustomKey(
        "marksTextColSubject",
        globals.marksTextColSubject,
      );
      globals.prefs.setBool(
        "marksTextColSubject",
        globals.marksTextColSubject,
      );
    }
    if (globals.marksTextColEval) {
      globals.marksTextColEval = false;
      FirebaseCrashlytics.instance.setCustomKey(
        "marksTextColEval",
        globals.marksTextColEval,
      );
      globals.prefs.setBool(
        "marksTextColEval",
        globals.marksTextColEval,
      );
    }
    //Timetable card
    if (globals.timetableCardTheme == "Dark") {
      globals.timetableCardTheme = "Subject";
      FirebaseCrashlytics.instance.setCustomKey(
        "timetableCardTheme",
        globals.timetableCardTheme,
      );
      globals.prefs.setString(
        "timetableCardTheme",
        globals.timetableCardTheme,
      );
    }
    //Timetable text
    if (globals.timetableTextColSubject) {
      globals.timetableTextColSubject = false;
      FirebaseCrashlytics.instance.setCustomKey(
        "timetableTextColSubject",
        globals.timetableTextColSubject,
      );
      globals.prefs.setBool(
        "timetableTextColSubject",
        globals.timetableTextColSubject,
      );
    }
    //Homework card
    if (globals.homeworkCardTheme == "Dark") {
      globals.homeworkCardTheme = "Subject";
      FirebaseCrashlytics.instance.setCustomKey(
        "homeworkCardTheme",
        globals.homeworkCardTheme,
      );
      globals.prefs.setString(
        "homeworkCardTheme",
        globals.homeworkCardTheme,
      );
    }
    //Homework card text
    if (globals.homeworkTextColSubject) {
      globals.homeworkTextColSubject = false;
      FirebaseCrashlytics.instance.setCustomKey(
        "homeworkTextColSubject",
        globals.homeworkTextColSubject,
      );
      globals.prefs.setBool(
        "homeworkTextColSubject",
        globals.homeworkTextColSubject,
      );
    }
    //Exam card
    if (globals.examsCardTheme == "Dark") {
      globals.examsCardTheme = "Subject";
      FirebaseCrashlytics.instance.setCustomKey(
        "examsCardTheme",
        globals.examsCardTheme,
      );
      globals.prefs.setString(
        "examsCardTheme",
        globals.examsCardTheme,
      );
    }
    //Exams card text
    if (globals.examsTextColSubject) {
      globals.examsTextColSubject = false;
      FirebaseCrashlytics.instance.setCustomKey(
        "examsTextColSubject",
        globals.examsTextColSubject,
      );
      globals.prefs.setBool(
        "examsTextColSubject",
        globals.examsTextColSubject,
      );
    }
    //Notices and events card
    if (globals.noticesAndEventsCardTheme == "Dark") {
      globals.noticesAndEventsCardTheme = "Véletlenszerű";
      FirebaseCrashlytics.instance.setCustomKey(
        "noticesAndEventsCardTheme",
        globals.noticesAndEventsCardTheme,
      );
      globals.prefs.setString(
        "noticesAndEventsCardTheme",
        globals.noticesAndEventsCardTheme,
      );
    }
    //Statistics
    if (globals.statisticsCardTheme == "Dark") {
      globals.statisticsCardTheme = "Subject";
      FirebaseCrashlytics.instance.setCustomKey(
        "statisticsCardTheme",
        globals.statisticsCardTheme,
      );
      globals.prefs.setString(
        "statisticsCardTheme",
        globals.statisticsCardTheme,
      );
    }
    //Statistics card text
    if (globals.statisticsTextColSubject) {
      globals.statisticsTextColSubject = false;
      FirebaseCrashlytics.instance.setCustomKey(
        "statisticsTextColSubject",
        globals.statisticsTextColSubject,
      );
      globals.prefs.setBool(
        "statisticsTextColSubject",
        globals.statisticsTextColSubject,
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("UI ${getTranslatedString("settings")}"),
      ),
      body: ListView.separated(
          separatorBuilder: (context, index) => Divider(),
          itemCount: 5 + (globals.darker ? 1 : 0),
          itemBuilder: (context, index) {
            switch (index) {
              case 0:
                return ListTile(
                  title: Text(getTranslatedString("theme")),
                  trailing: DropdownButton<String>(
                    items: [
                      DropdownMenuItem(
                        value: "Dark",
                        child: Text(
                          getTranslatedString("dark"),
                        ),
                      ),
                      DropdownMenuItem(
                        value: "Darker",
                        child: Text(
                          getTranslatedString("darker"),
                        ),
                      ),
                      DropdownMenuItem(
                        value: "Light",
                        child: Text(
                          getTranslatedString("bright"),
                        ),
                      ),
                    ],
                    onChanged: (String value) {
                      if (value == "Light") {
                        globals.prefs.setBool("darker", false);
                        globals.darker = false;
                        ThemeHelper()
                            .changeBrightness(context, ThemeMode.light);
                        FirebaseAnalytics.instance
                            .setUserProperty(name: "Theme", value: "Bright");
                        FirebaseCrashlytics.instance
                            .setCustomKey("Theme", "Bright");
                      } else if (value == "Dark") {
                        //Update button status
                        if (globals.markCardTheme == "Dark" &&
                            globals.timetableCardTheme == "Dark" &&
                            globals.homeworkCardTheme == "Dark" &&
                            globals.examsCardTheme == "Dark" &&
                            globals.noticesAndEventsCardTheme == "Dark" &&
                            globals.statisticsCardTheme == "Dark") {
                          status = Icon(MdiIcons.check);
                        } else {
                          status = Icon(
                            MdiIcons.closeCircle, /*check*/
                          );
                        }
                        //Update prefs
                        globals.prefs.setBool("darker", false);
                        globals.darker = false;
                        ThemeHelper().changeBrightness(context, ThemeMode.dark);
                        FirebaseAnalytics.instance
                            .setUserProperty(name: "Theme", value: "Dark");
                        FirebaseCrashlytics.instance
                            .setCustomKey("Theme", "Dark");
                      } else if (value == "Darker") {
                        globals.prefs.setBool("darker", true);
                        globals.darker = true;
                        ThemeHelper().changeBrightness(context, ThemeMode.dark);
                        FirebaseAnalytics.instance
                            .setUserProperty(name: "Theme", value: "Darker");
                        FirebaseCrashlytics.instance
                            .setCustomKey("Theme", "Darker");
                      }
                      if (!globals.darker) disableDarkCards();
                      setState(() {
                        dropDown = value;
                      });
                    },
                    value: dropDown,
                  ),
                );
                break;
              case 1:
                return ListTile(
                  title: Text("Nyelv (language):"),
                  trailing: DropdownButton<String>(
                    items: [
                      DropdownMenuItem(
                        value: "hu",
                        child: Text(
                          getTranslatedString("hu"),
                        ),
                      ),
                      DropdownMenuItem(
                        value: "en",
                        child: Text(
                          getTranslatedString("en"),
                        ),
                      ),
                    ],
                    onChanged: (String value) async {
                      await globals.prefs.setString("Language", value);
                      await FirebaseAnalytics.instance.setUserProperty(
                        name: "Language",
                        value: value,
                      );
                      FirebaseCrashlytics.instance
                          .setCustomKey("Language", value);
                      if (globals.language != value) {
                        Navigator.of(context).pushAndRemoveUntil(
                          MaterialPageRoute(
                            builder: (context) => UIsettings(),
                          ),
                          (Route<dynamic> route) => false,
                        );
                        setState(() {
                          globals.language = value;
                        });
                        await showDialog(
                          barrierDismissible: false,
                          context: context,
                          builder: (BuildContext context) {
                            return WillPopScope(
                              onWillPop: () async {
                                return false;
                                //Don't let the user exit without pressing ok
                                //Else it would cause globalkey issues
                                //BUG: fix this issue
                                //! Severity: high
                                //! Fix complexity: high
                              },
                              child: AlertDialog(
                                elevation: globals.darker ? 0 : 24,
                                title: Text(getTranslatedString("status")),
                                content:
                                    Text(getTranslatedString("langRestart")),
                                actions: <Widget>[
                                  TextButton(
                                    child: Text('Ok'),
                                    onPressed: null,
                                  ),
                                ],
                              ),
                            );
                          },
                        );
                      }
                    },
                    value: globals.language,
                  ),
                );
                break;
              case 2:
                return ListTile(
                  title: Text(getTranslatedString("chartAnimations")),
                  trailing: Switch(
                    onChanged: (bool switchOn) async {
                      setState(() {
                        globals.chartAnimations = switchOn;
                      });
                      FirebaseCrashlytics.instance
                          .setCustomKey("ChartAnimations", switchOn);
                      if (switchOn) {
                        FirebaseAnalytics.instance.setUserProperty(
                            name: "ChartAnimations", value: "YES");
                        globals.prefs.setBool("chartAnimations", true);
                      } else {
                        FirebaseAnalytics.instance.setUserProperty(
                            name: "ChartAnimations", value: "NO");
                        globals.prefs.setBool("chartAnimations", false);
                      }
                    },
                    value: globals.chartAnimations,
                  ),
                );
                break;
              case 3:
                return ListTile(
                  title: Text(getTranslatedString("appBarColoredByUser")),
                  trailing: Switch(
                    onChanged: (bool switchOn) async {
                      setState(() {
                        globals.appBarColoredByUser = switchOn;
                      });
                      if (switchOn) {
                        globals.prefs.setBool("appBarColoredByUser", true);
                        setState(() {
                          globals.appBarTextColoredByUser = false;
                          globals.prefs
                              .setBool("appBarTextColoredByUser", false);
                        });
                      } else {
                        globals.prefs.setBool("appBarColoredByUser", false);
                      }
                      DynamicTheme.of(context).setThemeMode(
                        DynamicTheme.of(context).themeMode,
                      );
                    },
                    value: globals.appBarColoredByUser,
                  ),
                );
                break;
              case 4:
                return ListTile(
                  title: Text(getTranslatedString("appBarTextColoredByUser")),
                  trailing: Switch(
                    onChanged: (bool switchOn) async {
                      setState(() {
                        globals.appBarTextColoredByUser = switchOn;
                      });
                      if (switchOn) {
                        globals.prefs.setBool("appBarTextColoredByUser", true);
                        setState(() {
                          globals.appBarColoredByUser = false;
                          globals.prefs.setBool("appBarColoredByUser", false);
                        });
                      } else {
                        globals.prefs.setBool("appBarTextColoredByUser", false);
                      }
                      DynamicTheme.of(context).setThemeMode(
                        DynamicTheme.of(context).themeMode,
                      );
                    },
                    value: globals.appBarTextColoredByUser,
                  ),
                );
                break;
              case 5:
                return ListTile(
                  title: Center(
                    child: SizedBox(
                      height: 38,
                      width: double.infinity,
                      child: ElevatedButton.icon(
                        style: ButtonStyle(
                          shape:
                              MaterialStateProperty.all<RoundedRectangleBorder>(
                            RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(24),
                            ),
                          ),
                        ),
                        onPressed: () async {
                          setState(() {
                            status = SizedBox(
                              height: 20,
                              width: 20,
                              child: CircularProgressIndicator(),
                            );
                          });
                          await Future.delayed(
                            Duration(milliseconds: 250),
                            () => setDarkCards(),
                          );
                          setState(() {
                            status = Icon(
                              MdiIcons.check,
                            );
                          });
                        },
                        icon: status,
                        label: Text(
                          getTranslatedString("forceDarkCards"),
                        ),
                      ),
                    ),
                  ),
                );
                break;
              default:
                return SizedBox(height: 10, width: 10);
            }
          }),
    );
  }
}