From 337f1b506995db1c7a13b74f01d367c55b710b11 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Thu, 21 Jul 2022 15:52:01 +0200
Subject: [PATCH] Add a "start random game (random image, random tile size)"
 button

---
 android/gradle.properties                     |   4 +-
 assets/icons/button_random_pick.png           | Bin 0 -> 5859 bytes
 .../metadata/android/en-US/changelogs/47.txt  |   1 +
 .../metadata/android/fr-FR/changelogs/47.txt  |   1 +
 icons/build_game_icons.sh                     |   1 +
 icons/button_random_pick.svg                  |   2 +
 lib/provider/data.dart                        |   6 +++
 lib/screens/home.dart                         |  36 ++++++++++++------
 lib/utils/game_utils.dart                     |  22 +++++++++--
 9 files changed, 56 insertions(+), 17 deletions(-)
 create mode 100644 assets/icons/button_random_pick.png
 create mode 100644 fastlane/metadata/android/en-US/changelogs/47.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/47.txt
 create mode 100644 icons/button_random_pick.svg

diff --git a/android/gradle.properties b/android/gradle.properties
index 7d3ad5f..2c9d43c 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=0.0.46
-app.versionCode=46
+app.versionName=0.0.47
+app.versionCode=47
diff --git a/assets/icons/button_random_pick.png b/assets/icons/button_random_pick.png
new file mode 100644
index 0000000000000000000000000000000000000000..7268257b2f50ae51d9c1944fbb5b40767d0aa8fd
GIT binary patch
literal 5859
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

literal 0
HcmV?d00001

diff --git a/fastlane/metadata/android/en-US/changelogs/47.txt b/fastlane/metadata/android/en-US/changelogs/47.txt
new file mode 100644
index 0000000..1c74d3d
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/47.txt
@@ -0,0 +1 @@
+Add a "start random game" button
diff --git a/fastlane/metadata/android/fr-FR/changelogs/47.txt b/fastlane/metadata/android/fr-FR/changelogs/47.txt
new file mode 100644
index 0000000..050a248
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/47.txt
@@ -0,0 +1 @@
+Ajout d'un bouton "démarrer un puzzle aléatoire"
diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh
index 720bca3..a4c7b75 100755
--- a/icons/build_game_icons.sh
+++ b/icons/build_game_icons.sh
@@ -18,6 +18,7 @@ ICON_SIZE=192
 AVAILABLE_GAME_IMAGES="
   button_back
   button_shuffle
+  button_random_pick
   game_win
   placeholder
   tip_hidden
diff --git a/icons/button_random_pick.svg b/icons/button_random_pick.svg
new file mode 100644
index 0000000..a3e39b9
--- /dev/null
+++ b/icons/button_random_pick.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg enable-background="new 0 0 100 100" version="1.1" viewBox="0 0 93.665 93.676" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path d="m83.437 0.38264h-73.092c-5.6481 0-9.9672 4.3191-9.9672 9.9672v73.092c0 5.6481 4.3191 9.9672 9.9672 9.9672h73.092c5.6481 0 9.9672-4.3191 9.9672-9.9672v-73.092c0-5.6481-4.3191-9.9672-9.9672-9.9672z" fill="#0d6586" stroke-width="3.3224"/><g transform="matrix(.13283 0 0 .13283 .34007 9.6436)" fill="#fff" fill-rule="evenodd" stroke="#fff" stroke-width="6.049"><path d="m351.68 33.758c1.3438 0.17188 2.6562 0.58984 3.8516 1.2266l206.85 107.8c3.5938 1.9062 5.9805 5.9062 5.9492 9.9766v3.3242c0.25781 1.3477 0.23438 2.6758 0 4.0234v232.4c0 8.0234-3.5977 10.309-8.0508 12.949-67.969 39.805-136.01 79.484-204.05 119.18-4.6602 2.3828-9.293 1.8555-11.898 0.34766-68.398-39.75-136.66-79.73-204.93-119.7-6.5664-3.8711-7.6523-7.6172-7.875-12.426v-233.8c-0.0508-0.60547-0.043-1.1445 0-1.75v-4.5508c4e-3 -4.1055 2.4648-8.1133 6.125-9.9766l207.38-107.8c1.668-0.85156 3.5508-1.2773 5.4258-1.2266 0.40625-0.02344 0.81641-0.02344 1.2266 0zm-1.3984 23.801-189.35 98.352 189.18 110.25 188.82-110.25zm-196.35 119.7v210.88c61.762 35.758 123.37 71.781 184.98 107.8v-210.18c-8.5195-5.043-138.17-81.852-184.98-108.5zm333.2 74.727c-8.7695-0.42969-17.48 3.7969-22.227 11.898-0.0469 0.0742-0.12891 0.10156-0.17578 0.17578-0.0312 0.0547-0.14453 0.12109-0.17578 0.17578-6.9219 11.734-2.9922 26.805 8.3984 33.949l4e-3 -4e-3c0.17578 0.0625 0.34766 0.12109 0.52734 0.17578 11.566 6.625 26.992 2.9727 33.949-8.75v-0.17578c6.6836-11.523 3.2266-26.727-8.5742-33.773-0.0664-0.0391-0.10937-0.13281-0.17578-0.17578-0.0625-0.0391-0.11328-0.14062-0.17578-0.17578-3.5195-2.1172-7.4688-3.1328-11.375-3.3242zm-35.875 59.852c-8.7852-0.25781-17.441 4.0156-22.227 12.074v-4e-3c-0.0586 0.0586-0.11719 0.11328-0.17188 0.17188-6.6836 11.523-3.2266 26.727 8.5742 33.773 0.0664 0.0547 0.10938 0.13281 0.17578 0.17188 0.0625 0.0547 0.11328 0.14062 0.17578 0.17187 11.418 6.8672 26.918 3.1367 33.773-8.5742 0.0312-0.0547-0.0312-0.125 0-0.17188 0.043-0.0781 0.13281-0.0937 0.17578-0.17188 6.9219-11.734 2.9883-26.805-8.3984-33.949h-4e-3c-0.11328-0.0586-0.23047-0.11719-0.34766-0.17188-3.6133-2.0703-7.7305-3.207-11.727-3.3242zm-35.523 60.023c-8.7344-0.25391-17.422 3.9375-22.227 11.898-0.0195 0.0547 0.0195 0.14063 0 0.17188h-0.17578c-7.0586 11.672-2.9102 26.855 8.3984 33.949h4e-3v0.17578c11.703 7.0977 27.117 3.0078 34.125-8.3984v-4e-3c0.0586-0.0547 0.11719-0.11328 0.17188-0.17188 6.9766-11.75 3.1328-27-8.2266-34.125h4e-3c-0.17578-0.0625-0.34766-0.12109-0.52734-0.17578-3.6133-2.0703-7.5547-3.207-11.551-3.3242z"/><path d="m277.98 350.68c19.855 0 36.293 16.441 36.293 36.559 0 19.992-16.316 36.566-36.293 36.566-20.098 0-36.293-16.691-36.293-36.566 0-20.004 16.312-36.559 36.293-36.559z"/><path d="m209.89 259.82c19.98 0 36.293 16.559 36.293 36.559 0 19.875-16.195 36.566-36.293 36.566-19.977 0-36.293-16.574-36.293-36.566 0-20.117 16.438-36.559 36.293-36.559z"/><path d="m346.94 117.8c15.668 0 30 3.6641 41.234 10.379 11.234 6.7148 20.152 17.469 20.152 30.812 0 13.301-8.9531 23.957-20.176 30.633-11.223 6.6758-25.543 10.344-41.211 10.344s-29.992-3.668-41.215-10.344-20.176-17.332-20.176-30.633c0-13.344 8.9258-24.094 20.16-30.812 11.234-6.7148 25.566-10.379 41.234-10.379z"/></g></svg>
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index 5deb9c4..d11f57f 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -9,6 +9,7 @@ class Data extends ChangeNotifier {
   List _availableImages = [];
   String _selectedImage = '';
   List<MovingTile> _tiles = [];
+  double _tileImageSize = 1.0;
 
   // application state
   bool _isShufflingBoard = false;
@@ -60,6 +61,11 @@ class Data extends ChangeNotifier {
     notifyListeners();
   }
 
+  double get tileImageSize => _tileImageSize;
+  void updateTileImageSize(double tileImageSize) {
+    _tileImageSize = tileImageSize;
+  }
+
   void swapTiles(List<int> tile1, List<int> tile2) {
     int indexTile1 = _tiles.indexWhere(
         (tile) => ((tile.currentCol == tile1[0]) && (tile.currentRow == tile1[1])));
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 3db611e..f2047d4 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -24,10 +24,8 @@ class Home extends StatelessWidget {
     }
   }
 
-  Future<void> selectImage(Data myProvider, String imageCode, double tileImageSize) async {
-    myProvider.updateIsShufflingBoard(true);
-    myProvider.updateSelectedImage(imageCode);
-    GameUtils.startGame(myProvider, tileImageSize);
+  Future<void> selectImage(Data myProvider, String imageCode) async {
+    GameUtils.startGame(myProvider, imageCode);
   }
 
   void shuffleAvailableImages(Data myProvider) {
@@ -36,7 +34,7 @@ class Home extends StatelessWidget {
     myProvider.updateAvailableImages(images);
   }
 
-  Container _buildImageSelectorItem(Data myProvider, String image, double tileImageSize) {
+  Container _buildImageSelectorItem(Data myProvider, String image) {
     return Container(
       child: TextButton(
         style: TextButton.styleFrom(
@@ -56,13 +54,13 @@ class Home extends StatelessWidget {
           ),
         ),
         onPressed: () {
-          selectImage(myProvider, image, tileImageSize);
+          selectImage(myProvider, image);
         },
       ),
     );
   }
 
-  Container _buildImageSelector(Data myProvider, double tileImageSize) {
+  Container _buildImageSelector(Data myProvider) {
     if (myProvider.availableImages.length == 0) {
       getImagesList(myProvider);
     }
@@ -84,8 +82,7 @@ class Home extends StatelessWidget {
                       Column(
                         children: [
                           if (imgIndex + colIndex < images.length)
-                            _buildImageSelectorItem(
-                                myProvider, images[imgIndex + colIndex], tileImageSize)
+                            _buildImageSelectorItem(myProvider, images[imgIndex + colIndex])
                         ],
                       ),
                   ],
@@ -133,14 +130,15 @@ class Home extends StatelessWidget {
 
     var content;
 
-    double _tileImageSize = (MediaQuery.of(context).size.width - 70) / _myProvider.tilesCount;
+    _myProvider.updateTileImageSize(
+        (MediaQuery.of(context).size.width - 70) / _myProvider.tilesCount);
 
     if (_myProvider.isShufflingBoard) {
       content = Game.buildShufflingIndicatorWidget();
       precacheImage(new AssetImage('assets/icons/game_win.png'), context);
     } else {
       if (_myProvider.selectedImage == '') {
-        content = _buildImageSelector(_myProvider, _tileImageSize);
+        content = _buildImageSelector(_myProvider);
       } else {
         content = Game.buildGameWidget(_myProvider);
       }
@@ -166,6 +164,22 @@ class Home extends StatelessWidget {
         ),
         onPressed: () => shuffleAvailableImages(_myProvider),
       ),
+      TextButton(
+        child: Container(
+          decoration: BoxDecoration(
+            borderRadius: BorderRadius.circular(4),
+            border: Border.all(
+              color: themePrimaryColor,
+              width: 4,
+            ),
+          ),
+          child: Image(
+            image: AssetImage('assets/icons/button_random_pick.png'),
+            fit: BoxFit.fill,
+          ),
+        ),
+        onPressed: () => GameUtils.startRandomGame(_myProvider),
+      ),
     ];
 
     List<Widget> gameActions = [
diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart
index c22242a..d3df124 100644
--- a/lib/utils/game_utils.dart
+++ b/lib/utils/game_utils.dart
@@ -14,12 +14,26 @@ class GameUtils {
     return 'assets/images/' + imageCode + '.png';
   }
 
-  static startGame(Data myProvider, double tileImageSize) {
+  static startGame(Data myProvider, String imageCode) {
+    myProvider.updateIsShufflingBoard(true);
+    myProvider.updateSelectedImage(imageCode);
+
     new Timer(new Duration(seconds: 1), () {
-      GameUtils.splitImageInTiles(myProvider, tileImageSize);
+      GameUtils.splitImageInTiles(myProvider);
     });
   }
 
+  static startRandomGame(Data myProvider) {
+    List sizes = [3, 4, 5];
+    sizes.shuffle();
+    myProvider.updateTilesCount(sizes[0]);
+
+    List images = myProvider.availableImages;
+    images.shuffle();
+
+    startGame(myProvider, images[0]);
+  }
+
   static Future<void> resetGame(Data myProvider) async {
     myProvider.resetSelectedImage();
     myProvider.updateIsTipImageDisplayed(false);
@@ -58,7 +72,7 @@ class GameUtils {
     return tiles;
   }
 
-  static Future<void> splitImageInTiles(Data myProvider, double tileImageSize) async {
+  static Future<void> splitImageInTiles(Data myProvider) async {
     String imageAsset = getImageAssetName(myProvider.selectedImage);
     Uint8List imageData = (await rootBundle.load(imageAsset)).buffer.asUint8List();
 
@@ -81,7 +95,7 @@ class GameUtils {
 
         tiles.add(MovingTile(
           Image.memory(tileData),
-          tileImageSize,
+          myProvider.tileImageSize,
           j,
           i,
           j,
-- 
GitLab