From dda4940ac0ef7155e39d1f315b5dd20391df929c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Fri, 29 Nov 2024 13:15:49 +0100
Subject: [PATCH] Use navigation tools from flutter_custom_toolbox

---
 .../metadata/android/en-US/changelogs/42.txt  |  1 +
 .../metadata/android/fr-FR/changelogs/42.txt  |  1 +
 lib/common/config/activity_page.dart          | 69 ----------------
 lib/common/config/screen.dart                 | 55 -------------
 lib/common/cubit/nav/nav_cubit_pages.dart     | 33 --------
 lib/common/cubit/nav/nav_cubit_screens.dart   | 37 ---------
 lib/common/ui/nav/bottom_nav_bar.dart         | 46 -----------
 lib/common/ui/screens/about.dart              | 38 ---------
 lib/common/ui/screens/activity.dart           | 18 -----
 lib/common/ui/screens/settings.dart           | 24 ------
 lib/config/application_config.dart            | 80 +++++++++++++++---
 lib/main.dart                                 |  5 +-
 lib/models/activity/activity.dart             |  2 +-
 lib/ui/game/game_end.dart                     |  6 +-
 lib/ui/global_app_bar.dart                    | 81 -------------------
 lib/ui/painters/game_board_painter.dart       |  2 +-
 .../parameter_painter_board_size.dart         |  2 +-
 .../parameter_painter_color_theme.dart        |  2 +-
 .../parameter_painter_colors_count.dart       |  2 +-
 .../parameter_painter_graphic_theme.dart      |  2 +-
 lib/ui/skeleton.dart                          | 66 ++++++++++-----
 lib/{common => }/utils/color_theme_utils.dart |  0
 pubspec.lock                                  |  6 +-
 pubspec.yaml                                  |  4 +-
 24 files changed, 130 insertions(+), 452 deletions(-)
 create mode 100644 fastlane/metadata/android/en-US/changelogs/42.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/42.txt
 delete mode 100644 lib/common/config/activity_page.dart
 delete mode 100644 lib/common/config/screen.dart
 delete mode 100644 lib/common/cubit/nav/nav_cubit_pages.dart
 delete mode 100644 lib/common/cubit/nav/nav_cubit_screens.dart
 delete mode 100644 lib/common/ui/nav/bottom_nav_bar.dart
 delete mode 100644 lib/common/ui/screens/about.dart
 delete mode 100644 lib/common/ui/screens/activity.dart
 delete mode 100644 lib/common/ui/screens/settings.dart
 delete mode 100644 lib/ui/global_app_bar.dart
 rename lib/{common => }/utils/color_theme_utils.dart (100%)

diff --git a/fastlane/metadata/android/en-US/changelogs/42.txt b/fastlane/metadata/android/en-US/changelogs/42.txt
new file mode 100644
index 0000000..7e7ec94
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/42.txt
@@ -0,0 +1 @@
+Use navigation tools from flutter_custom_toolbox.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/42.txt b/fastlane/metadata/android/fr-FR/changelogs/42.txt
new file mode 100644
index 0000000..ab67504
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/42.txt
@@ -0,0 +1 @@
+Utilisation des outils de navigation entre pages depuis flutter_custom_toolbox.
diff --git a/lib/common/config/activity_page.dart b/lib/common/config/activity_page.dart
deleted file mode 100644
index 43a95dc..0000000
--- a/lib/common/config/activity_page.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:jeweled/cubit/activity/activity_cubit.dart';
-import 'package:jeweled/config/application_config.dart';
-import 'package:jeweled/models/activity/activity.dart';
-import 'package:jeweled/ui/pages/game.dart';
-
-class ActivityPageItem {
-  final String code;
-  final Icon icon;
-  final Widget Function({required Activity currentActivity})? builder;
-
-  const ActivityPageItem({
-    required this.code,
-    required this.icon,
-    required this.builder,
-  });
-}
-
-class ActivityPage {
-  static const bool displayBottomNavBar = false;
-
-  static const indexHome = 0;
-  static final ActivityPageItem pageHome = ActivityPageItem(
-    code: 'page_home',
-    icon: Icon(UniconsLine.home),
-    builder: ({required Activity currentActivity}) {
-      return PageParameters(
-        config: ApplicationConfig.config,
-        canBeResumed: currentActivity.canBeResumed,
-      );
-    },
-  );
-
-  static const indexGame = 1;
-  static final pageGame = ActivityPageItem(
-    code: 'page_game',
-    icon: Icon(UniconsLine.star),
-    builder: ({required Activity currentActivity}) {
-      return PageGame();
-    },
-  );
-
-  static final Map<int, ActivityPageItem> items = {
-    indexHome: pageHome,
-    indexGame: pageGame,
-  };
-
-  static int defaultPageIndex = indexHome;
-
-  static bool isIndexAllowed(int pageIndex) {
-    return items.keys.contains(pageIndex);
-  }
-
-  static Widget getWidget(int pageIndex) {
-    return BlocBuilder<ActivityCubit, ActivityState>(
-      builder: (BuildContext context, ActivityState activityState) {
-        final Activity currentActivity = activityState.currentActivity;
-
-        if (items.keys.contains(pageIndex)) {
-          return items[pageIndex]?.builder!(currentActivity: currentActivity) ?? Text('oups');
-        } else {
-          return getWidget(defaultPageIndex);
-        }
-      },
-    );
-  }
-}
diff --git a/lib/common/config/screen.dart b/lib/common/config/screen.dart
deleted file mode 100644
index d18634c..0000000
--- a/lib/common/config/screen.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:jeweled/common/ui/screens/about.dart';
-import 'package:jeweled/common/ui/screens/activity.dart';
-import 'package:jeweled/common/ui/screens/settings.dart';
-
-class ScreenItem {
-  final String code;
-  final Icon icon;
-  final Widget screen;
-
-  const ScreenItem({
-    required this.code,
-    required this.icon,
-    required this.screen,
-  });
-}
-
-class Screen {
-  static const indexActivity = 0;
-  static const screenActivity = ScreenItem(
-    code: 'screen_activity',
-    icon: Icon(UniconsLine.home),
-    screen: ScreenActivity(),
-  );
-
-  static const indexSettings = 1;
-  static const screenSettings = ScreenItem(
-    code: 'screen_settings',
-    icon: Icon(UniconsLine.setting),
-    screen: ScreenSettings(),
-  );
-
-  static const indexAbout = 2;
-  static const screenAbout = ScreenItem(
-    code: 'screen_about',
-    icon: Icon(UniconsLine.info_circle),
-    screen: ScreenAbout(),
-  );
-
-  static Map<int, ScreenItem> items = {
-    indexActivity: screenActivity,
-    indexSettings: screenSettings,
-    indexAbout: screenAbout,
-  };
-
-  static bool isIndexAllowed(int screenIndex) {
-    return items.keys.contains(screenIndex);
-  }
-
-  static Widget getWidget(int screenIndex) {
-    return items[screenIndex]?.screen ?? screenActivity.screen;
-  }
-}
diff --git a/lib/common/cubit/nav/nav_cubit_pages.dart b/lib/common/cubit/nav/nav_cubit_pages.dart
deleted file mode 100644
index 6e8bfc7..0000000
--- a/lib/common/cubit/nav/nav_cubit_pages.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:jeweled/common/config/activity_page.dart';
-
-class NavCubitPage extends HydratedCubit<int> {
-  NavCubitPage() : super(0);
-
-  void updateIndex(int index) {
-    if (ActivityPage.isIndexAllowed(index)) {
-      emit(index);
-    } else {
-      emit(ActivityPage.indexHome);
-    }
-  }
-
-  void goToPageHome() {
-    updateIndex(ActivityPage.indexHome);
-  }
-
-  void goToPageGame() {
-    updateIndex(ActivityPage.indexGame);
-  }
-
-  @override
-  int fromJson(Map<String, dynamic> json) {
-    return ActivityPage.indexHome;
-  }
-
-  @override
-  Map<String, dynamic>? toJson(int state) {
-    return <String, int>{'index': state};
-  }
-}
diff --git a/lib/common/cubit/nav/nav_cubit_screens.dart b/lib/common/cubit/nav/nav_cubit_screens.dart
deleted file mode 100644
index f0d82d8..0000000
--- a/lib/common/cubit/nav/nav_cubit_screens.dart
+++ /dev/null
@@ -1,37 +0,0 @@
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:jeweled/common/config/screen.dart';
-
-class NavCubitScreen extends HydratedCubit<int> {
-  NavCubitScreen() : super(0);
-
-  void updateIndex(int index) {
-    if (Screen.isIndexAllowed(index)) {
-      emit(index);
-    } else {
-      goToScreenActivity();
-    }
-  }
-
-  void goToScreenActivity() {
-    emit(Screen.indexActivity);
-  }
-
-  void goToScreenSettings() {
-    emit(Screen.indexSettings);
-  }
-
-  void goToScreenAbout() {
-    emit(Screen.indexAbout);
-  }
-
-  @override
-  int fromJson(Map<String, dynamic> json) {
-    return Screen.indexActivity;
-  }
-
-  @override
-  Map<String, dynamic>? toJson(int state) {
-    return <String, int>{'index': state};
-  }
-}
diff --git a/lib/common/ui/nav/bottom_nav_bar.dart b/lib/common/ui/nav/bottom_nav_bar.dart
deleted file mode 100644
index 0ed2afb..0000000
--- a/lib/common/ui/nav/bottom_nav_bar.dart
+++ /dev/null
@@ -1,46 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:jeweled/common/config/activity_page.dart';
-import 'package:jeweled/common/cubit/nav/nav_cubit_pages.dart';
-
-class BottomNavBar extends StatelessWidget {
-  const BottomNavBar({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    return Card(
-      margin: const EdgeInsets.only(top: 1, right: 4, left: 4),
-      elevation: 4,
-      shadowColor: Theme.of(context).colorScheme.shadow,
-      color: Theme.of(context).colorScheme.surfaceContainerHighest,
-      shape: const RoundedRectangleBorder(
-        borderRadius: BorderRadius.only(
-          topLeft: Radius.circular(16),
-          topRight: Radius.circular(16),
-        ),
-      ),
-      child: BlocBuilder<NavCubitPage, int>(builder: (BuildContext context, int state) {
-        final List<BottomNavigationBarItem> items = [];
-
-        ActivityPage.items.forEach((int pageIndex, ActivityPageItem item) {
-          items.add(BottomNavigationBarItem(
-            icon: item.icon,
-            label: tr(item.code),
-          ));
-        });
-
-        return BottomNavigationBar(
-          currentIndex: state,
-          onTap: (int index) => BlocProvider.of<NavCubitPage>(context).updateIndex(index),
-          type: BottomNavigationBarType.fixed,
-          elevation: 0,
-          backgroundColor: Colors.transparent,
-          selectedItemColor: Theme.of(context).colorScheme.primary,
-          unselectedItemColor: Theme.of(context).textTheme.bodySmall!.color,
-          items: items,
-        );
-      }),
-    );
-  }
-}
diff --git a/lib/common/ui/screens/about.dart b/lib/common/ui/screens/about.dart
deleted file mode 100644
index f7a14a9..0000000
--- a/lib/common/ui/screens/about.dart
+++ /dev/null
@@ -1,38 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-class ScreenAbout extends StatelessWidget {
-  const ScreenAbout({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    return Padding(
-      padding: const EdgeInsets.symmetric(horizontal: 8),
-      child: Column(
-        mainAxisAlignment: MainAxisAlignment.start,
-        crossAxisAlignment: CrossAxisAlignment.start,
-        mainAxisSize: MainAxisSize.max,
-        children: <Widget>[
-          const SizedBox(height: 8),
-          const AppTitle(text: 'about_title'),
-          const Text('about_content').tr(),
-          FutureBuilder<PackageInfo>(
-            future: PackageInfo.fromPlatform(),
-            builder: (context, snapshot) {
-              switch (snapshot.connectionState) {
-                case ConnectionState.done:
-                  return const Text('about_version').tr(
-                    namedArgs: {
-                      'version': snapshot.data!.version,
-                    },
-                  );
-                default:
-                  return const SizedBox();
-              }
-            },
-          ),
-        ],
-      ),
-    );
-  }
-}
diff --git a/lib/common/ui/screens/activity.dart b/lib/common/ui/screens/activity.dart
deleted file mode 100644
index 5eca4ca..0000000
--- a/lib/common/ui/screens/activity.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:jeweled/common/config/activity_page.dart';
-import 'package:jeweled/common/cubit/nav/nav_cubit_pages.dart';
-
-class ScreenActivity extends StatelessWidget {
-  const ScreenActivity({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    return BlocBuilder<NavCubitPage, int>(
-      builder: (BuildContext context, int pageIndex) {
-        return ActivityPage.getWidget(pageIndex);
-      },
-    );
-  }
-}
diff --git a/lib/common/ui/screens/settings.dart b/lib/common/ui/screens/settings.dart
deleted file mode 100644
index 7981b1c..0000000
--- a/lib/common/ui/screens/settings.dart
+++ /dev/null
@@ -1,24 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-class ScreenSettings extends StatelessWidget {
-  const ScreenSettings({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    return const Padding(
-      padding: EdgeInsets.symmetric(horizontal: 8),
-      child: Column(
-        mainAxisAlignment: MainAxisAlignment.start,
-        crossAxisAlignment: CrossAxisAlignment.start,
-        mainAxisSize: MainAxisSize.max,
-        children: <Widget>[
-          SizedBox(height: 8),
-          AppTitle(text: 'settings_title'),
-          SizedBox(height: 8),
-          ApplicationSettingsForm(),
-        ],
-      ),
-    );
-  }
-}
diff --git a/lib/config/application_config.dart b/lib/config/application_config.dart
index a945ec4..bcb0691 100644
--- a/lib/config/application_config.dart
+++ b/lib/config/application_config.dart
@@ -1,41 +1,39 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/cubit/nav/nav_cubit_pages.dart';
-
 import 'package:jeweled/cubit/activity/activity_cubit.dart';
 
+import 'package:jeweled/ui/pages/game.dart';
+
 import 'package:jeweled/ui/parameters/parameter_painter_board_size.dart';
 import 'package:jeweled/ui/parameters/parameter_painter_colors_count.dart';
 import 'package:jeweled/ui/parameters/parameter_painter_color_theme.dart';
 import 'package:jeweled/ui/parameters/parameter_painter_graphic_theme.dart';
 
 class ApplicationConfig {
-  // known parameters
+  // activity parameter: colors theme values
   static const String parameterCodeColorTheme = 'global.colorTheme';
-  static const String parameterCodeGraphicsTheme = 'global.graphicTheme';
-  static const String parameterCodeBoardSize = 'activity.boardSize';
-  static const String parameterCodeColorsCount = 'activity.colorsCount';
-
-  // colors theme values
   static const String colorThemeGothicBit = 'gothic-bit';
   static const String colorThemeSweethope = 'sweethope';
   static const String colorThemeNostalgicDreams = 'nostalgic-dreams';
   static const String colorThemeArjibi8 = 'arjibi8';
 
-  // graphic theme values
+  // activity parameter: graphic theme values
+  static const String parameterCodeGraphicsTheme = 'global.graphicTheme';
   static const String graphicThemeSolidBackground = 'SolidBackground';
   static const String graphicThemeGradientAndBorder = 'GradientAndBorder';
   static const String graphicThemeEmojis = 'Emojis';
   static const String graphicThemePatterns = 'Patterns';
 
-  // board size values
+  // activity parameter: board size values
+  static const String parameterCodeBoardSize = 'activity.boardSize';
   static const String boardSizeValueSmall = '6';
   static const String boardSizeValueMedium = '10';
   static const String boardSizeValueLarge = '14';
   static const String boardSizeValueExtraLarge = '18';
 
-  // colors count values
+  // activity parameter: colors count values
+  static const String parameterCodeColorsCount = 'activity.colorsCount';
   static const String colorsCountValueLow = '5';
   static const String colorsCountValueMedium = '6';
   static const String colorsCountValueHigh = '7';
@@ -43,6 +41,10 @@ class ApplicationConfig {
 
   static int blockMinimumCellsCount = 3;
 
+  // activity pages
+  static const int activityPageIndexHome = 0;
+  static const int activityPageIndexGame = 1;
+
   static final ApplicationConfigDefinition config = ApplicationConfigDefinition(
     appTitle: 'Jeweled',
     activitySettings: [
@@ -150,15 +152,67 @@ class ApplicationConfig {
     ],
     startNewActivity: (BuildContext context) {
       BlocProvider.of<ActivityCubit>(context).startNewActivity(context);
-      BlocProvider.of<NavCubitPage>(context).goToPageGame();
+      BlocProvider.of<NavCubitPage>(context)
+          .updateIndex(ApplicationConfig.activityPageIndexGame);
+    },
+    quitCurrentActivity: (BuildContext context) {
+      BlocProvider.of<ActivityCubit>(context).quitActivity();
+      BlocProvider.of<NavCubitPage>(context)
+          .updateIndex(ApplicationConfig.activityPageIndexHome);
     },
     deleteCurrentActivity: (BuildContext context) {
       BlocProvider.of<ActivityCubit>(context).deleteSavedActivity();
     },
     resumeActivity: (BuildContext context) {
       BlocProvider.of<ActivityCubit>(context).resumeSavedActivity();
-      BlocProvider.of<NavCubitPage>(context).goToPageGame();
+      BlocProvider.of<NavCubitPage>(context)
+          .updateIndex(ApplicationConfig.activityPageIndexGame);
     },
+    navigation: ApplicationNavigation(
+      screenActivity: ScreenItem(
+        code: 'screen_activity',
+        icon: Icon(UniconsLine.home),
+        screen: ({required ApplicationConfigDefinition appConfig}) =>
+            ScreenActivity(appConfig: appConfig),
+      ),
+      screenSettings: ScreenItem(
+        code: 'screen_settings',
+        icon: Icon(UniconsLine.setting),
+        screen: ({required ApplicationConfigDefinition appConfig}) => ScreenSettings(),
+      ),
+      screenAbout: ScreenItem(
+        code: 'screen_about',
+        icon: Icon(UniconsLine.info_circle),
+        screen: ({required ApplicationConfigDefinition appConfig}) => ScreenAbout(),
+      ),
+      activityPages: {
+        activityPageIndexHome: ActivityPageItem(
+          code: 'page_home',
+          icon: Icon(UniconsLine.home),
+          builder: ({required ApplicationConfigDefinition appConfig}) {
+            return BlocBuilder<ActivityCubit, ActivityState>(
+              builder: (BuildContext context, ActivityState activityState) {
+                return PageParameters(
+                  appConfig: appConfig,
+                  canBeResumed: activityState.currentActivity.canBeResumed,
+                );
+              },
+            );
+          },
+        ),
+        activityPageIndexGame: ActivityPageItem(
+          code: 'page_game',
+          icon: Icon(UniconsLine.star),
+          builder: ({required ApplicationConfigDefinition appConfig}) {
+            return BlocBuilder<ActivityCubit, ActivityState>(
+              builder: (BuildContext context, ActivityState activityState) {
+                return PageGame();
+              },
+            );
+          },
+        ),
+      },
+    ),
   );
 
   static const List<String> graphicThemeContentEmojiStrings = [
diff --git a/lib/main.dart b/lib/main.dart
index 6e7f804..4aa4090 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -4,9 +4,6 @@ import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/cubit/nav/nav_cubit_pages.dart';
-import 'package:jeweled/common/cubit/nav/nav_cubit_screens.dart';
-
 import 'package:jeweled/config/application_config.dart';
 import 'package:jeweled/cubit/activity/activity_cubit.dart';
 import 'package:jeweled/ui/skeleton.dart';
@@ -48,7 +45,7 @@ class MyApp extends StatelessWidget {
       providers: [
         // default providers
         BlocProvider<NavCubitPage>(
-          create: (context) => NavCubitPage(),
+          create: (context) => NavCubitPage(appConfig: ApplicationConfig.config),
         ),
         BlocProvider<NavCubitScreen>(
           create: (context) => NavCubitScreen(),
diff --git a/lib/models/activity/activity.dart b/lib/models/activity/activity.dart
index c19a101..b73de6d 100644
--- a/lib/models/activity/activity.dart
+++ b/lib/models/activity/activity.dart
@@ -2,11 +2,11 @@ import 'dart:math';
 
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/utils/color_theme_utils.dart';
 import 'package:jeweled/config/application_config.dart';
 import 'package:jeweled/models/activity/board.dart';
 import 'package:jeweled/models/activity/cell.dart';
 import 'package:jeweled/models/activity/cell_location.dart';
+import 'package:jeweled/utils/color_theme_utils.dart';
 
 class Activity {
   Activity({
diff --git a/lib/ui/game/game_end.dart b/lib/ui/game/game_end.dart
index b8acead..e2e9139 100644
--- a/lib/ui/game/game_end.dart
+++ b/lib/ui/game/game_end.dart
@@ -1,7 +1,8 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/cubit/nav/nav_cubit_pages.dart';
+import 'package:jeweled/config/application_config.dart';
+
 import 'package:jeweled/cubit/activity/activity_cubit.dart';
 
 class GameEndWidget extends StatelessWidget {
@@ -46,7 +47,8 @@ class GameEndWidget extends StatelessWidget {
                       ActivityButtonQuit(
                         onPressed: () {
                           BlocProvider.of<ActivityCubit>(context).quitActivity();
-                          BlocProvider.of<NavCubitPage>(context).goToPageHome();
+                          BlocProvider.of<NavCubitPage>(context)
+                              .updateIndex(ApplicationConfig.activityPageIndexHome);
                         },
                       )
                     ],
diff --git a/lib/ui/global_app_bar.dart b/lib/ui/global_app_bar.dart
deleted file mode 100644
index 64d57b1..0000000
--- a/lib/ui/global_app_bar.dart
+++ /dev/null
@@ -1,81 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
-
-import 'package:jeweled/common/config/screen.dart';
-import 'package:jeweled/common/cubit/nav/nav_cubit_pages.dart';
-import 'package:jeweled/common/cubit/nav/nav_cubit_screens.dart';
-
-import 'package:jeweled/cubit/activity/activity_cubit.dart';
-import 'package:jeweled/models/activity/activity.dart';
-
-class GlobalAppBar extends StatelessWidget implements PreferredSizeWidget {
-  const GlobalAppBar({super.key});
-
-  @override
-  Widget build(BuildContext context) {
-    return BlocBuilder<ActivityCubit, ActivityState>(
-      builder: (BuildContext context, ActivityState activityState) {
-        return BlocBuilder<NavCubitScreen, int>(
-          builder: (BuildContext context, int pageIndex) {
-            final Activity currentActivity = activityState.currentActivity;
-
-            final List<Widget> menuActions = [];
-
-            if (currentActivity.isRunning && !currentActivity.isFinished) {
-              menuActions.add(ActivityButtonQuit(
-                onPressed: () {},
-                onLongPress: () {
-                  BlocProvider.of<ActivityCubit>(context).quitActivity();
-                  BlocProvider.of<NavCubitPage>(context).goToPageHome();
-                },
-              ));
-            } else {
-              if (pageIndex == Screen.indexActivity) {
-                // go to Settings page
-                menuActions.add(ElevatedButton(
-                  onPressed: () {
-                    BlocProvider.of<NavCubitScreen>(context).goToScreenSettings();
-                  },
-                  style: ElevatedButton.styleFrom(
-                    shape: const CircleBorder(),
-                  ),
-                  child: Screen.screenSettings.icon,
-                ));
-
-                // go to About page
-                menuActions.add(ElevatedButton(
-                  onPressed: () {
-                    BlocProvider.of<NavCubitScreen>(context).goToScreenAbout();
-                  },
-                  style: ElevatedButton.styleFrom(
-                    shape: const CircleBorder(),
-                  ),
-                  child: Screen.screenAbout.icon,
-                ));
-              } else {
-                // back to Home page
-                menuActions.add(ElevatedButton(
-                  onPressed: () {
-                    BlocProvider.of<NavCubitScreen>(context).goToScreenActivity();
-                  },
-                  style: ElevatedButton.styleFrom(
-                    shape: const CircleBorder(),
-                  ),
-                  child: Screen.screenActivity.icon,
-                ));
-              }
-            }
-
-            return AppBar(
-              title: const AppHeader(text: 'app_name'),
-              actions: menuActions,
-            );
-          },
-        );
-      },
-    );
-  }
-
-  @override
-  Size get preferredSize => const Size.fromHeight(50);
-}
diff --git a/lib/ui/painters/game_board_painter.dart b/lib/ui/painters/game_board_painter.dart
index 82c9f58..4a13ba8 100644
--- a/lib/ui/painters/game_board_painter.dart
+++ b/lib/ui/painters/game_board_painter.dart
@@ -4,10 +4,10 @@ import 'dart:ui' as ui;
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/utils/color_theme_utils.dart';
 import 'package:jeweled/config/application_config.dart';
 import 'package:jeweled/models/activity/cell_location.dart';
 import 'package:jeweled/models/activity/activity.dart';
+import 'package:jeweled/utils/color_theme_utils.dart';
 
 class GameBoardPainter extends CustomPainter {
   const GameBoardPainter({
diff --git a/lib/ui/parameters/parameter_painter_board_size.dart b/lib/ui/parameters/parameter_painter_board_size.dart
index 51d6c5a..b2d2d19 100644
--- a/lib/ui/parameters/parameter_painter_board_size.dart
+++ b/lib/ui/parameters/parameter_painter_board_size.dart
@@ -3,8 +3,8 @@ import 'dart:math';
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/utils/color_theme_utils.dart';
 import 'package:jeweled/config/application_config.dart';
+import 'package:jeweled/utils/color_theme_utils.dart';
 
 class ParameterPainterBoardSize extends CustomPainter {
   const ParameterPainterBoardSize({
diff --git a/lib/ui/parameters/parameter_painter_color_theme.dart b/lib/ui/parameters/parameter_painter_color_theme.dart
index e1f65dd..f18bfb1 100644
--- a/lib/ui/parameters/parameter_painter_color_theme.dart
+++ b/lib/ui/parameters/parameter_painter_color_theme.dart
@@ -2,7 +2,7 @@ import 'dart:math';
 
 import 'package:flutter/material.dart';
 
-import 'package:jeweled/common/utils/color_theme_utils.dart';
+import 'package:jeweled/utils/color_theme_utils.dart';
 
 class ParameterPainterColorTheme extends CustomPainter {
   const ParameterPainterColorTheme({
diff --git a/lib/ui/parameters/parameter_painter_colors_count.dart b/lib/ui/parameters/parameter_painter_colors_count.dart
index 753f933..46ad6d1 100644
--- a/lib/ui/parameters/parameter_painter_colors_count.dart
+++ b/lib/ui/parameters/parameter_painter_colors_count.dart
@@ -3,8 +3,8 @@ import 'dart:math';
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/utils/color_theme_utils.dart';
 import 'package:jeweled/config/application_config.dart';
+import 'package:jeweled/utils/color_theme_utils.dart';
 
 class ParameterPainterColorsCount extends CustomPainter {
   const ParameterPainterColorsCount({
diff --git a/lib/ui/parameters/parameter_painter_graphic_theme.dart b/lib/ui/parameters/parameter_painter_graphic_theme.dart
index 73ec570..878dbc0 100644
--- a/lib/ui/parameters/parameter_painter_graphic_theme.dart
+++ b/lib/ui/parameters/parameter_painter_graphic_theme.dart
@@ -4,8 +4,8 @@ import 'dart:ui' as ui;
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/utils/color_theme_utils.dart';
 import 'package:jeweled/config/application_config.dart';
+import 'package:jeweled/utils/color_theme_utils.dart';
 
 class ParameterPainterGraphicTheme extends CustomPainter {
   const ParameterPainterGraphicTheme({
diff --git a/lib/ui/skeleton.dart b/lib/ui/skeleton.dart
index 5f1e2c9..321132c 100644
--- a/lib/ui/skeleton.dart
+++ b/lib/ui/skeleton.dart
@@ -1,11 +1,9 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_custom_toolbox/flutter_toolbox.dart';
 
-import 'package:jeweled/common/config/activity_page.dart';
-import 'package:jeweled/common/config/screen.dart';
-import 'package:jeweled/common/cubit/nav/nav_cubit_screens.dart';
-import 'package:jeweled/ui/global_app_bar.dart';
-import 'package:jeweled/common/ui/nav/bottom_nav_bar.dart';
+import 'package:jeweled/config/application_config.dart';
+import 'package:jeweled/cubit/activity/activity_cubit.dart';
+import 'package:jeweled/models/activity/activity.dart';
 
 class SkeletonScreen extends StatelessWidget {
   const SkeletonScreen({super.key});
@@ -14,22 +12,48 @@ class SkeletonScreen extends StatelessWidget {
   Widget build(BuildContext context) {
     return BlocBuilder<NavCubitScreen, int>(
       builder: (BuildContext context, int screenIndex) {
-        return Scaffold(
-          appBar: const GlobalAppBar(),
-          extendBodyBehindAppBar: false,
-          body: Material(
-            color: Theme.of(context).colorScheme.surface,
-            child: Padding(
-              padding: const EdgeInsets.only(
-                top: 8,
-                left: 2,
-                right: 2,
-              ),
-              child: Screen.getWidget(screenIndex),
-            ),
-          ),
-          backgroundColor: Theme.of(context).colorScheme.surface,
-          bottomNavigationBar: ActivityPage.displayBottomNavBar ? const BottomNavBar() : null,
+        return BlocBuilder<ActivityCubit, ActivityState>(
+          builder: (BuildContext context, ActivityState activityState) {
+            return BlocBuilder<NavCubitPage, int>(
+              builder: (BuildContext context, int pageIndex) {
+                final Activity currentActivity = activityState.currentActivity;
+
+                // autostart activity
+                if (ApplicationConfig.config.autoStartActivity &&
+                    (!currentActivity.isRunning)) {
+                  ApplicationConfig.config.startNewActivity(context);
+                }
+
+                return Scaffold(
+                  appBar: GlobalAppBar(
+                    appConfig: ApplicationConfig.config,
+                    pageIndex: pageIndex,
+                    isActivityRunning:
+                        currentActivity.isRunning && !currentActivity.isFinished,
+                  ),
+                  extendBodyBehindAppBar: false,
+                  body: Material(
+                    color: Theme.of(context).colorScheme.surface,
+                    child: Padding(
+                      padding: const EdgeInsets.only(
+                        top: 8,
+                        left: 2,
+                        right: 2,
+                      ),
+                      child: ApplicationConfig.config.navigation.getScreenWidget(
+                        appConfig: ApplicationConfig.config,
+                        screenIndex: screenIndex,
+                      ),
+                    ),
+                  ),
+                  backgroundColor: Theme.of(context).colorScheme.surface,
+                  bottomNavigationBar: ApplicationConfig.config.navigation.displayBottomNavBar
+                      ? BottomNavBar(appConfig: ApplicationConfig.config)
+                      : null,
+                );
+              },
+            );
+          },
         );
       },
     );
diff --git a/lib/common/utils/color_theme_utils.dart b/lib/utils/color_theme_utils.dart
similarity index 100%
rename from lib/common/utils/color_theme_utils.dart
rename to lib/utils/color_theme_utils.dart
diff --git a/pubspec.lock b/pubspec.lock
index 0d7744c..8b73236 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -122,11 +122,11 @@ packages:
     dependency: "direct main"
     description:
       path: "."
-      ref: "0.5.0"
-      resolved-ref: b8164a50489ba981ea57d9f02e2334f09cb8c6a7
+      ref: "0.6.0"
+      resolved-ref: dfe0f6b7b49f9aa32f085e4a5d3ea320b3611eed
       url: "https://git.harrault.fr/android/flutter-toolbox.git"
     source: git
-    version: "0.5.0"
+    version: "0.6.0"
   flutter_lints:
     dependency: "direct dev"
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index d8e41a3..de88251 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@ description: Jeweled Game
 
 publish_to: "none"
 
-version: 0.5.0+41
+version: 0.6.0+42
 
 environment:
   sdk: "^3.0.0"
@@ -16,7 +16,7 @@ dependencies:
   flutter_custom_toolbox:
     git:
       url: https://git.harrault.fr/android/flutter-toolbox.git
-      ref: 0.5.0
+      ref: 0.6.0
 
   # specific
   # (none)
-- 
GitLab