From 300c7b2f837f4c81a52a5d3a7a6277d44d0f9a8b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beno=C3=AEt=20Harrault?= <benoit@harrault.fr>
Date: Fri, 2 Jul 2021 15:35:02 +0200
Subject: [PATCH] Add abstraction to allow other games

---
 android/gradle.properties                     |  4 +-
 .../metadata/android/en-US/changelogs/36.txt  |  1 +
 .../metadata/android/fr-FR/changelogs/36.txt  |  1 +
 lib/entities/moving_tile.dart                 | 93 +++++++++++++++++++
 lib/entities/tile.dart                        | 67 +------------
 lib/provider/data.dart                        |  4 +-
 lib/screens/home.dart                         | 24 ++---
 7 files changed, 113 insertions(+), 81 deletions(-)
 create mode 100644 fastlane/metadata/android/en-US/changelogs/36.txt
 create mode 100644 fastlane/metadata/android/fr-FR/changelogs/36.txt
 create mode 100644 lib/entities/moving_tile.dart

diff --git a/android/gradle.properties b/android/gradle.properties
index 32638a3..1f1e18f 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.35
-app.versionCode=35
+app.versionName=0.0.36
+app.versionCode=36
diff --git a/fastlane/metadata/android/en-US/changelogs/36.txt b/fastlane/metadata/android/en-US/changelogs/36.txt
new file mode 100644
index 0000000..33e10a2
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/36.txt
@@ -0,0 +1 @@
+Add abstraction to allow other games implementation.
diff --git a/fastlane/metadata/android/fr-FR/changelogs/36.txt b/fastlane/metadata/android/fr-FR/changelogs/36.txt
new file mode 100644
index 0000000..d2ec7c4
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/36.txt
@@ -0,0 +1 @@
+Ajout d'abstraction pour permettre l'implémentation d'autres jeux.
diff --git a/lib/entities/moving_tile.dart b/lib/entities/moving_tile.dart
new file mode 100644
index 0000000..cdcc109
--- /dev/null
+++ b/lib/entities/moving_tile.dart
@@ -0,0 +1,93 @@
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+
+import 'tile.dart';
+import '../provider/data.dart';
+
+class MovingTile extends Tile {
+  int currentCol;
+  int currentRow;
+
+  MovingTile(
+    image,
+    size,
+    originalCol,
+    originalRow,
+    this.currentCol,
+    this.currentRow
+  ): super(
+    image,
+    size,
+    originalCol,
+    originalRow
+  );
+
+  Container _tileWidget() {
+    return Container(
+      decoration: BoxDecoration(
+        color: Colors.black,
+        border: Border.all(
+          color: Colors.black,
+          width: 1,
+        ),
+      ),
+      child: Image(
+        image: this.image.image,
+        width: this.size,
+        height: this.size,
+        fit: BoxFit.fill
+      ),
+    );
+  }
+
+  Container widget(Data myProvider) {
+    return Container(
+      child: DragTarget<List<int>>(
+        builder: (
+          BuildContext context,
+          List<dynamic> accepted,
+          List<dynamic> rejected,
+        ) {
+          return Container(
+            height: this.size,
+            width: this.size,
+            color: Colors.cyan,
+            child: Draggable<List<int>>(
+              data: [
+                this.currentCol,
+                this.currentRow,
+              ],
+
+              // Widget when draggable is stationary
+              child: this._tileWidget(),
+
+              // Widget when draggable is being dragged
+              feedback: this._tileWidget(),
+
+              // Widget to display on original place when being dragged
+              childWhenDragging: Container(
+                height: this.size,
+                width: this.size,
+                color: Colors.pinkAccent,
+              ),
+            ),
+          );
+        },
+        onAccept: (List<int> data) {
+          myProvider.swapTiles(
+            [this.currentCol, this.currentRow],
+            data
+          );
+        },
+      )
+    );
+  }
+
+  bool isCorrect() {
+    return (
+      (this.currentRow == this.originalRow)
+      &&
+      (this.currentCol == this.originalCol)
+    );
+  }
+}
diff --git a/lib/entities/tile.dart b/lib/entities/tile.dart
index e60d059..cab77ec 100644
--- a/lib/entities/tile.dart
+++ b/lib/entities/tile.dart
@@ -3,81 +3,22 @@ import 'package:provider/provider.dart';
 
 import '../provider/data.dart';
 
-class Tile {
+class Tile{
   final Image image;
   final double size;
-  int currentCol;
-  int currentRow;
   final int originalCol;
   final int originalRow;
 
   Tile(
     @required this.image,
     @required this.size,
-    @required this.currentCol,
-    @required this.currentRow,
     @required this.originalCol,
     @required this.originalRow,
   );
 
-  Container _tileWidget() {
-    return Container(
-      decoration: BoxDecoration(
-        color: Colors.black,
-        border: Border.all(
-          color: Colors.black,
-          width: 1,
-        ),
-      ),
-      child: Image(
-        image: this.image.image,
-        width: this.size,
-        height: this.size,
-        fit: BoxFit.fill
-      ),
-    );
-  }
-
   Container widget(Data myProvider) {
-    return Container(
-      child: DragTarget<List<int>>(
-        builder: (
-          BuildContext context,
-          List<dynamic> accepted,
-          List<dynamic> rejected,
-        ) {
-          return Container(
-            height: this.size,
-            width: this.size,
-            color: Colors.cyan,
-            child: Draggable<List<int>>(
-              data: [
-                this.currentCol,
-                this.currentRow,
-              ],
-
-              // Widget when draggable is stationary
-              child: this._tileWidget(),
-
-              // Widget when draggable is being dragged
-              feedback: this._tileWidget(),
-
-              // Widget to display on original place when being dragged
-              childWhenDragging: Container(
-                height: this.size,
-                width: this.size,
-                color: Colors.pinkAccent,
-              ),
-            ),
-          );
-        },
-        onAccept: (List<int> data) {
-          myProvider.swapTiles(
-            [this.currentCol, this.currentRow],
-            data
-          );
-        },
-      )
-    );
+    return Container();
   }
+
+  bool isCorrect() {}
 }
diff --git a/lib/provider/data.dart b/lib/provider/data.dart
index a7571bc..8255353 100644
--- a/lib/provider/data.dart
+++ b/lib/provider/data.dart
@@ -1,6 +1,6 @@
 import 'package:flutter/foundation.dart';
 
-import '../entities/tile.dart';
+import '../entities/moving_tile.dart';
 
 class Data extends ChangeNotifier {
 
@@ -62,7 +62,7 @@ class Data extends ChangeNotifier {
     int indexTile1 = _tiles.indexWhere((tile) => ((tile.currentCol == tile1[0]) && (tile.currentRow == tile1[1])));
     int indexTile2 = _tiles.indexWhere((tile) => ((tile.currentCol == tile2[0]) && (tile.currentRow == tile2[1])));
 
-    Tile swap = _tiles[indexTile1];
+    MovingTile swap = _tiles[indexTile1];
     _tiles[indexTile1] = _tiles[indexTile2];
     _tiles[indexTile2] = swap;
 
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index d6ba0ef..783b1b8 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -8,6 +8,7 @@ import 'package:image/image.dart' as imglib;
 import 'package:provider/provider.dart';
 
 import '../entities/tile.dart';
+import '../entities/moving_tile.dart';
 import '../provider/data.dart';
 import '../utils/get_images_list.dart';
 
@@ -141,7 +142,7 @@ class Home extends StatelessWidget {
     );
   }
 
-  List<Tile> shuffleTiles(List<Tile> tiles) {
+  List<MovingTile> shuffleMovingTiles(List<MovingTile> tiles) {
     var random = new Random();
     int tilesCount = tiles.length;
 
@@ -149,7 +150,7 @@ class Home extends StatelessWidget {
       int indexTile1 = random.nextInt(tilesCount);
       int indexTile2 = random.nextInt(tilesCount);
 
-      Tile swap = tiles[indexTile1];
+      MovingTile swap = tiles[indexTile1];
       tiles[indexTile1] = tiles[indexTile2];
       tiles[indexTile2] = swap;
 
@@ -176,11 +177,11 @@ class Home extends StatelessWidget {
     int width = (image.width / myProvider.tilesCount).round();
     int height = (image.height / myProvider.tilesCount).round();
 
-    List<Tile> tiles = List<Tile>();
+    List<MovingTile> tiles = List<MovingTile>();
     for (int i = 0; i < myProvider.tilesCount; i++) {
       for (int j = 0; j < myProvider.tilesCount; j++) {
         tiles.add(
-          Tile(
+          MovingTile(
             Image.memory(
               imglib.encodeJpg(
                 imglib.copyCrop(image, x, y, width, height)
@@ -198,28 +199,23 @@ class Home extends StatelessWidget {
       y += height;
     }
 
-    myProvider.updateTiles = shuffleTiles(tiles);
+    myProvider.updateTiles = shuffleMovingTiles(tiles);
     myProvider.updateIsShufflingBoard = false;
   }
 
-  bool _checkTilesetIsOrdered(List<Tile> tiles) {
+  bool _checkTilesetIsCleared(List<Tile> tiles) {
     for (Tile tile in tiles) {
-      if (
-        (tile.currentRow != tile.originalRow)
-        ||
-        (tile.currentCol != tile.originalCol)
-      ) {
+      if (!tile.isCorrect()) {
         return false;
       }
     }
-
     return true;
   }
 
   Container _buildTilesetWidget(Data myProvider) {
     List tiles = myProvider.tiles;
 
-    Color borderColor = _checkTilesetIsOrdered(tiles) ? Colors.green : Colors.orange;
+    Color borderColor = _checkTilesetIsCleared(tiles) ? Colors.green : Colors.orange;
     int tileIndex = 0;
 
     Table tileset = Table(
@@ -292,7 +288,7 @@ class Home extends StatelessWidget {
         children: [
           _buildTilesetWidget(myProvider),
           SizedBox(height: 20),
-          _checkTilesetIsOrdered(myProvider.tiles) ? _buildWinMessage(myProvider) : _buildTipWidget(myProvider),
+          _checkTilesetIsCleared(myProvider.tiles) ? _buildWinMessage(myProvider) : _buildTipWidget(myProvider),
         ],
       ),
     );
-- 
GitLab