diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 2190b0d63c46da1cfa094f94d66f704f857b1b02..dc15ee628f7177a580ef98e422d9dca8c4eeda7a 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index f415ae518ea5e1a78a4b331c77645910a0ad747a..529e815fd61d038c1926597ca22107698db91d5c 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 834b9e159e8fe99f414b3521fe00cc3a2442d0c4..6e418ccb8c0113202ff7aa87e81df01520f7c8a4 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 4f3ecfdb31e77bbcddd5de725013e9d93ef249ca..02a4bb425d3643216956ee9dada28b3f82f65732 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 8a46c7dd21392d2da3157b2a8819b0cee05645bc..03c4f788b5ffb1b704e31a38c96561ff33bfb218 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/gradle.properties b/android/gradle.properties index 39095cdb7e3dfda047b9a1377b98f5bd5264f096..ba519afb93ab69c86196532ef532b852aa7544ef 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.1.1 -app.versionCode=22 +app.versionName=0.1.2 +app.versionCode=23 diff --git a/assets/icons/button_back.png b/assets/icons/button_back.png index 2a802ff2d2bc0c90488a1c319288be9f28cdea5e..cc48ffb1dbb653d9a996f139dfbe02969724bfa5 100644 Binary files a/assets/icons/button_back.png and b/assets/icons/button_back.png differ diff --git a/assets/icons/button_start.png b/assets/icons/button_start.png index 0a3b74a3b98f45de590a7f290b810daba7120912..6845e2f5c21598ab61f1684d2075aeec0334bf23 100644 Binary files a/assets/icons/button_start.png and b/assets/icons/button_start.png differ diff --git a/assets/icons/game_fail.png b/assets/icons/game_fail.png index e93f8fa2815c0bac52c52a719f296671ac841e08..7b44ea172df6a8652ef54713161cb78feaf48c36 100644 Binary files a/assets/icons/game_fail.png and b/assets/icons/game_fail.png differ diff --git a/assets/icons/game_win.png b/assets/icons/game_win.png index d73741df40e8cb97e2bf0eec929bba2e7859459a..876334279c1711b349a62131a33607eecf924eb6 100644 Binary files a/assets/icons/game_win.png and b/assets/icons/game_win.png differ diff --git a/assets/icons/difficulty_easy.png b/assets/icons/level_easy.png similarity index 100% rename from assets/icons/difficulty_easy.png rename to assets/icons/level_easy.png diff --git a/assets/icons/difficulty_hard.png b/assets/icons/level_hard.png similarity index 100% rename from assets/icons/difficulty_hard.png rename to assets/icons/level_hard.png diff --git a/assets/icons/difficulty_medium.png b/assets/icons/level_medium.png similarity index 100% rename from assets/icons/difficulty_medium.png rename to assets/icons/level_medium.png diff --git a/assets/icons/difficulty_nightmare.png b/assets/icons/level_nightmare.png similarity index 100% rename from assets/icons/difficulty_nightmare.png rename to assets/icons/level_nightmare.png diff --git a/assets/icons/skin_default.png b/assets/icons/skin_default.png new file mode 100644 index 0000000000000000000000000000000000000000..43dc59805c9f2d9d171b9e54bdccb8c82728d18b Binary files /dev/null and b/assets/icons/skin_default.png differ diff --git a/assets/skins/empty.png b/assets/skins/default_empty.png similarity index 62% rename from assets/skins/empty.png rename to assets/skins/default_empty.png index 586de0573e7f77d97c16942f603b8ee6d9c7d7bc..ccf68cb815852c4470ac3239588c86755459b0f1 100644 Binary files a/assets/skins/empty.png and b/assets/skins/default_empty.png differ diff --git a/assets/skins/default_tile_0.png b/assets/skins/default_tile_0.png index 586de0573e7f77d97c16942f603b8ee6d9c7d7bc..ccf68cb815852c4470ac3239588c86755459b0f1 100644 Binary files a/assets/skins/default_tile_0.png and b/assets/skins/default_tile_0.png differ diff --git a/assets/skins/default_tile_1.png b/assets/skins/default_tile_1.png index 23690a6cd9133c42af5c1222b19634639f041572..ce1226bde73c449735d59f05d07bb1457bb75e76 100644 Binary files a/assets/skins/default_tile_1.png and b/assets/skins/default_tile_1.png differ diff --git a/assets/skins/default_tile_2.png b/assets/skins/default_tile_2.png index ec9272a8c8476f89c5abfb7c0155ee425c861dd5..e4273c6736467fdec9648ef028a55c3df8d3c1d8 100644 Binary files a/assets/skins/default_tile_2.png and b/assets/skins/default_tile_2.png differ diff --git a/assets/skins/default_tile_3.png b/assets/skins/default_tile_3.png index 9f546a2f252a142b1947ab99cab5fcd01abfbef4..a31c05d5f181510b08eccbab0e1934a110032fba 100644 Binary files a/assets/skins/default_tile_3.png and b/assets/skins/default_tile_3.png differ diff --git a/assets/skins/default_tile_4.png b/assets/skins/default_tile_4.png index 007939df9809ddaab453b71efcbe4e611d08810d..c52c163bf2c8f601112d64a46aed8d6ec482b35e 100644 Binary files a/assets/skins/default_tile_4.png and b/assets/skins/default_tile_4.png differ diff --git a/assets/skins/default_tile_5.png b/assets/skins/default_tile_5.png index 39231465aa288a4fca4f6a8b30d66d6eab6cb90a..b121af0436b0b389f5cfe3aa2a90d53e90ccc163 100644 Binary files a/assets/skins/default_tile_5.png and b/assets/skins/default_tile_5.png differ diff --git a/assets/skins/default_tile_6.png b/assets/skins/default_tile_6.png index 567407e037578be6f15251e0f101936794a48701..72991dd3f088a90a8b66fecbaffe3981917c2c49 100644 Binary files a/assets/skins/default_tile_6.png and b/assets/skins/default_tile_6.png differ diff --git a/assets/skins/default_tile_7.png b/assets/skins/default_tile_7.png index 0687e540437da95f865fc7df85d98df478b68f20..da6ac1f0e936083d1de5e16585446a7cffa5fe7e 100644 Binary files a/assets/skins/default_tile_7.png and b/assets/skins/default_tile_7.png differ diff --git a/assets/skins/default_tile_8.png b/assets/skins/default_tile_8.png index 45fa69284816659672cea66e446ea9de00c37755..ed3ee8a1ddcd7a88ae88c49dd7cef4b900699313 100644 Binary files a/assets/skins/default_tile_8.png and b/assets/skins/default_tile_8.png differ diff --git a/assets/skins/default_tile_flag.png b/assets/skins/default_tile_flag.png index 15f2f2f76b687665b134492e44acaef589850bd2..26a6d87c8db47a1f4f810b7427802e412098f42c 100644 Binary files a/assets/skins/default_tile_flag.png and b/assets/skins/default_tile_flag.png differ diff --git a/assets/skins/default_tile_flag_ko.png b/assets/skins/default_tile_flag_ko.png index 9e8598af1fd30b3c1bdf524bd815b18d3d1ef9c6..3d4a2394a98b8cd33b08179acd9110363ee60f69 100644 Binary files a/assets/skins/default_tile_flag_ko.png and b/assets/skins/default_tile_flag_ko.png differ diff --git a/assets/skins/default_tile_flag_ok.png b/assets/skins/default_tile_flag_ok.png index 6f87550f930b4ae093d7620d4616f51a4f1139fc..ebed430a242c8737cc0e0e9ab22a4e4cbd7e1ed5 100644 Binary files a/assets/skins/default_tile_flag_ok.png and b/assets/skins/default_tile_flag_ok.png differ diff --git a/assets/skins/default_tile_mine.png b/assets/skins/default_tile_mine.png index 044c7333ce662fb1f15217d55376e8f751975fb0..59bf2cad7dc992c70663f20c2e0e4475b75afe9e 100644 Binary files a/assets/skins/default_tile_mine.png and b/assets/skins/default_tile_mine.png differ diff --git a/assets/skins/default_tile_mine_not_found.png b/assets/skins/default_tile_mine_not_found.png index 0c27686a2a9428932261ed88254e76bfb78a2385..30cf53bad717999638460361163b9c7de5b16faf 100644 Binary files a/assets/skins/default_tile_mine_not_found.png and b/assets/skins/default_tile_mine_not_found.png differ diff --git a/fastlane/metadata/android/en-US/changelogs/23.txt b/fastlane/metadata/android/en-US/changelogs/23.txt new file mode 100644 index 0000000000000000000000000000000000000000..d316a3a9e2cd0814c079bd68b869092285f5edbd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/23.txt @@ -0,0 +1 @@ +Upgrade flutter framework and dependencies, update/clean code, improve layout diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png new file mode 100644 index 0000000000000000000000000000000000000000..d94cd4c48e61c0b2a131b828585ef141878cbe03 Binary files /dev/null and b/fastlane/metadata/android/en-US/images/featureGraphic.png differ diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png index a8cff21a3902028c01974a4f3062e10c15544ee9..cab28c740485b7246719d8d443bbf4a403c2955e 100644 Binary files a/fastlane/metadata/android/en-US/images/icon.png and b/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/fastlane/metadata/android/fr-FR/changelogs/23.txt b/fastlane/metadata/android/fr-FR/changelogs/23.txt new file mode 100644 index 0000000000000000000000000000000000000000..830875451ccfb7d1252c5566031e61457141844c --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/23.txt @@ -0,0 +1 @@ +Mise à jour du framework Flutter et de ses dépendances, améliorations de code et d'affichage diff --git a/icons/build_application_icons.sh b/icons/build_application_icons.sh index 569a16a50dd3015a45c291a93305ff0f67f77c72..d6f1696bb114b1713bc49f5e88b27ea89607768e 100755 --- a/icons/build_application_icons.sh +++ b/icons/build_application_icons.sh @@ -9,8 +9,20 @@ CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" BASE_DIR="$(dirname "${CURRENT_DIR}")" SOURCE="${CURRENT_DIR}/icon.svg" +SOURCE_FASTLANE="${CURRENT_DIR}/featureGraphic.svg" + OPTIPNG_OPTIONS="-preserve -quiet -o7" +if [ ! -f "${SOURCE}" ]; then + echo "Missing file: ${SOURCE}" + exit 1 +fi + +if [ ! -f "${SOURCE_FASTLANE}" ]; then + echo "Missing file: ${SOURCE_FASTLANE}" + exit 1 +fi + # optimize svg cp ${SOURCE} ${SOURCE}.tmp scour \ @@ -19,6 +31,7 @@ scour \ --enable-viewboxing \ --enable-comment-stripping \ --nindent=4 \ + --quiet \ -i ${SOURCE}.tmp \ -o ${SOURCE} rm ${SOURCE}.tmp @@ -28,6 +41,8 @@ function build_icon() { ICON_SIZE="$1" TARGET="$2" + echo "Building ${TARGET}" + TARGET_PNG="${TARGET}.png" inkscape \ @@ -39,6 +54,36 @@ function build_icon() { optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG} } +# build fastlane image +function build_fastlane_image() { + WIDTH="$1" + HEIGHT="$2" + TARGET="$3" + + echo "Building ${TARGET}" + + cp ${SOURCE_FASTLANE} ${SOURCE_FASTLANE}.tmp + scour \ + --remove-descriptive-elements \ + --enable-id-stripping \ + --enable-viewboxing \ + --enable-comment-stripping \ + --nindent=4 \ + --quiet \ + -i ${SOURCE_FASTLANE}.tmp \ + -o ${SOURCE_FASTLANE} + rm ${SOURCE_FASTLANE}.tmp + + TARGET_PNG="${TARGET}.png" + + inkscape \ + --export-width=${WIDTH} \ + --export-height=${HEIGHT} \ + --export-filename=${TARGET_PNG} \ + ${SOURCE_FASTLANE} + + optipng ${OPTIPNG_OPTIONS} ${TARGET_PNG} +} build_icon 72 ${BASE_DIR}/android/app/src/main/res/mipmap-hdpi/ic_launcher build_icon 48 ${BASE_DIR}/android/app/src/main/res/mipmap-mdpi/ic_launcher @@ -46,3 +91,5 @@ build_icon 96 ${BASE_DIR}/android/app/src/main/res/mipmap-xhdpi/ic_launcher build_icon 144 ${BASE_DIR}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher build_icon 192 ${BASE_DIR}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher build_icon 512 ${BASE_DIR}/fastlane/metadata/android/en-US/images/icon + +build_fastlane_image 1024 500 ${BASE_DIR}/fastlane/metadata/android/en-US/images/featureGraphic diff --git a/icons/build_game_icons.sh b/icons/build_game_icons.sh index c57007a1e5f24a31a3900295cb5af3190164cc35..b3b2c88f5f94ae6d9b4181af5aed406c0a21dca9 100755 --- a/icons/build_game_icons.sh +++ b/icons/build_game_icons.sh @@ -7,8 +7,55 @@ command -v optipng >/dev/null 2>&1 || { echo >&2 "I require optipng but it's not CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" BASE_DIR="$(dirname "${CURRENT_DIR}")" +ASSETS_DIR="${BASE_DIR}/assets" OPTIPNG_OPTIONS="-preserve -quiet -o7" +ICON_SIZE=192 + +####################################################### + +# Game images +AVAILABLE_GAME_IMAGES=" + button_back + button_start + game_fail + game_win +" + +# Settings images +AVAILABLES_GAME_SETTINGS=" + level:easy,medium,hard,nightmare + size:10x10,15x15,20x20 +" + +# Skins +AVAILABLE_SKINS=" + default +" + +# Images per skin +SKIN_IMAGES=" + empty + tile_0 + tile_1 + tile_2 + tile_3 + tile_4 + tile_5 + tile_6 + tile_7 + tile_8 + tile_flag_ko + tile_flag_ok + tile_flag + tile_mine_not_found + tile_mine + tile_unknown + button_mark_mine_on + button_mark_mine_off +" + +####################################################### # optimize svg function optimize_svg() { @@ -21,6 +68,7 @@ function optimize_svg() { --enable-viewboxing \ --enable-comment-stripping \ --nindent=4 \ + --quiet \ -i ${SOURCE}.tmp \ -o ${SOURCE} rm ${SOURCE}.tmp @@ -28,10 +76,16 @@ function optimize_svg() { # build icons function build_icon() { - ICON_SIZE=192 SOURCE="$1" TARGET="$2" + echo "Building ${TARGET}" + + if [ ! -f "${SOURCE}" ]; then + echo "Missing file: ${SOURCE}" + exit 1 + fi + optimize_svg "${SOURCE}" inkscape \ @@ -43,46 +97,56 @@ function build_icon() { optipng ${OPTIPNG_OPTIONS} ${TARGET} } -function build_icons_for_skin() { - SKIN_CODE="$1" +function build_settings_icons() { + INPUT_STRING="$1" - build_icon_for_skin ${SKIN_CODE} button_mark_mine_on - build_icon_for_skin ${SKIN_CODE} button_mark_mine_off + SETTING_NAME="$(echo "${INPUT_STRING}" | cut -d":" -f1)" + SETTING_VALUES="$(echo "${INPUT_STRING}" | cut -d":" -f2 | tr "," " ")" - build_icon_for_skin ${SKIN_CODE} tile_mine - build_icon_for_skin ${SKIN_CODE} tile_mine_not_found - - build_icon_for_skin ${SKIN_CODE} tile_flag - build_icon_for_skin ${SKIN_CODE} tile_flag_ok - build_icon_for_skin ${SKIN_CODE} tile_flag_ko - - build_icon_for_skin ${SKIN_CODE} tile_unknown - for VALUE in {0..8}; + for SETTING_VALUE in ${SETTING_VALUES} do - build_icon_for_skin ${SKIN_CODE} tile_${VALUE} + SETTING_CODE="${SETTING_NAME}_${SETTING_VALUE}" + build_icon ${CURRENT_DIR}/${SETTING_CODE}.svg ${ASSETS_DIR}/icons/${SETTING_CODE}.png done } function build_icon_for_skin() { SKIN_CODE="$1" - IMAGE_CODE="$2" - build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/${IMAGE_CODE}.svg ${BASE_DIR}/assets/skins/${SKIN_CODE}_${IMAGE_CODE}.png -} + # skin main image + build_icon ${CURRENT_DIR}/skin_${SKIN_CODE}.svg ${ASSETS_DIR}/icons/skin_${SKIN_CODE}.png -# Game icons -build_icon ${CURRENT_DIR}/button_back.svg ${BASE_DIR}/assets/icons/button_back.png -build_icon ${CURRENT_DIR}/button_start.svg ${BASE_DIR}/assets/icons/button_start.png -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}/difficulty_nightmare.svg ${BASE_DIR}/assets/icons/difficulty_nightmare.png -build_icon ${CURRENT_DIR}/game_fail.svg ${BASE_DIR}/assets/icons/game_fail.png -build_icon ${CURRENT_DIR}/game_win.svg ${BASE_DIR}/assets/icons/game_win.png -build_icon ${CURRENT_DIR}/size_10x10.svg ${BASE_DIR}/assets/icons/size_10x10.png -build_icon ${CURRENT_DIR}/size_15x15.svg ${BASE_DIR}/assets/icons/size_15x15.png -build_icon ${CURRENT_DIR}/size_20x20.svg ${BASE_DIR}/assets/icons/size_20x20.png -build_icon ${CURRENT_DIR}/skins/empty.svg ${BASE_DIR}/assets/skins/empty.png + # skin images + for SKIN_IMAGE in ${SKIN_IMAGES} + do + build_icon ${CURRENT_DIR}/skins/${SKIN_CODE}/${SKIN_IMAGE}.svg ${ASSETS_DIR}/skins/${SKIN_CODE}_${SKIN_IMAGE}.png + done +} -# Skins -build_icons_for_skin "default" +####################################################### + +# Create output folders +mkdir -p ${ASSETS_DIR}/icons +mkdir -p ${ASSETS_DIR}/skins + +# Delete existing generated images +find ${ASSETS_DIR}/icons -type f -name "*.png" -delete +find ${ASSETS_DIR}/skins -type f -name "*.png" -delete + +# build game images +for GAME_IMAGE in ${AVAILABLE_GAME_IMAGES} +do + build_icon ${CURRENT_DIR}/${GAME_IMAGE}.svg ${ASSETS_DIR}/icons/${GAME_IMAGE}.png +done + +# build settings images +for GAME_SETTING in ${AVAILABLES_GAME_SETTINGS} +do + build_settings_icons "${GAME_SETTING}" +done + +# build skins images +for SKIN in ${AVAILABLE_SKINS} +do + build_icon_for_skin "${SKIN}" +done diff --git a/icons/featureGraphic.svg b/icons/featureGraphic.svg new file mode 100644 index 0000000000000000000000000000000000000000..2033f317c082bce27115e88ca068d358b08318d0 --- /dev/null +++ b/icons/featureGraphic.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 1024 500" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect width="1024" height="500" rx="0" ry="0" fill="#977cff"/></svg> diff --git a/icons/difficulty_easy.svg b/icons/level_easy.svg similarity index 100% rename from icons/difficulty_easy.svg rename to icons/level_easy.svg diff --git a/icons/difficulty_hard.svg b/icons/level_hard.svg similarity index 100% rename from icons/difficulty_hard.svg rename to icons/level_hard.svg diff --git a/icons/difficulty_medium.svg b/icons/level_medium.svg similarity index 100% rename from icons/difficulty_medium.svg rename to icons/level_medium.svg diff --git a/icons/difficulty_nightmare.svg b/icons/level_nightmare.svg similarity index 100% rename from icons/difficulty_nightmare.svg rename to icons/level_nightmare.svg diff --git a/icons/skin_default.svg b/icons/skin_default.svg new file mode 100644 index 0000000000000000000000000000000000000000..bb34f915009a3b22734bec8c85090bcb036d3e63 --- /dev/null +++ b/icons/skin_default.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 102 102" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><rect x="1" y="1" width="100" height="100" ry="0" fill="#a4a4a4" stroke="#000" stroke-width="2"/><rect x="-15.387" y="-20.515" width="100" height="100" ry="2" fill="none"/></svg> diff --git a/icons/skins/empty.svg b/icons/skins/default/empty.svg similarity index 100% rename from icons/skins/empty.svg rename to icons/skins/default/empty.svg diff --git a/lib/entities/cell.dart b/lib/entities/cell.dart index 394ea51f348e7e37ecd84cfe9c9e1ece33d82e03..e4ad3b2faded8e7947ed38124128f247cc76cdf8 100644 --- a/lib/entities/cell.dart +++ b/lib/entities/cell.dart @@ -67,7 +67,7 @@ class Cell { * Compute image asset name, from skin and cell value/state */ String getImageAssetName(Data myProvider) { - String imageAsset = 'assets/skins/' + myProvider.skin + '_tile_unknown.png'; + String imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_unknown.png'; bool showSolution = myProvider.gameWin || myProvider.gameFail; if (!showSolution) { @@ -75,15 +75,15 @@ class Cell { if (this.isExplored) { if (this.isMined) { // Boom - imageAsset = 'assets/skins/' + myProvider.skin + '_tile_mine.png'; + imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine.png'; } else { // Show mines count around - imageAsset = 'assets/skins/' + myProvider.skin + '_tile_' + this.minesCountAround.toString() + '.png'; + imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_' + this.minesCountAround.toString() + '.png'; } } else { if (this.isMarked) { // Danger! - imageAsset = 'assets/skins/' + myProvider.skin + '_tile_flag.png'; + imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_flag.png'; } } } else { @@ -91,14 +91,14 @@ class Cell { if (this.isMined) { if (this.isExploded) { // Mine exploded - imageAsset = 'assets/skins/' + myProvider.skin + '_tile_mine.png'; + imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine.png'; } else { // Mine not found - imageAsset = 'assets/skins/' + myProvider.skin + '_tile_mine_not_found.png'; + imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_mine_not_found.png'; } } else { // Show all mines counts - imageAsset = 'assets/skins/' + myProvider.skin + '_tile_' + this.minesCountAround.toString() + '.png'; + imageAsset = 'assets/skins/' + myProvider.parameterSkin + '_tile_' + this.minesCountAround.toString() + '.png'; } } @@ -108,18 +108,18 @@ class Cell { // Compute cell background color, from cell state Color getBackgroundColor(Data myProvider) { if (myProvider.gameWin) { - return this.isAnimated ? Colors.green[400] : Colors.green[500]; + return this.isAnimated ? Colors.green.shade400 : Colors.green.shade500; } if (myProvider.gameFail) { - return this.isAnimated ? Colors.pink[200] : Colors.pink[400]; + return this.isAnimated ? Colors.pink.shade200 : Colors.pink.shade400; } - return this.isAnimated ? Colors.white : Colors.grey[200]; + return this.isAnimated ? Colors.white : Colors.grey.shade200; } // Compute cell borders, from board size and cell state Border getCellBorders(Data myProvider, int row, int col) { - Color cellBorderColor = Colors.grey[500]; + Color cellBorderColor = Colors.grey.shade500; double cellBorderWidth = 4; // Reduce cell border width on big boards @@ -132,9 +132,9 @@ class Cell { } if (myProvider.gameWin) { - cellBorderColor = Colors.green[700]; + cellBorderColor = Colors.green.shade700; } else if (myProvider.gameFail) { - cellBorderColor = Colors.pink[300]; + cellBorderColor = Colors.pink.shade300; } Border borders = Border.all( diff --git a/lib/layout/board.dart b/lib/layout/board.dart index 9e4df1e2df752496855747dc6d4cb51eab7c0362..bec58cad43e68d42dea6107b859547b533ebee06 100644 --- a/lib/layout/board.dart +++ b/lib/layout/board.dart @@ -6,11 +6,22 @@ import '../utils/board_utils.dart'; class Board { static Container buildGameBoard(Data myProvider) { - Color borderColor = myProvider.reportMode ? Colors.blue : Colors.black; - return Container( margin: EdgeInsets.all(2), padding: EdgeInsets.all(2), + child: Column( + children: [ + buildGameTileset(myProvider) + ], + ), + ); + } + + static Widget buildGameTileset(Data myProvider) { + List cells = myProvider.cells; + Color borderColor = myProvider.reportMode ? Colors.blue : Colors.black; + + return Container( decoration: BoxDecoration( color: borderColor, borderRadius: BorderRadius.circular(2), @@ -19,43 +30,33 @@ class Board { width: 2, ), ), - child: Column( + child: Table( + defaultColumnWidth: IntrinsicColumnWidth(), children: [ - buildGameTileset(myProvider), - buildMinesCounterWidget(myProvider), - ], + for (var row = 0; row < myProvider.sizeVertical; row++) + TableRow(children: [ + for (var col = 0; col < myProvider.sizeHorizontal; col++) + Column(children: [ + cells[row][col].widget( + myProvider, + row, + col + ) + ]), + ], + ), + ] ), ); } - static Table buildGameTileset(Data myProvider) { - List cells = myProvider.cells; - - return Table( - defaultColumnWidth: IntrinsicColumnWidth(), - children: [ - for (var row = 0; row < myProvider.sizeVertical; row++) - TableRow(children: [ - for (var col = 0; col < myProvider.sizeHorizontal; col++) - Column(children: [ - cells[row][col].widget( - myProvider, - row, - col - ) - ]), - ]), - ] - ); - } - static FlatButton buildToggleFlagModeButton(Data myProvider) { String reportModeSuffix = myProvider.reportMode ? 'on' : 'off'; return FlatButton( child: Container( child: Image( - image: AssetImage('assets/skins/' + myProvider.skin + '_button_mark_mine_' + reportModeSuffix + '.png'), + image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_button_mark_mine_' + reportModeSuffix + '.png'), fit: BoxFit.fill, ), ), @@ -63,9 +64,9 @@ class Board { ); } - static Table buildToggleFlagModeLayout(Data myProvider) { + static Widget buildToggleFlagModeLayout(Data myProvider) { Image paddingBlock = Image( - image: AssetImage('assets/skins/empty.png'), + image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_empty.png'), fit: BoxFit.fill, ); @@ -85,56 +86,4 @@ class Board { ); } - static Widget buildMinesCounterWidget(Data myProvider) { - int flaggedCellsCount = BoardUtils.countFlaggedCells(myProvider.cells); - int minesCount = myProvider.minesCount; - double blockSize = 40; - - Image flagIconBlock = Image( - image: AssetImage('assets/skins/' + myProvider.skin + '_tile_flag.png'), - fit: BoxFit.fill, - height: blockSize, - width: blockSize, - ); - Image mineIconBlock = Image( - image: AssetImage('assets/skins/' + myProvider.skin + '_tile_mine.png'), - fit: BoxFit.fill, - height: blockSize, - width: blockSize, - ); - Text markedMinesCountBlock = Text( - flaggedCellsCount.toString(), - style: TextStyle( - fontSize: blockSize, - fontWeight: FontWeight.bold, - color: Colors.white - ), - ); - Text placedMinesCountBlock = Text( - minesCount.toString(), - style: TextStyle( - fontSize: blockSize, - fontWeight: FontWeight.bold, - color: Colors.white - ), - ); - - return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - markedMinesCountBlock, - flagIconBlock, - SizedBox(width: blockSize * 2), - mineIconBlock, - placedMinesCountBlock, - ], - ) - ]); - } - } diff --git a/lib/layout/game.dart b/lib/layout/game.dart index 38e0c67aaa86bc8b3ecd12dc7ded54f273efd1c8..f57e986297bdd213919bc04352deab6d708827b9 100644 --- a/lib/layout/game.dart +++ b/lib/layout/game.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import '../layout/board.dart'; import '../provider/data.dart'; +import '../utils/board_utils.dart'; import '../utils/game_utils.dart'; class Game { @@ -14,16 +15,76 @@ class Game { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Board.buildGameBoard(myProvider), + SizedBox(height: 8), + Game.buildTopIndicatorWidget(myProvider), SizedBox(height: 2), - gameIsFinished - ? Game.buildEndGameMessage(myProvider) - : Board.buildToggleFlagModeLayout(myProvider) + Expanded( + child: Board.buildGameBoard(myProvider), + ), + SizedBox(height: 2), + Container( + child: gameIsFinished + ? Game.buildEndGameMessage(myProvider) + : Board.buildToggleFlagModeLayout(myProvider), + ), + SizedBox(height: 8), ], ), ); } + static Widget buildTopIndicatorWidget(Data myProvider) { + int flaggedCellsCount = BoardUtils.countFlaggedCells(myProvider.cells); + int minesCount = myProvider.minesCount; + double blockSize = 40; + + Image flagIconBlock = Image( + image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_tile_flag.png'), + fit: BoxFit.fill, + height: blockSize, + width: blockSize, + ); + Image mineIconBlock = Image( + image: AssetImage('assets/skins/' + myProvider.parameterSkin + '_tile_mine.png'), + fit: BoxFit.fill, + height: blockSize, + width: blockSize, + ); + Text markedMinesCountBlock = Text( + flaggedCellsCount.toString(), + style: TextStyle( + fontSize: blockSize, + fontWeight: FontWeight.bold, + color: Colors.black + ), + ); + Text placedMinesCountBlock = Text( + minesCount.toString(), + style: TextStyle( + fontSize: blockSize, + fontWeight: FontWeight.bold, + color: Colors.black + ), + ); + + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + markedMinesCountBlock, + flagIconBlock, + SizedBox(width: blockSize * 2), + mineIconBlock, + placedMinesCountBlock, + ], + ) + ]); + } + static FlatButton buildRestartGameButton(Data myProvider) { return FlatButton( child: Container( diff --git a/lib/layout/parameters.dart b/lib/layout/parameters.dart index 847290bf96fbb85e03833f45314e217a8c58489e..096510ebfa9faa01475e4bcbb4a30004d311de09 100644 --- a/lib/layout/parameters.dart +++ b/lib/layout/parameters.dart @@ -7,18 +7,27 @@ class Parameters { static Container buildParametersSelector(Data myProvider) { return Container( - padding: EdgeInsets.all(2), - margin: EdgeInsets.all(2), child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Parameters.buildParameterSelector(myProvider, 'difficulty'), SizedBox(height: 5), - Parameters.buildParameterSelector(myProvider, 'size'), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Parameters.buildParameterSelector(myProvider, 'level'), + SizedBox(height: 5), + Parameters.buildParameterSelector(myProvider, 'size'), + SizedBox(height: 5), + ], + ), + ), SizedBox(height: 5), - - Parameters.buildStartGameButton(myProvider), + Container( + child: Parameters.buildStartGameButton(myProvider), + ), ], ), ); @@ -65,9 +74,13 @@ class Parameters { ); } - static Table buildParameterSelector(Data myProvider, String parameterCode) { + static Widget buildParameterSelector(Data myProvider, String parameterCode) { List availableValues = myProvider.getParameterAvailableValues(parameterCode); + if (availableValues.length == 1) { + return SizedBox(height: 1); + } + return Table( defaultColumnWidth: IntrinsicColumnWidth(), children: [ @@ -85,15 +98,15 @@ class Parameters { ); } - static FlatButton _buildParameterButton(Data myProvider, String parameterCode, String parameterValue) { + static Widget _buildParameterButton(Data myProvider, String parameterCode, String parameterValue) { String currentValue = myProvider.getParameterValue(parameterCode).toString(); bool isActive = (parameterValue == currentValue); String imageAsset = 'assets/icons/' + parameterCode + '_' + parameterValue + '.png'; - return FlatButton( - padding: EdgeInsets.all(2), + return TextButton( child: Container( + padding: EdgeInsets.all(2), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10), diff --git a/lib/main.dart b/lib/main.dart index dd1afff2ab481d34fc88bd2e0751f294b17f42ed..7f448662ed2c1ea856492d67bacbf56f62d81c3a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; +import 'package:overlay_support/overlay_support.dart'; import 'provider/data.dart'; import 'screens/home.dart'; @@ -17,16 +18,18 @@ class MyApp extends StatelessWidget { return ChangeNotifierProvider( create: (BuildContext context) => Data(), child: Consumer<Data>(builder: (context, data, child) { - return MaterialApp( - debugShowCheckedModeBanner: false, - theme: ThemeData( - primaryColor: Colors.blue, - visualDensity: VisualDensity.adaptivePlatformDensity, + return OverlaySupport( + child: MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + primaryColor: Colors.blue, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + home: Home(), + routes: { + Home.id: (context) => Home(), + }, ), - home: Home(), - routes: { - Home.id: (context) => Home(), - }, ); }), ); diff --git a/lib/provider/data.dart b/lib/provider/data.dart index 55e77659f9d39b1361647a8e7c144720bec9d0fe..22a07e4093304b88b69d618133ab0d9bf5f2f0f3 100644 --- a/lib/provider/data.dart +++ b/lib/provider/data.dart @@ -4,28 +4,33 @@ import 'package:shared_preferences/shared_preferences.dart'; class Data extends ChangeNotifier { // Configuration available values - List _availableDifficultyLevels = ['easy', 'medium', 'hard', 'nightmare']; - List _availableSizes = ['10x10', '15x15', '20x20']; - List _availableSkins = ['default']; + List _availableLevelValues = ['easy', 'medium', 'hard', 'nightmare']; + List _availableSizeValues = ['10x10', '15x15', '20x20']; + List _availableSkinValues = ['default']; - List get availableDifficultyLevels => _availableDifficultyLevels; - List get availableSizes => _availableSizes; - List get availableSkins => _availableSkins; + List get availableLevelValues => _availableLevelValues; + List get availableSizeValues => _availableSizeValues; + List get availableSkinValues => _availableSkinValues; // Application default configuration - String _level = null; - String _levelDefault = 'medium'; - String _size = null; - String _sizeDefault = '15x15'; - String _skin = null; - String _skinDefault = 'default'; + String _parameterLevel = ''; + String _parameterLevelDefault = 'medium'; + String _parameterSize = ''; + String _parameterSizeDefault = '15x15'; + String _parameterSkin = ''; + String _parameterSkinDefault = 'default'; + + // Application current configuration + String get parameterLevel => _parameterLevel; + String get parameterSize => _parameterSize; + String get parameterSkin => _parameterSkin; // Game data bool _assetsPreloaded = false; bool _gameIsRunning = false; bool _animationInProgress = false; - int _sizeVertical = null; - int _sizeHorizontal = null; + int _sizeVertical = 0; + int _sizeHorizontal = 0; List _cells = []; bool _isBoardMined = false; int _minesCount = 0; @@ -33,57 +38,56 @@ class Data extends ChangeNotifier { bool _gameWin = false; bool _gameFail = false; - String get level => _level; - void updateLevel(String level) { - _level = level; + void updateParameterLevel(String parameterLevel) { + _parameterLevel = parameterLevel; notifyListeners(); } - String get size => _size; int get sizeVertical => _sizeVertical; int get sizeHorizontal => _sizeHorizontal; - void updateSize(String size) { - _size = size; - _sizeHorizontal = int.parse(_size.split('x')[0]); - _sizeVertical = int.parse(_size.split('x')[1]); + void updateParameterSize(String parameterSize) { + _parameterSize = parameterSize; + _sizeHorizontal = int.parse(_parameterSize.split('x')[0]); + _sizeVertical = int.parse(_parameterSize.split('x')[1]); notifyListeners(); } - String get skin => _skin; - void updateSkin(String skin) { - _skin = skin; + void updateParameterSkin(String parameterSkin) { + _parameterSkin = parameterSkin; notifyListeners(); } - getParameterValue(String parameterCode) { + String getParameterValue(String parameterCode) { switch(parameterCode) { - case 'difficulty': { return _level; } + case 'level': { return _parameterLevel; } break; - case 'size': { return _size; } + case 'size': { return _parameterSize; } break; - case 'skin': { return _skin; } + case 'skin': { return _parameterSkin; } break; } + return ''; } List getParameterAvailableValues(String parameterCode) { switch(parameterCode) { - case 'difficulty': { return _availableDifficultyLevels; } + case 'level': { return _availableLevelValues; } break; - case 'size': { return _availableSizes; } + case 'size': { return _availableSizeValues; } break; - case 'skin': { return _availableSkins; } + case 'skin': { return _availableSkinValues; } break; } + return []; } setParameterValue(String parameterCode, String parameterValue) async { switch(parameterCode) { - case 'difficulty': { updateLevel(parameterValue); } + case 'level': { updateParameterLevel(parameterValue); } break; - case 'size': { updateSize(parameterValue); } + case 'size': { updateParameterSize(parameterValue); } break; - case 'skin': { updateSkin(parameterValue); } + case 'skin': { updateParameterSkin(parameterValue); } break; } final prefs = await SharedPreferences.getInstance(); @@ -92,9 +96,9 @@ class Data extends ChangeNotifier { void initParametersValues() async { final prefs = await SharedPreferences.getInstance(); - setParameterValue('difficulty', prefs.getString('difficulty') ?? _levelDefault); - setParameterValue('size', prefs.getString('size') ?? _sizeDefault); - setParameterValue('skin', prefs.getString('skin') ?? _skinDefault); + setParameterValue('level', prefs.getString('level') ?? _parameterLevelDefault); + setParameterValue('size', prefs.getString('size') ?? _parameterSizeDefault); + setParameterValue('skin', prefs.getString('skin') ?? _parameterSkinDefault); } bool get gameIsRunning => _gameIsRunning; diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 25e8bf694a4a30901174c47d82feda0eb9d62225..d7d778a6652a3b0d147e57c3bdfc038069bb07ac 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:overlay_support/overlay_support.dart'; import '../layout/game.dart'; import '../layout/parameters.dart'; @@ -31,10 +32,10 @@ class _HomeState extends State<Home> { 'game_fail', 'game_win', ]; - myProvider.availableDifficultyLevels.forEach( - (difficulty) => gameImages.add('difficulty_' + difficulty) + myProvider.availableLevelValues.forEach( + (level) => gameImages.add('level_' + level) ); - myProvider.availableSizes.forEach( + myProvider.availableSizeValues.forEach( (size) => gameImages.add('size_' + size) ); @@ -60,7 +61,7 @@ class _HomeState extends State<Home> { (image) => assets.add('assets/skins/default_' + image + '.png') ); - assets.add('assets/skins/empty.png'); + assets.add('assets/skins/default_empty.png'); return assets; } @@ -96,7 +97,8 @@ class _HomeState extends State<Home> { fit: BoxFit.fill ), ), - onPressed: () => GameUtils.resetGame(myProvider), + onPressed: () => toast('Long press to quit game...'), + onLongPress: () => GameUtils.resetGame(myProvider), ), ]; } diff --git a/lib/utils/board_utils.dart b/lib/utils/board_utils.dart index f4bf5b8b323c7a0db3512463b3ea4e3176b3f0a9..8d5394165881169f9c598ba449d8cde295fd09d1 100644 --- a/lib/utils/board_utils.dart +++ b/lib/utils/board_utils.dart @@ -85,7 +85,7 @@ class BoardUtils { return minesCount; } - static List createInitialEmptyBoard(Data myProvider) { + static void createInitialEmptyBoard(Data myProvider) { myProvider.updateIsBoardMined(false); myProvider.updateCells(createEmptyBoard(myProvider.sizeHorizontal, myProvider.sizeVertical)); } @@ -94,7 +94,7 @@ class BoardUtils { List cells = myProvider.cells; int sizeHorizontal = myProvider.sizeHorizontal; int sizeVertical = myProvider.sizeVertical; - String level = myProvider.level; + String level = myProvider.parameterLevel; // Shuffle cells to put random mines, expect on currently selected one List allowedCells = []; diff --git a/lib/utils/game_utils.dart b/lib/utils/game_utils.dart index b83966f4a270fc5d9b1d2f88ad04916999a1fb2a..8e2db5d96d30400f3fa3cd8cf95e47b815e7ea2b 100644 --- a/lib/utils/game_utils.dart +++ b/lib/utils/game_utils.dart @@ -9,9 +9,9 @@ class GameUtils { } static void startGame(Data myProvider) { - print('Starting game: ' + myProvider.size + ' - ' + myProvider.level); - myProvider.updateSize(myProvider.size); - myProvider.updateMinesCount(BoardUtils.getMinesCount(myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.level)); + print('Starting game: ' + myProvider.parameterSize + ' - ' + myProvider.parameterLevel); + myProvider.updateParameterSize(myProvider.parameterSize); + myProvider.updateMinesCount(BoardUtils.getMinesCount(myProvider.sizeHorizontal, myProvider.sizeVertical, myProvider.parameterLevel)); myProvider.updateGameIsRunning(true); BoardUtils.createInitialEmptyBoard(myProvider); BoardAnimate.startAnimation(myProvider, 'start'); diff --git a/pubspec.lock b/pubspec.lock index 681677510aecdfce7d65d5c9f8fb37ce2f80b104..e835daac2b255a96952be38e866dae864708b25f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -42,21 +42,21 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0" + version: "1.16.0" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.3.0" ffi: dependency: transitive description: name: ffi url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "2.0.0" file: dependency: transitive description: @@ -85,7 +85,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.3" + version: "0.6.4" matcher: dependency: transitive description: @@ -99,7 +99,7 @@ packages: name: material_color_utilities url: "https://pub.dartlang.org" source: hosted - version: "0.1.3" + version: "0.1.4" meta: dependency: transitive description: @@ -114,34 +114,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + overlay_support: + dependency: "direct main" + description: + name: overlay_support + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0" + version: "1.8.1" path_provider_linux: dependency: transitive description: name: path_provider_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.5" + version: "2.1.7" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.0" platform: dependency: transitive description: @@ -169,42 +176,42 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "6.0.2" + version: "6.0.3" shared_preferences: dependency: "direct main" description: name: shared_preferences url: "https://pub.dartlang.org" source: hosted - version: "2.0.13" + version: "2.0.15" shared_preferences_android: dependency: transitive description: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.12" shared_preferences_ios: dependency: transitive description: name: shared_preferences_ios url: "https://pub.dartlang.org" source: hosted - version: "2.0.10" + version: "2.1.1" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" shared_preferences_platform_interface: dependency: transitive description: @@ -218,14 +225,14 @@ packages: name: shared_preferences_web url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "2.0.4" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.1" sky_engine: dependency: transitive description: flutter @@ -237,7 +244,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.1" + version: "1.8.2" stack_trace: dependency: transitive description: @@ -272,28 +279,21 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.4.8" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.0" + version: "0.4.9" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" win32: dependency: transitive description: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.7.0" xdg_directories: dependency: transitive description: @@ -302,5 +302,5 @@ packages: source: hosted version: "0.2.0+1" sdks: - dart: ">=2.15.0 <3.0.0" - flutter: ">=2.8.0" + dart: ">=2.17.0 <3.0.0" + flutter: ">=3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1e6564854ac5c104e5f3411519deff72a8454e12..9e465eba07aec83d71ce738757c7bea75240ba4a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,13 +4,14 @@ publish_to: 'none' version: 1.0.0+1 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: ">=2.16.1 <3.0.0" dependencies: flutter: sdk: flutter provider: ^6.0.2 shared_preferences: ^2.0.6 + overlay_support: ^1.0.0 dev_dependencies: flutter_test: