From 9022a2fbd001ea1e2d11228f1ddb5231bc83961e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Mon, 5 Jul 2021 14:31:34 +0200
Subject: [PATCH] Add winning message when sudoku grid is solved

---
 android/gradle.properties                     |   4 +-
 assets/icons/game_win.png                     | Bin 0 -> 7906 bytes
 .../metadata/android/en-US/changelogs/25.txt  |   1 +
 .../metadata/android/fr-FR/changelogs/25.txt  |   1 +
 icons/build_game_icons.sh                     |   1 +
 icons/game_win.svg                            |   2 +
 lib/layout/board.dart                         |   6 +--
 lib/layout/game.dart                          |  50 +++++++++++++++++-
 8 files changed, 58 insertions(+), 7 deletions(-)
 create mode 100644 assets/icons/game_win.png
 create mode 100644 fastlane/metadata/android/en-US/changelogs/25.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/25.txt
 create mode 100644 icons/game_win.svg

diff --git a/android/gradle.properties b/android/gradle.properties
index c2a871a..357cef3 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.24
-app.versionCode=24
+app.versionName=0.0.25
+app.versionCode=25
diff --git a/assets/icons/game_win.png b/assets/icons/game_win.png
new file mode 100644
index 0000000000000000000000000000000000000000..d73741df40e8cb97e2bf0eec929bba2e7859459a
GIT binary patch
literal 7906
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

literal 0
HcmV?d00001

diff --git a/fastlane/metadata/android/en-US/changelogs/25.txt b/fastlane/metadata/android/en-US/changelogs/25.txt
new file mode 100644
index 0000000..3dbdb91
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/25.txt
@@ -0,0 +1 @@
+Add winning message when sudoku grid is solved
diff --git a/fastlane/metadata/android/fr-FR/changelogs/25.txt b/fastlane/metadata/android/fr-FR/changelogs/25.txt
new file mode 100644
index 0000000..7ccbd6e
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/25.txt
@@ -0,0 +1 @@
+Ajout d'un message de victoire quand la grille est résolue
diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh
index 819a80e..623c6cd 100755
--- a/icons/build_game_icons.sh
+++ b/icons/build_game_icons.sh
@@ -60,6 +60,7 @@ build_icon ${CURRENT_DIR}/button_start.svg ${BASE_DIR}/assets/icons/button_start
 build_icon ${CURRENT_DIR}/difficulty_easy.svg ${BASE_DIR}/assets/icons/difficulty_easy.png
 build_icon ${CURRENT_DIR}/difficulty_medium.svg ${BASE_DIR}/assets/icons/difficulty_medium.png
 build_icon ${CURRENT_DIR}/difficulty_hard.svg ${BASE_DIR}/assets/icons/difficulty_hard.png
+build_icon ${CURRENT_DIR}/game_win.svg ${BASE_DIR}/assets/icons/game_win.png
 build_icon ${CURRENT_DIR}/size_2x2.svg ${BASE_DIR}/assets/icons/size_2x2.png
 build_icon ${CURRENT_DIR}/size_3x2.svg ${BASE_DIR}/assets/icons/size_3x2.png
 build_icon ${CURRENT_DIR}/size_3x3.svg ${BASE_DIR}/assets/icons/size_3x3.png
diff --git a/icons/game_win.svg b/icons/game_win.svg
new file mode 100644
index 0000000..fe20923
--- /dev/null
+++ b/icons/game_win.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"><g transform="matrix(.17604 0 0 .17604 7.9341 1.7716)"><path d="m101.92 496.35c-1.8555 0-3.7109-0.69532-5.1484-2.0898-2.9297-2.8438-3-7.5234-0.15234-10.453l9.1875-9.4648c2.8438-2.9297 7.5234-3 10.453-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4648c-1.4492 1.4961-3.375 2.2461-5.3047 2.2461z" fill="#ff4e61"/><path d="m201.65 133.26c-1.8516 0-3.7109-0.69531-5.1445-2.0898-2.9297-2.8438-3-7.5234-0.15625-10.449l9.1914-9.4688c2.8438-2.9297 7.5195-3 10.449-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#ff4e61"/><path d="m413.8 100.39c-1.8555 0-3.7109-0.69141-5.1484-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4688c2.8438-2.9258 7.5234-2.9961 10.453-0.15234 2.9297 2.8398 3 7.5234 0.15625 10.449l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#5c73bc"/><path d="m413.8 463.77c-1.8555 0-3.7109-0.69532-5.1484-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4688c2.8438-2.9258 7.5234-3 10.453-0.15625s3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m63.07 112.91c-1.8516 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1914-9.4687c2.8438-2.9258 7.5234-2.9961 10.453-0.15234 2.9258 2.8438 2.9961 7.5234 0.15234 10.449l-9.1914 9.4688c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m12.309 278.82c-1.8516 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l9.1875-9.4688c2.8438-2.9297 7.5234-3 10.453-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-9.1914 9.4688c-1.4453 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#2dc471"/><path d="m216.29 278.49-23.996 12.996c-6.2226 3.3711-13.496-2.0742-12.309-9.2148l4.582-27.523c0.47266-2.8359-0.4375-5.7266-2.4375-7.7344l-19.414-19.496c-5.0352-5.0547-2.2578-13.863 4.7031-14.906l26.824-4.0156c2.7656-0.41407 5.1524-2.1992 6.3867-4.7812l12-25.043c3.1133-6.4922 12.102-6.4922 15.215 0l11.996 25.043c1.2383 2.582 3.625 4.3672 6.3867 4.7812l26.828 4.0156c6.957 1.043 9.7344 9.8516 4.6992 14.906l-19.41 19.496c-2 2.0078-2.9141 4.8984-2.4414 7.7344l4.582 27.523c1.1914 7.1406-6.082 12.586-12.305 9.2148l-23.996-12.996c-2.4727-1.3398-5.4258-1.3398-7.8945 0z" fill="#ffd02f"/><path d="m220.24 512c-4.082 0-7.3906-3.3086-7.3906-7.3906v-115.59c0-4.082 3.3086-7.3945 7.3906-7.3945s7.3906 3.3125 7.3906 7.3945v115.59c0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#5c73bc"/><path d="m220.3 357.42h-0.11328c-4.082 0-7.3945-3.3125-7.3945-7.3945s3.3086-7.3906 7.3945-7.3906h0.11328c4.082 0 7.3906 3.3086 7.3906 7.3906s-3.3086 7.3945-7.3906 7.3945z" fill="#5c73bc"/><path d="m220.3 332h-0.14838c-4.082-0.0156-7.375-3.3398-7.3594-7.4219 0.0195-4.0742 3.3242-7.3594 7.3906-7.3594h0.14848c4.082 0.0156 7.375 3.3398 7.3594 7.4219-0.0156 4.0703-3.3242 7.3594-7.3906 7.3594z" fill="#fa0"/><path d="m87.234 230.89c-1.9297 0-3.8555-0.75-5.3047-2.2422l-79.34-81.738c-2.8438-2.9297-2.7773-7.6094 0.15234-10.449 2.9297-2.8438 7.6094-2.7734 10.453 0.15235l79.344 81.738c2.8438 2.9258 2.7734 7.6094-0.15625 10.449-1.4375 1.3945-3.293 2.0898-5.1484 2.0898z" fill="#ff4e61"/><path d="m113.95 258.5c-1.8633 0-3.7266-0.69922-5.1641-2.1055-2.9219-2.8516-2.9766-7.5312-0.125-10.453l0.082-0.082c2.8516-2.918 7.5312-2.9766 10.453-0.12109 2.9219 2.8516 2.9766 7.5312 0.12109 10.453l-0.0781 0.082c-1.4492 1.4805-3.3672 2.2266-5.2891 2.2266z" fill="#fa0"/><path d="m131.4 276.48c-1.8555 0-3.7109-0.69531-5.1484-2.0898-2.9258-2.8438-2.9961-7.5234-0.15235-10.449l0.0781-0.0859c2.8476-2.9297 7.5273-2.9961 10.453-0.15235 2.9297 2.8438 3 7.5234 0.15625 10.453l-0.082 0.082c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#5c73bc"/><path d="m353.24 227.99c-1.8555 0-3.7109-0.69141-5.1445-2.0859-2.9297-2.8438-3-7.5234-0.15625-10.453l79.34-81.734c2.8438-2.9297 7.5234-3 10.453-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-79.344 81.734c-1.4492 1.4922-3.375 2.2422-5.3047 2.2422z" fill="#fa0"/><path d="m326.52 255.6c-1.9141 0-3.8242-0.73828-5.2695-2.2109l-0.082-0.082c-2.8633-2.9141-2.8203-7.5938 0.0899-10.453 2.9141-2.8633 7.5938-2.8203 10.453 0.0898l0.082 0.082c2.8594 2.9141 2.8203 7.5938-0.0937 10.453-1.4375 1.4141-3.3086 2.1211-5.1797 2.1211z" fill="#ff4e61"/><path d="m309.07 273.58c-1.9297 0-3.8555-0.75-5.3047-2.2422l-0.082-0.082c-2.8398-2.9297-2.7734-7.6094 0.15625-10.453s7.6094-2.7734 10.453 0.15234l0.082 0.082c2.8398 2.9297 2.7734 7.6094-0.15625 10.453-1.4375 1.3945-3.293 2.0898-5.1484 2.0898z" fill="#fa0"/><path d="m300.65 116.69c-1.2422 0-2.5-0.3125-3.6523-0.97266-3.5469-2.0234-4.7812-6.5391-2.7578-10.082l56.863-99.652c2.0234-3.543 6.5352-4.7773 10.082-2.7539 3.5469 2.0234 4.7812 6.5391 2.7578 10.082l-56.863 99.652c-1.3633 2.3867-3.8594 3.7266-6.4297 3.7266z" fill="#62d38f"/><path d="m281.52 150.33c-1.293 0-2.5977-0.33593-3.7891-1.0469l-0.0976-0.0586c-3.5-2.0938-4.6445-6.6328-2.5469-10.137 2.0938-3.5078 6.6328-4.6445 10.137-2.5508l0.0977 0.0586c3.5039 2.0938 4.6445 6.6328 2.5508 10.137-1.3867 2.3164-3.8359 3.5976-6.3516 3.5976z" fill="#fa0"/><path d="m269.02 172.25c-1.3008 0-2.6172-0.34375-3.8086-1.0625l-0.0977-0.0586c-3.4961-2.1094-4.6211-6.6523-2.5156-10.148 2.1094-3.4961 6.6523-4.6172 10.148-2.5117l0.0976 0.0586c3.4961 2.1094 4.6211 6.6523 2.5117 10.148-1.3867 2.3008-3.832 3.5742-6.3359 3.5742z" fill="#2dc471"/><path d="m139.96 116.69c-2.5703 0-5.0664-1.3398-6.4297-3.7305l-56.863-99.648c-2.0234-3.5469-0.78906-8.0586 2.7539-10.082 3.5469-2.0234 8.0625-0.79297 10.086 2.7539l56.863 99.648c2.0234 3.5469 0.78906 8.0625-2.7539 10.086-1.1562 0.66016-2.4141 0.97266-3.6562 0.97266z" fill="#5c73bc"/><path d="m159.09 150.33c-2.5078 0-4.957-1.2773-6.3438-3.582-2.1016-3.5-0.96875-8.043 2.5273-10.145l0.10157-0.0586c3.5-2.1016 8.0391-0.97266 10.141 2.5273 2.1055 3.5 0.97266 8.0391-2.5273 10.145l-0.0977 0.0586c-1.1914 0.71484-2.5039 1.0547-3.8008 1.0547z" fill="#ff4e61"/><path d="m171.6 172.25c-2.5 0-4.9375-1.2656-6.3281-3.5625-2.1172-3.4922-1-8.0352 2.4883-10.152l0.0977-0.0586c3.4961-2.1133 8.0391-1 10.156 2.4922 2.1133 3.4922 1 8.0352-2.4922 10.152l-0.0977 0.0586c-1.1992 0.72656-2.5195 1.0703-3.8242 1.0703z" fill="#fa0"/><path d="m402.14 357.28-15.523 11.602c-4.0234 3.0117-9.6523-0.043-9.5234-5.1641l0.5039-19.75c0.0508-2.0352-0.87109-3.9648-2.4688-5.1641l-15.508-11.621c-4.0234-3.0156-2.9453-9.4726 1.8242-10.93l18.391-5.6094c1.8906-0.57812 3.3906-2.082 4-4.0156l5.9375-18.785c1.5391-4.875 7.8359-5.8125 10.652-1.5898l10.863 16.285c1.1211 1.6758 2.9688 2.6797 4.9414 2.6797l19.18 0.0117c4.9766 4e-3 7.7891 5.8828 4.7578 9.9492l-11.676 15.672c-1.2031 1.6172-1.5586 3.7383-0.94922 5.6719l5.918 18.797c1.5312 4.875-3.0273 9.4453-7.7148 7.7344l-18.078-6.5977c-1.8594-0.67969-3.9258-0.37109-5.5273 0.82422z" fill="#ffd02f"/><path d="m261.51 512c-4.082 0-7.3906-3.3086-7.3906-7.3906 0-57.23 22.832-95.922 41.984-118.3 20.828-24.332 41.613-35.023 42.488-35.469 3.6406-1.8477 8.0898-0.39063 9.9336 3.2539 1.8438 3.6367 0.39453 8.0781-3.2422 9.9297-0.3125 0.16016-19.5 10.164-38.367 32.395-25.227 29.719-38.016 66.121-38.016 108.2 0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#ff4e61"/><path d="m102.86 397.35 11.766 15.605c3.0547 4.0469 9.2852 2.7305 10.547-2.2266l4.8633-19.113c0.5-1.9648 1.9102-3.5547 3.7695-4.2461l18.039-6.707c4.6797-1.7383 5.3906-8.25 1.207-11.016l-16.141-10.672c-1.6602-1.1016-2.6914-2.9726-2.7578-5.0039l-0.61719-19.75c-0.15625-5.1211-5.9492-7.832-9.7969-4.5859l-14.84 12.516c-1.5312 1.2891-3.5781 1.7227-5.4726 1.1562l-18.422-5.5c-4.7773-1.4258-9.0703 3.4102-7.2617 8.1836l6.9688 18.41c0.71875 1.8945 0.48438 4.0352-0.625 5.7188l-10.77 16.348c-2.793 4.2422 0.34375 9.9375 5.3125 9.6445l19.145-1.1406c1.9727-0.11719 3.875 0.77343 5.0859 2.3789z" fill="#ffd02f"/><path d="m179.02 512c-4.082 0-7.3906-3.3086-7.3906-7.3906 0-30.059-6.6797-57.559-19.852-81.734-1.9531-3.5859-0.62891-8.0742 2.957-10.027 3.5859-1.9531 8.0742-0.62891 10.027 2.9531 14.363 26.375 21.648 56.254 21.648 88.809 0 4.082-3.3086 7.3906-7.3906 7.3906z" fill="#fa0"/><path d="m268.93 55.898c0-11.285-8.8828-20.434-19.836-20.434-10.957 0-19.836 9.1484-19.836 20.434 0 11.285 8.8789 20.438 19.836 20.438 10.953 0 19.836-9.1523 19.836-20.438z" fill="#ffd02f"/><path d="m373.08 446.81c0-11.285-8.8789-20.434-19.832-20.434-10.957 0-19.836 9.1484-19.836 20.434s8.8789 20.434 19.836 20.434c10.953 0 19.832-9.1484 19.832-20.434z" fill="#5c73bc"/><path d="m44.129 450.86c0-9.0508-7.1211-16.387-15.91-16.387-8.7852 0-15.906 7.3359-15.906 16.387 0 9.0547 7.1211 16.391 15.906 16.391 8.7891 0 15.91-7.3359 15.91-16.391z" fill="#62d38f"/><path d="m88.172 288.35c0-9.0508-7.1211-16.387-15.91-16.387-8.7852 0-15.906 7.3359-15.906 16.387s7.1211 16.391 15.906 16.391c8.7891 0 15.91-7.3398 15.91-16.391z" fill="#5c73bc"/><g fill="#ff4e61"><path d="m210.84 16.391c0-9.0547-7.1211-16.391-15.906-16.391-8.7891 0-15.91 7.3359-15.91 16.391 0 9.0508 7.1211 16.387 15.91 16.387 8.7852 0 15.906-7.3359 15.906-16.387z"/><path d="m365.23 152.88c0-9.0508-7.125-16.391-15.91-16.391-8.7852 0-15.91 7.3398-15.91 16.391s7.125 16.387 15.91 16.387c8.7852 0 15.91-7.3359 15.91-16.387z"/><path d="m139.96 32.746c-1.8555 0-3.7109-0.69141-5.1484-2.0898-2.9297-2.8438-3-7.5195-0.15625-10.449l9.1914-9.4688c2.8438-2.9297 7.5234-3 10.449-0.15625 2.9297 2.8438 3 7.5234 0.15625 10.453l-9.1875 9.4688c-1.4492 1.4922-3.3789 2.2422-5.3047 2.2422z"/></g></g></svg>
diff --git a/lib/layout/board.dart b/lib/layout/board.dart
index fcc8806..d68a621 100644
--- a/lib/layout/board.dart
+++ b/lib/layout/board.dart
@@ -9,16 +9,14 @@ import '../utils/board_utils.dart';
 class Board {
 
   static Container buildGameBoard(Data myProvider) {
-    Color borderColor = BoardUtils.checkBoardIsSolved(myProvider) ? Colors.green : Colors.orange;
-
     return Container(
       margin: EdgeInsets.all(2),
       padding: EdgeInsets.all(2),
       decoration: BoxDecoration(
-        color: borderColor,
+        color: Colors.black,
         borderRadius: BorderRadius.circular(2),
         border: Border.all(
-          color: borderColor,
+          color: Colors.black,
           width: 2,
         ),
       ),
diff --git a/lib/layout/game.dart b/lib/layout/game.dart
index 60f7727..9c9275a 100644
--- a/lib/layout/game.dart
+++ b/lib/layout/game.dart
@@ -6,6 +6,7 @@ import '../entities/cell.dart';
 import '../layout/board.dart';
 import '../provider/data.dart';
 import '../utils/board_utils.dart';
+import '../utils/game_utils.dart';
 
 class Game {
 
@@ -17,7 +18,7 @@ class Game {
         children: [
           Board.buildGameBoard(myProvider),
           SizedBox(height: 2),
-          Game.buildSelectCellValueBar(myProvider)
+          BoardUtils.checkBoardIsSolved(myProvider) ? Game.buildWinMessage(myProvider) : Game.buildSelectCellValueBar(myProvider),
         ],
       ),
     );
@@ -58,4 +59,51 @@ class Game {
     );
   }
 
+
+  static Container buildWinMessage(Data myProvider) {
+    return Container(
+      margin: EdgeInsets.all(2),
+      padding: EdgeInsets.all(2),
+
+      child: Table(
+        defaultColumnWidth: IntrinsicColumnWidth(),
+        children: [
+          TableRow(
+            children: [
+                Column(
+                  children: [
+                    Image(
+                      image: AssetImage('assets/icons/game_win.png'),
+                      fit: BoxFit.fill
+                    ),
+                  ]
+                ),
+                Column(
+                  children: [
+                    FlatButton(
+                      child: Container(
+                        child: Image(
+                          image: AssetImage('assets/icons/button_back.png'),
+                          fit: BoxFit.fill
+                        ),
+                      ),
+                      onPressed: () => GameUtils.resetGame(myProvider),
+                    ),
+                  ]
+                ),
+                Column(
+                  children: [
+                    Image(
+                      image: AssetImage('assets/icons/game_win.png'),
+                      fit: BoxFit.fill
+                    ),
+                  ]
+                ),
+            ],
+          ),
+        ]
+      )
+    );
+  }
+
 }
-- 
GitLab