From 149c4f6146b22a1e0b35ed592228e9d2a53d0500 Mon Sep 17 00:00:00 2001 From: Lucas Lima Date: Sun, 8 Mar 2020 13:41:18 -0300 Subject: [PATCH] Add test to ambient mode --- .../lucasnlm/antimine/share/ShareBuilder.kt | 5 +- .../view/common/level/view/AreaScreenshot.kt | 106 ++++++++++++++++-- .../resources/area/covered_ambient.png | Bin 0 -> 639 bytes .../resources/area/covered_flag_ambient.png | Bin 0 -> 907 bytes .../area/covered_highlighted_ambient.png | Bin 0 -> 639 bytes .../resources/area/covered_mine_ambient.png | Bin 0 -> 639 bytes .../area/covered_question_ambient.png | Bin 0 -> 1215 bytes .../resources/area/mines_around_1_ambient.png | Bin 0 -> 990 bytes .../resources/area/mines_around_2_ambient.png | Bin 0 -> 1485 bytes .../resources/area/mines_around_3_ambient.png | Bin 0 -> 1657 bytes .../resources/area/mines_around_4_ambient.png | Bin 0 -> 1238 bytes .../resources/area/mines_around_5_ambient.png | Bin 0 -> 1529 bytes .../resources/area/mines_around_6_ambient.png | Bin 0 -> 1623 bytes .../resources/area/mines_around_7_ambient.png | Bin 0 -> 1278 bytes .../resources/area/mines_around_8_ambient.png | Bin 0 -> 1755 bytes .../mines_around_highlighted_1_ambient.png | Bin 0 -> 1299 bytes .../mines_around_highlighted_2_ambient.png | Bin 0 -> 1792 bytes .../mines_around_highlighted_3_ambient.png | Bin 0 -> 1965 bytes .../mines_around_highlighted_4_ambient.png | Bin 0 -> 1557 bytes .../mines_around_highlighted_5_ambient.png | Bin 0 -> 1825 bytes .../mines_around_highlighted_6_ambient.png | Bin 0 -> 1927 bytes .../mines_around_highlighted_7_ambient.png | Bin 0 -> 1590 bytes .../mines_around_highlighted_8_ambient.png | Bin 0 -> 2042 bytes .../resources/area/uncovered_ambient.png | Bin 0 -> 730 bytes .../area/uncovered_highlighted_ambient.png | Bin 0 -> 1045 bytes .../resources/area/uncovered_mine_ambient.png | Bin 0 -> 2017 bytes .../area/uncovered_mine_exploded_ambient.png | Bin 0 -> 2017 bytes .../common/level/model/AreaPalette.kt | 85 ++++++++++++++ .../antimine/common/level/view/AreaPainter.kt | 43 +++---- .../antimine/common/level/view/AreaView.kt | 19 +++- .../antimine/wear/WatchGameActivity.kt | 18 +-- .../antimine/wear/WatchLevelFragment.kt | 6 + 32 files changed, 233 insertions(+), 49 deletions(-) create mode 100644 common/src/androidTest/resources/area/covered_ambient.png create mode 100644 common/src/androidTest/resources/area/covered_flag_ambient.png create mode 100644 common/src/androidTest/resources/area/covered_highlighted_ambient.png create mode 100644 common/src/androidTest/resources/area/covered_mine_ambient.png create mode 100644 common/src/androidTest/resources/area/covered_question_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_1_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_2_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_3_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_4_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_5_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_6_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_7_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_8_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_highlighted_1_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_highlighted_2_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_highlighted_3_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_highlighted_4_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_highlighted_5_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_highlighted_6_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_highlighted_7_ambient.png create mode 100644 common/src/androidTest/resources/area/mines_around_highlighted_8_ambient.png create mode 100644 common/src/androidTest/resources/area/uncovered_ambient.png create mode 100644 common/src/androidTest/resources/area/uncovered_highlighted_ambient.png create mode 100644 common/src/androidTest/resources/area/uncovered_mine_ambient.png create mode 100644 common/src/androidTest/resources/area/uncovered_mine_exploded_ambient.png create mode 100644 common/src/main/java/dev/lucasnlm/antimine/common/level/model/AreaPalette.kt diff --git a/app/src/main/java/dev/lucasnlm/antimine/share/ShareBuilder.kt b/app/src/main/java/dev/lucasnlm/antimine/share/ShareBuilder.kt index e7ecf58d..1871612e 100644 --- a/app/src/main/java/dev/lucasnlm/antimine/share/ShareBuilder.kt +++ b/app/src/main/java/dev/lucasnlm/antimine/share/ShareBuilder.kt @@ -9,6 +9,7 @@ import dev.lucasnlm.antimine.R import dev.lucasnlm.antimine.common.level.data.Area import dev.lucasnlm.antimine.common.level.data.LevelSetup import dev.lucasnlm.antimine.common.level.data.Mark +import dev.lucasnlm.antimine.common.level.model.AreaPalette import dev.lucasnlm.antimine.common.level.repository.DrawableRepository import dev.lucasnlm.antimine.common.level.view.AreaPaintSettings import dev.lucasnlm.antimine.common.level.view.paintOnCanvas @@ -40,6 +41,7 @@ class ShareBuilder( val padding = 1f val radius = 2f + val areaPalette = AreaPalette.fromLightTheme() val drawableRepository = DrawableRepository() val paintSettings = AreaPaintSettings( @@ -79,7 +81,8 @@ class ShareBuilder( drawableRepository = drawableRepository, paintSettings = paintSettings, markPadding = 6, - minePadding = 1 + minePadding = 1, + areaPalette = areaPalette ) canvas.restore() } diff --git a/common/src/androidTest/java/dev/lucasnlm/antimine/view/common/level/view/AreaScreenshot.kt b/common/src/androidTest/java/dev/lucasnlm/antimine/view/common/level/view/AreaScreenshot.kt index d3daa2b4..ec4f2ab9 100644 --- a/common/src/androidTest/java/dev/lucasnlm/antimine/view/common/level/view/AreaScreenshot.kt +++ b/common/src/androidTest/java/dev/lucasnlm/antimine/view/common/level/view/AreaScreenshot.kt @@ -8,6 +8,7 @@ import android.graphics.Paint import androidx.test.platform.app.InstrumentationRegistry import dev.lucasnlm.antimine.common.level.data.Area import dev.lucasnlm.antimine.common.level.data.Mark +import dev.lucasnlm.antimine.common.level.model.AreaPalette import dev.lucasnlm.antimine.common.level.repository.DrawableRepository import dev.lucasnlm.antimine.common.level.view.AreaAdapter import dev.lucasnlm.antimine.common.level.view.paintOnCanvas @@ -20,11 +21,11 @@ import java.io.FileOutputStream class AreaScreenshot { - private lateinit var instrumentationContext: Context + private lateinit var context: Context - private fun saveImage(area: Area, fileName: String): File { + private fun saveImage(area: Area, fileName: String, ambientMode: Boolean): File { val drawableRepository = DrawableRepository() - val paintSettings = AreaAdapter.createAreaPaintSettings(instrumentationContext, false) + val paintSettings = AreaAdapter.createAreaPaintSettings(context, false) val size = paintSettings.rectF.width().toInt() val testPadding = 4 val bitmap = Bitmap.createBitmap(size + testPadding, size + testPadding, Bitmap.Config.ARGB_8888) @@ -37,25 +38,26 @@ class AreaScreenshot { size.toFloat() + testPadding, size.toFloat() + testPadding, Paint().apply { - color = Color.WHITE + color = if (ambientMode) Color.BLACK else Color.WHITE style = Paint.Style.FILL }) canvas.save() canvas.translate(testPadding * 0.5f, testPadding.toFloat() * 0.5f) area.paintOnCanvas( - instrumentationContext, + context, canvas, - isAmbientMode = false, + isAmbientMode = ambientMode, isLowBitAmbient = false, isFocused = false, drawableRepository = drawableRepository, - paintSettings = paintSettings + paintSettings = paintSettings, + areaPalette = if (ambientMode) AreaPalette.fromContrast(context) else AreaPalette.fromLightTheme() ) canvas.restore() - val file = File(instrumentationContext.filesDir, fileName) - bitmap.compress(Bitmap.CompressFormat.PNG, 95, FileOutputStream(file)) + val file = File(context.filesDir, fileName) + bitmap.compress(Bitmap.CompressFormat.PNG, 100, FileOutputStream(file)) return file } @@ -75,14 +77,14 @@ class AreaScreenshot { return result } - private fun screenshotTest(area: Area, fileName: String) { - val current = saveImage(area, fileName) + private fun screenshotTest(area: Area, fileName: String, ambientMode: Boolean = false) { + val current = saveImage(area, fileName, ambientMode) assertTrue("$fileName doesn't match the reference", compareScreenshot(current, fileName)) } @Before fun setup() { - instrumentationContext = InstrumentationRegistry.getInstrumentation().context + context = InstrumentationRegistry.getInstrumentation().context } @Test @@ -91,12 +93,25 @@ class AreaScreenshot { screenshotTest(area, "covered.png") } + @Test + fun testCoveredAreaAmbientMode() { + val area = Area(0, 0, 0, isCovered = true) + screenshotTest(area, "covered_ambient.png", true) + } + + @Test fun testUncoveredArea() { val area = Area(0, 0, 0, isCovered = false) screenshotTest(area, "uncovered.png") } + @Test + fun testUncoveredAreaAmbientMode() { + val area = Area(0, 0, 0, isCovered = false) + screenshotTest(area, "uncovered_ambient.png", ambientMode = true) + } + @Test fun testUncoveredAreaWithTips() { repeat(8) { @@ -108,48 +123,103 @@ class AreaScreenshot { } } + @Test + fun testUncoveredAreaWithTipsAmbientMode() { + repeat(8) { + val id = it + 1 + screenshotTest( + Area(0, 0, 0, isCovered = false, minesAround = id), + "mines_around_${id}_ambient.png", + true + ) + } + } + @Test fun testCoveredAreaWithFlag() { val area = Area(0, 0, 0, isCovered = true, mark = Mark.Flag) screenshotTest(area, "covered_flag.png") } + @Test + fun testCoveredAreaWithFlagAmbient() { + val area = Area(0, 0, 0, isCovered = true, mark = Mark.Flag) + screenshotTest(area, "covered_flag_ambient.png", true) + } + @Test fun testCoveredAreaWithQuestion() { val area = Area(0, 0, 0, isCovered = true, mark = Mark.Question) screenshotTest(area, "covered_question.png") } + @Test + fun testCoveredAreaWithQuestionAmbient() { + val area = Area(0, 0, 0, isCovered = true, mark = Mark.Question) + screenshotTest(area, "covered_question_ambient.png", true) + } + + @Test fun testCoveredAreaHighlighted() { val area = Area(0, 0, 0, isCovered = true, highlighted = true) screenshotTest(area, "covered_highlighted.png") } + @Test + fun testCoveredAreaHighlightedAmbient() { + val area = Area(0, 0, 0, isCovered = true, highlighted = true) + screenshotTest(area, "covered_highlighted_ambient.png", true) + } + @Test fun testCoveredAreaWithMine() { val area = Area(0, 0, 0, isCovered = true, hasMine = true) screenshotTest(area, "covered_mine.png") } + @Test + fun testCoveredAreaWithMineAmbient() { + val area = Area(0, 0, 0, isCovered = true, hasMine = true) + screenshotTest(area, "covered_mine_ambient.png", true) + } + @Test fun testUncoveredAreaWithMine() { val area = Area(0, 0, 0, isCovered = false, hasMine = true) screenshotTest(area, "uncovered_mine.png") } + @Test + fun testUncoveredAreaWithMineAmbient() { + val area = Area(0, 0, 0, isCovered = false, hasMine = true) + screenshotTest(area, "uncovered_mine_ambient.png", true) + } + @Test fun testUncoveredAreaHighlighted() { val area = Area(0, 0, 0, isCovered = false, hasMine = false, highlighted = true) screenshotTest(area, "uncovered_highlighted.png") } + @Test + fun testUncoveredAreaHighlightedAmbient() { + val area = Area(0, 0, 0, isCovered = false, hasMine = false, highlighted = true) + screenshotTest(area, "uncovered_highlighted_ambient.png", true) + } + @Test fun testUncoveredAreaWithMineExploded() { val area = Area(0, 0, 0, isCovered = false, hasMine = true, mistake = true) screenshotTest(area, "uncovered_mine_exploded.png") } + @Test + fun testUncoveredAreaWithMineExplodedAmbient() { + val area = Area(0, 0, 0, isCovered = false, hasMine = true, mistake = true) + screenshotTest(area, "uncovered_mine_exploded_ambient.png", true) + } + @Test fun testUncoveredAreaWithTipsHighlighted() { repeat(8) { @@ -160,4 +230,16 @@ class AreaScreenshot { ) } } + + @Test + fun testUncoveredAreaWithTipsHighlightedAmbient() { + repeat(8) { + val id = it + 1 + screenshotTest( + Area(0, 0, 0, isCovered = false, minesAround = id, highlighted = true), + "mines_around_highlighted_${id}_ambient.png", + true + ) + } + } } diff --git a/common/src/androidTest/resources/area/covered_ambient.png b/common/src/androidTest/resources/area/covered_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c439e00e64dd4447a05f932e9f099f80511e73 GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^=^)I(1|(%2V}1fD#^NA%Cx&(BWL^R}EX7WqAsj$Z z!;#X#z`&&G>EaktG3V{IgSkr_1X>@ayE|~qJ$NO>iR~Rvn@^h241s0Fh1N`y8&59y zmT)*?+qZ4m^Pc>l{EA7&>sRKH<|QIJwsm_A`WEMHpB)z;KXv9A{xhFHZ(etOwbG;L z1yiORHhA*3%=^vj604`TQo1*{MNU&)o_Q+h)bsWk|1AV3PCuQ>9g@BGxa9FdZehXQ z`oE)>Uz;^^W`2JD>xTi`t{E8@&sug@{LkCZJC80_k>z9e49fPsas8Hp(!KxJyfh~* zshs!y7N`6*wxv_v@4xiHQ6~9_q1*5zzG-;s>+4Ti(s83y@{aVEd-orIxu@#6_1fKO zhjuStuI~9=O;T{@s;$dZ(%N^%t)DsbX7%|*iBAt7w=K)O^s{D~%GPUFqAuHEaktG3V_aL%-J!BCQW6zYy(cGkF>7bX39VEZ>Ck0~?t3u!}LsdQIiJ zHKUEMQ*^?@Wd&9)t<@^;v=4ArHOOi7Jy)@uZ_?}dSo?2JDyI{7gQLdQ|9dAa(`-Ae z*tMu(W~S)|x5a{N&5U!3=QBw%ye_dali~AyWMyZ!ZPiH?Khb46-lsR6nWXabhi_DI z%sESIYwOu8pYHiTUXp3W`FKvZ-J4Z<@AuA}X=`sE-p)Mj`OcX$QzOM{4}`|cM{i+F zsIHb~nDE?EW!$m>8^ZM)APvY+8l`B48 zb0j&pxL7zlJA32tA6ut(T+Z9RarbWN>Yn)MP74O9>XvJnsgHCXo$UPP^x@a9TQC0d z@$nT@S6g3}a}9j(;>C)2jdco9bINw#bl$yjW8>eye`kJsQMTLE_p`C~=ZI(*0*=Jx zokf2$r_8La{QK#X5I;Y^@!Pq}UOtIWzV>qW%;&06bHY}CefqV#n>!{x{`{8jr%#`b zc~oQmd5_N1Xw-oYfmj$XTE6l zYV9@a*I(ZhzEqici`UH+0+zPep`|NY|o@7XuCr!B2rqsvSV3J5qk%zLhJx~S-{{v^ig8zzd( RIlv6X;OXk;vd$@?2>=6Vk>>ya literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/covered_highlighted_ambient.png b/common/src/androidTest/resources/area/covered_highlighted_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c439e00e64dd4447a05f932e9f099f80511e73 GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0vp^=^)I(1|(%2V}1fD#^NA%Cx&(BWL^R}EX7WqAsj$Z z!;#X#z`&&G>EaktG3V{IgSkr_1X>@ayE|~qJ$NO>iR~Rvn@^h241s0Fh1N`y8&59y zmT)*?+qZ4m^Pc>l{EA7&>sRKH<|QIJwsm_A`WEMHpB)z;KXv9A{xhFHZ(etOwbG;L z1yiORHhA*3%=^vj604`TQo1*{MNU&)o_Q+h)bsWk|1AV3PCuQ>9g@BGxa9FdZehXQ z`oE)>Uz;^^W`2JD>xTi`t{E8@&sug@{LkCZJC80_k>z9e49fPsas8Hp(!KxJyfh~* zshs!y7N`6*wxv_v@4xiHQ6~9_q1*5zzG-;s>+4Ti(s83y@{aVEd-orIxu@#6_1fKO zhjuStuI~9=O;T{@s;$dZ(%N^%t)DsbX7%|*iBAt7w=K)O^s{D~%GPUFqAuHEaktG3V{IgSkr_1X>@ayE|~qJ$NO>iR~Rvn@^h241s0Fh1N`y8&59y zmT)*?+qZ4m^Pc>l{EA7&>sRKH<|QIJwsm_A`WEMHpB)z;KXv9A{xhFHZ(etOwbG;L z1yiORHhA*3%=^vj604`TQo1*{MNU&)o_Q+h)bsWk|1AV3PCuQ>9g@BGxa9FdZehXQ z`oE)>Uz;^^W`2JD>xTi`t{E8@&sug@{LkCZJC80_k>z9e49fPsas8Hp(!KxJyfh~* zshs!y7N`6*wxv_v@4xiHQ6~9_q1*5zzG-;s>+4Ti(s83y@{aVEd-orIxu@#6_1fKO zhjuStuI~9=O;T{@s;$dZ(%N^%t)DsbX7%|*iBAt7w=K)O^s{D~%GPUFqAuH0&F9w(lu(zpr2^6wxZ;H{|Sz0vVa@We&vmRTdt^N9Zu1fEW9>YC1bNHI( z6w4Q_*~)HsY{p6M>eVMLkDod7`|rNBGDlnk4UCIrj!zc^VONa<7 z=jBUQ2FL#7t<7B9*^#mRwr{A~L;khQYro$2&17Vs$lP;+(d`L?a#4ez<$(^F1Q$L7 zC3Xp%!e{D(#S=7o3`^?k{e3S__+Izw5s%Y^qAl09MChD|^1gOU{=0TpQ`e#e+qZ8| zc&yBKFo#7zszfJqt)=hf%}Sb=O?Z_8jJlN4()3PGYM!_`ZvFX5pXOf8GX1&pj9Xt& z*XmVLEG9%ou=ZsUVe+t>2r16*JhpG^k!=OB$dhY zt@q5a+p2bY)8tQYg1fife*5G(pYCyq%RiN?-k(2pyZZi2^FzV48~(~XzoYQ`Pq&@< z-{Q}5+!~g#zR!Unu-Sdi=}k+%fB)XySD(A!NlD^(;-){8MuA`g_ZA(QcGhG zv(z8pyU){U*cKNb-{0o9)#ABAHt$8A?7pqrzR$U^eCt^Sp*JhO2xM-J`Z}peBkfv| zAE$+j$mdwTD;x(^j}+d?KCwSjs%sI)y2C$(4_=@1?fx}aj?*dU)@{AEyje1;S8Q$I=Nv3QC~)3nQ` zGj5vj-Z43#2^8-ZcyBzPGs^G!W9ib^_?0S;1#8qx{4&etUf8JwPL(XW>YkGpufNT; zQ_@#t$DExQY1QY#Mf1pMvTskf*nN=PGUsj{yR@4%OHm{<2?-mX4R$IoI-GPPqdV@t z(pu*CfAcNhZl0WR`sjV7w^mEmPS)42aESGNDHgQ*)zt6vrUw0aeV(oB@r-M)O$BTB z{3$t?=ss_fXz4F|`LpkTZxp^A3oL{fJYD@<);T3K0RRXNLQDVv literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_1_ambient.png b/common/src/androidTest/resources/area/mines_around_1_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..2c6127fd8bae72208db14a69b5418b254fc681d6 GIT binary patch literal 990 zcmeAS@N?(olHy`uVBq!ia0vp^=^)I(1|(%2V}1fD#^NA%Cx&(BWL^R}EX7WqAsj$Z z!;#X#z`)$$>EaktG3V{={oYxLGRHrjpXkus?EYf;iA>9E4%3$p<|pupIbIOBav`PO z(c9axIy$)fg2-2K7RzlZ(Y~!|J2X5LKi)a`rY!&9-j-6k=RYbBGXI?OlsjMUyr7jB z1M@N$eA8uZnDgqZzaGzO-S6kOFreYFMaK5q z875K^l0Uc1=Q(luGvu8E(1vjogdbG%M`DM0-PKE}yKlt>i>XG>6%a@;cTC_ojTaaPK zoH;JL?|!S+WBl;tOG}0c*X?c9g+O(WA1}UNd~)^f-PS$5y)e%)~y88U{i(~YF z=<&C2W*Y*3G1V7sx~X&R+O>p8v32X#ZP>Ht&36xG;S(0~o+lO;3$J^<4U=(urLE-{+};A1x1^k~w>FZS6#H*edv?aY-cA^$(W=bq_vOh;FDW`xeO-xCgR6Y6Zy zoa&`E(`Vn?$iGgtFH59$#_(Ot5c&T7d&kkF3GXkzEO}5VC)LY#?%cT#Kv4G9S%v|a x47cSb*VM=ytJ$H$oYLdCH?Ds7@jc(U?PrHwvUqv)7BG)8c)I$ztaD0e0suXH)FS`@ literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_2_ambient.png b/common/src/androidTest/resources/area/mines_around_2_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..e6511a886c707db98e3b0e3c8de0694ef68a86d5 GIT binary patch literal 1485 zcmb_ci#O8?9RG=SXXbf#+r6OPCz5Fk_Tj4J#xu zkE?ZCNb|U^yb~+)xDmIy@)+*#{ttc6_i?_T@AsVV>zr?f7vY#PY&Q%50A;)zjtJUw z{|giXY8~g`HPFaiA|As6HND7r&{4RA#rr@(N`^)-0bnN;k8}2+l`fV#xdnwHI)$cC zZ?`Xq^RaG0Fmk+_UYW+6=(M&4Zk`xql&E+EI*NQ(jzX)uKbJbE-TFhopXaAcRUVDY zq(trJXdG8|%PiQ?4wtRXwnZKKr)*c>4`}w4-z9VDmzL;P4S*eRyj`~)-Eq(Q`Z`K% z5sV%_Jxi&zb#!!nKy!u3{%L;6+*8BCnMz8ZAo_7t5=B9X$QqTB#A zG(eNBnnwh5^!BP~T?q&cP3QA-_bGz#*Ex0mAb%ps9AIp3DGSDxb2?Av?-g4xWUFD+ zkZ#3LA;X1CCdV50j7J7i5)gei* zCnRXd%ge8>ENTO&BC!O-FW;w~M;cb34f4B!fBo~--`}WIYF$&)oGm`PWC$*L4o=16 z@oEepz}a)>)U#ag@{KeyaG91D(Ajw;EeMOndfeE!(nnHC-2vt;FN|77l?+{92u#^K zJ=c;QjHWKe)ae&{=xf2T-Ua(3hXP;KV(xlDLu!W;+Muae+V+;iKKu@^am0m-7X$tL z?R7h4GW!rAW8z6EXJ-;7KR=&cTx_1zM&Hona=ArY{Z&4&Ye#_k`ud^{1Z<~0ZMoc_ z*;@Orfk68DK?ICv?(6Gmj4JlPvLeOv5B*K_kt#Meqnbwodmo;v&F!1@B-Q!Dm6ViN zq@toC^~`n;(ps{vgM))-S6yK)%hJ}Cxw%OnU=M#hR9$J8ij@N!wOaWy+sB(8jsaVr zn3!O**-ica#u&miiZsIFXSZ7sV;05Tg&$0xx%0C5{A}BxBP|Jy0s%Ss0ylcBL4lY? zk-kkkV-{uP=Zz5GyyqJ98vlUE=5Q>t+QZFFOid@_U2V9F({FM@AMt0p@(q=#Nd>63 z8JY3Tds96e8&<{Hnc3N2`mDX~$4(!(d7WaHm6xYJKr<@DT5}RT27y?s>IVbSFF(W& z_|y5VT~f&5=*-vsi8}w#-hM^~bE~o~vTKndv&SthF$edT5e^gKQ*oHIFchaJkZ>xC zXJ;A*gEuKx!q!Krir literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_3_ambient.png b/common/src/androidTest/resources/area/mines_around_3_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..9d49f0c0f4e10cc818980d217f743ffb77b58756 GIT binary patch literal 1657 zcmb^y`#;kQ^c%8KqVDo&V@)MAk807nb7>9J%`90Sd6cD_CA3ZC(UQEgDRp-Z)x_;F zkEG=ls}|DqV6{niE3p<6`b@<{_j^D0U+8?!<8#gr=bX=Z=95XjCdR9b0RS-ZBN75Z z`Nw|*H3Yf!_V8IyEMf%u;(@wnh*3~6VBr0Npdh3}59R@Y;Tk`}_MnvVPvxFOc!FiO z$il$sOym_-&2_Vs(W;Q~3-Hrz>ymD*%Y3r3%4&?hnES36wWBGkwQ5HW{xB+p*? zv!AJ1(Mt59d6(IumRET{nS=LBT*f*t>m--e@3om0y>lb%?sWR3R+*N(8z8!_wMraA zSXn)&-Pd&GrX$WKpo!5Mh_JRkz+xfW+S;zaqIE|blMq-2gF&XOgg_wnT#2P+;&k_& zd{5TGekKzZS#J>~I_b?PZ#Cy0Py0GvdXM#^BW_|?*6!x%>7t+M#fX~cw6tKc9v%v< zL49i4^v84MJl=Vr3Ia_0)1ptId{#*;T-#ORTvMoF78$nK258Qhb6d7-S!#ua{yTYn zlqCXjMy{!q?53;)gN`Rf_C|HEez4*0@h`9S<0Ag<6dsWSKwP#fI`=1F#u{H}p9VI_ z-hk{_j(<0+Rg)>gzF@(t#ChEp>ZD+=AZ1>+WoLC@)1J5`btP1uT~}Av)YvP*9@AA7 z1ZZY;^*X?7Qz^4zt^Bc3Ha;XIWGfd|7I@=~N~OxFq6rHKwtYjp-sEnek?dg)r>8Lw zho)LOG1TAnPNm?K6VuxaPhjy-T>8u{r?)c%+eH)#KQ;`$NrM~76>?poqGMvJW5T5v zw6n8~MxxdduSwaH0d^&MozdKFdTk~rut1nOJuR=m=W4gkM0_fiSHvI3%~e825BSTI z(sk248xL9fNc2RltpzlpafIBu$;rIXiF#qR69jO)SU~+TGO~7WaPYo(E^)2dQbU(J z0kmQpnVY+NLv!=T8B{_-LR6|~l)36g(9M{LO1)TYHlDvGd!IaML_2$TvPn^llsOlg zy?>d|GcYrMGA=&;IQD9xw22rPYz;~8F_M6g{xK0c1nJXdR>xnlO4Gk8?`+}EP-g!^4WIK6Z2^Jm}Snf5B;X=MtXbCmY0@}&el&01=WELr8}#` zy5w?s+NI&pPovUn{gdA$9SB)vpFLV~I+n-&yvuI5V5rtb1$a4ge@${{`){l0nwd%A zZf@P0u>o?uKDkU4qAgEL-yMcrBTu>W*l*!B|llsJ%|#C?z&B zrHI7=hp)TsFuerJa%72DhP@Q?sn@%2eZZyrw`A$`iptf{GK_F4LF1=cHq zj9Hakrzr~Mfjt+lff+wgYlj|WLC7!_o>N4AxP>0qKgzs10M8lPTH$P7cszYNSotZ>=>bs1E6)Ae#(;n??fL+WHJpnxgNWRrl!mSpXkmtibR~gzP?EHqwn6( z%=Y&7)^dd+BBfmkT7aq9bnyJm%+I->5^-8%d3I{GI&I;xf|B48d9PS37Jt>Sz=P-Y z+sW@C%S=qZ;CckI^xrOHmhNDmJ&V!7-V{H5`4V>e!D>SYq@l4fi_b^7Rt$rY@z4vB zn3~$!p>7VcXutsrT(LL47wHnOyl3PPkX`C#Tm49>jJ(=~(VEUJ?A8;d8V!Q)1Mu@E K5$f>!PyY*e6A9x0 literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_4_ambient.png b/common/src/androidTest/resources/area/mines_around_4_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..71819b05d18ec44aa7316957e728fae0f88fbc73 GIT binary patch literal 1238 zcmeAS@N?(olHy`uVBq!ia0vp^=^)I(1|(%2V}1fD#^NA%Cx&(BWL^R}EX7WqAsj$Z z!;#VfEMEhm>83q1Bv&qUBBLX`>hy53ok=jdip{Qu6OU>AM7bDEoGg5p51d& z0&~O5mzh_xOcy^-Vz_tze&Y7qil>W=`xa?b)Yh6->3w_p@+GIRu<+UF%zd%TQcFri z7!HJTJho^llsRO~!pOaES!P6J z7hTp@Tv5@{+}zw}>U(*D*HWHYEB5G%jG3tE$IQedsh0L|N&(54FDFnJV zFF(KZyvfQCu9-f^7OZ4D9CBU8_wt5q+m=-?`&hM?Az{|`v;U{AeDvo1`|{dlokx@Y z2xKjBP+(x#l|Jj*>eW6|?R}kj>0Qd|Q@tL3`4X}{@2L63wNQ=@OtJqVrvCm+a5WQ95F;t4d0CXK$9eR9N?GYq5zG>xCNSyS@tpUhMk!?OR)c z1rIR783IB>%Vih4{rFq=@cVDx|8=MDZ}0BzZv6NAWy!4%|C6`pR#!)#Ie(t}(sdc_ zz3Q)7Us@dQdo1AgtIZ)abk5wle?Q*ey>H*OzgCPH_olsn^QPwio;`d1?0+V0a;dOt z?_{s#mt!C6=;-{B=u@&=D~OyVmb|}KwRDx%wr$%=UgvF>{#kRcp|dLaq{Yn~u}LZ~ zuYLY$lb4srGh>DMw4UT?&u7#hzD{uhgQrquh6@=c37ZSmwO)O-Y7scAygXhQez~(~XHS1WKSO-{%ZFd9Ts1_D{;YOwtL;9Tl$4gX z?CWQHYa6-#8#itU@U92d$wsLLVaX0Trjopp6Wj6NqhaVO+ z@cQkIYhRWL%*H347FASM{=B!mo0(yfisQ6YA3r}Qj=Oo++?_b4crAUO?Xx>x$4^OR U(uK*hfn^her>mdKI;Vst0EH${!vFvP literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_5_ambient.png b/common/src/androidTest/resources/area/mines_around_5_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..b3eaae9d2dd1edf007ed1dcadd5507ca903c8b94 GIT binary patch literal 1529 zcmb_ck2li`6#rt_@irkf`91lSVZ)LkGK+bBgtw^VS8_CU{2C1_9Fe9{ejL9=WC$y2 zc+~N;c;@HXtDfI_v@B+A$cA{|_dj&c=iYnnx#ynGJ@?*o>E2$ha0PV*007`_M1n8q zBmP&Y9B8$iE=xcsMe%jT1I#f^9vDCkGpGlsttB) zK+G}*sy_Ta?Q5%jvbxSx#XhO!we}6+l{TeKJ(4V1ulNr2kjYBuA$9G}nsp8VFv-kxAtLU5xuJ2HsnPoDG% zw)^=v!@|O38XFrC@531hR4SXnFf5rHJrd=1w**A`4e0j{`se62|^Dc;I_#!4!=?o=cofw9|ehuj809 z(AS4ouI@ZtkQ=5Z$K`UB?!U`!HLD!=&!~?=I5a7{9K*rkaPgkx6(@A|#PEBQ3GMhmIlHhCn_jR_lO9i&dyHVj2PPjR4jTK ziUi4pJ6o&WDK`@n)$;T6sY)M4eegL8g2AC7XnbJzM6{ZmDH|UhjmCQRvy0H7rG_4y z5y_3aiS{`!g1fm|br~wSy5?qhC$omdIwB(@0{|xstgWplrl!cd6)i0mBtO4tZqekV zPcfrpgLEd+7%30<`TL{SJdlK5gN)u@r(#Bfhp63|-e0Qae{tqwaB#P;c6D}Z9J5a> zwwZsE6lTXr@1U90DbZ-O<%4Bm$d`IRlCG=%@LwLMt}V>U%Ie^9Y$hJLxw$#3|2iP+ zO?kxllc{wA5|T`#{Wi=K2-*W9y=B7>T?e-*crfhk?_am6Vx5F5D=SNCd|q2?K&bJV zX}N~Y-r7o-u{eK}H^eTfs2B}U9K2$osj1n6^~~rG1+lrc6&e+#cxJ!xqqDPf+p6>5 zx|I}5qq0us47cb3(2oHC$CSOEfdRripVyf~GN~QWQ4M!@zkh>Fj@`rUXHJVmt*Us{ za67Mq!fw{KV1bQ52N6YCESQeNt)AuO<%dkefWk~3kEiF7&}DqwNc&L@INMwzq%b_t zJ&(Ei($t+!i)%$zQp`CV4kab$FrDz7$1z$H2)?exBOyU=lQVaAk^$aX>+>QHxi8BA z?;_U52C5qfy?S)Y+{)20_@zx%PF`HAk3@eX8oX(3J<}}AuYv&(6Bj34bpN!^=am(x z@9^fx)ZAR=f`Dpk$b}&xZSC!xxVE;o#hYCfIdm!SprD+qmUPF|eZZ#cgXgD&smaOD zVl(QYw{RG2=-an%BfAIk>Ah9Aw%036Q7DT2P}av`Hak2uwY#aI0Vm*C-nE2COJ(4Z z1%-urxx}ibCfEo+Ha;GLgyj9DUszc9eRo^1(V~e1s>tfIQKw8$C}j8;<`2TNf`8`c e9mXxD_T*hY7GG0`a>u~;4Y-~4A~5kG>Hh(K`Mf*; literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_6_ambient.png b/common/src/androidTest/resources/area/mines_around_6_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6a9637bc4d29fedf79be2e08335ab0f02b7061 GIT binary patch literal 1623 zcmb_d`#aMO6#q)GM6b)pWfW0EhjvR zX6hjQqGB!Aqi6c6O&SA7p$sB%dRE=DG^~1{(%&S}e7n=kL_qzQr1urWe1nkOmf?!R zaW9P;;<@O6MssV8N1kt24CD*XlD%VnalKD^mBVa)hUBAM2{PAjE2Czc4`&*CUmJTh zG<34DvGH)fLl%2HS&~Q}7Kzx4i;j*?PAB&1q!Y8_9!XSHRl&GaDt+J&e^BvCurtss zZS7Y!lj-PTqETB{$G#*Uo8ZS3>~t$>#*UTb6vRI{du-1gJEMY~uFMTyM@I(h(%i|9 zTg!hs9ykDRZEZCJ^prB5oT@|iJJiX85$b0adN^-6-#oq=IrgT$cI_=$_gBIKbRgb8A;u7lkx&SPwy^ zQnfizb&mie<-TGJqPWXv8b*@5@$TB4*MR6lqqy2nv2^6`+wIk&w!cem<>%2LL@f4rW zzuBYKawv7lpBrxLowiJ)QrYxX?+nlDiV#AwEtK#=1P z&zcj|v6-=$67=FBdwct%a-)U8(`Kw`Sce^5&~i2u6l&YK{Y$mC>wu*GeR!9nzg=kZjXYP4F!G$re( z*&>wbh`-CkDiX`~!|PCu5WwNL@HiY`_IAP2Ja7z~Nqm_|{mkZQfc}1zcrO zrl%w1KYlE8aW7y#{rgtJ-Zgyx)NL>}EN;cme-*dZOkpfL-^GXSm{0oP)YDGF6Rt5 z_|`ssI_My|;GXQpi`gq|w)G7p)0TNLR#sM9);EGKjHcz=;Sxhj^Cv04oSCtuViuKu zS9np@dH&hGvN9|2?zR1_r1?!GA1~6ss>MZ$Qf$4ik532l%PsWCi7fRvnDTwsD+`9r zRS!Mf5CV^v;cGA$jE7Dods1wA|6kD{8%|J zFK_AB4@)wc+%b?Z7KegBLsn#PIG(91i%+2k_b3C%3U!krh;?YoX7hqF02}#4R$G>!J-){b+#?E4{-<`X6AO8CFtA9sD{_NSalL`w1O}-aO$8@_b zcDlUf*}h}l9x6&=Vq!Y}AC_;A&{1P*Y+z8xVKA_@<=uX}clK;)gKI^Vm7KBH7iw?; zg)J>Rv$kfH#_=>vpDupmZJEW~b8Rv}h0B+#ul}4=H~IW?Lo>5$5ni8*W{T~v`^&_z zLG;iD8S0=3|300)croz)v9g^p9?LK9*sGnuAg(@l>F^mx0+rqOTFo<$t}cGp9&uS-$+<(?9!Z=gfr@7O&FMn%cFp0qEY%n~k|Qy_&ahf^h%wjoY`U zOJ$b_DKK9;{c_7|e-)t}yLN3-Sbb07Z`Rt&>+D6iJh#{6x&1mdbM9Qz+8kYdeeaz> z{;N}&U`a#dH_L8DW zCsS^7OYK_s_`!pO1Cn3)S3W7RN}Trc)aCGrUVd6rv!YFnVk>`XUD8<^8hZ549~-BI z0!|A9yknMW`^URVSvowPo!7N!#<6YNx3kaj{XfyoPj9;Pu2VmxgU(vo^Gf$&f!){N*yw!AYL5JJoM}KY2v!je=iUbD-zkmOqKVz0!SXfxg;fEV+PR_q(BiHYt zB6R5W*Sas7@7wNivM^mJl`Y#X%g@hWU?G$6%YAKF^Qu+A%nl6gikg}~9a~Q@GPnjl wD6ulMv*S~YI^@GI=(He0r|yj5*+1;dCR|aK6E-{xEW;Q)UHx3vIVCg!0E}N+djJ3c literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_8_ambient.png b/common/src/androidTest/resources/area/mines_around_8_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..63ec78f0929cb712d24052018d3a32577d8b6a73 GIT binary patch literal 1755 zcmb_dk5|%%7XP-V$W+vloNMURZK&iAO8kM4rr}5vO%jKOX#RSpO*Tr!V)o2*5vic5 zPe-{@>7|0h-->37Oqt14os#h{*O}@PvZvQ?;}%eI~Yx7LCwcaP=`i4hR``AQH)*~NZ%j6{ZV98E~y5h$6 zaR7|`dWl~5dU;u**;u$$hw%3H4)Nxn=-b)xX=`s6b#}5+TB9cT(|5RT9v&bPNz~k& zOYgiUbirQ?E_uJRjrpL}&a5$3ceXD$xw=lY8i}#lTVzFd)(Mz!j!sWxGAWn+Z%NV( zE?z4rV1414)^g~+oci{8uWNpOz8)~L3n+JqzEoGo*mw!~xB8&3Z_y84#sOi&yMWJJ zDEDQu5b<0bz|^WCN~Lm@fi<9qllsbCW1d=lwvk&<0O1|FppHch$rGbC)#^`xNyAfQ zlfQv?5a>#NE9Nra?v2E=OBhe5HwlGNf(Og0@v))Dk5SkSJEKvlsP=l$H@NDNcmbKSU@h9J6N!LH*bU^^a*mLyL%p&ySs*X*8=|pTO-v4?E-F( zEV{Bqju!0Jup}BDRKuxW_6{d)&-M6}2KkXli(SuZ2BO%|pIfEUz~InOaa(`f0b>)B zai2zkz_vu{r5;LZW~g6RKsETQ+&R_xXw$?_ib-jZ{z!651YmO`1fzDfU_*+opUCTm zNszy_w9HQ?Rldu@tV4c2|?TaYA8h_FYmN9gMg}Xh2 z9pDr1-d}m=>HH|dk19Kz|H3T4o5%Fg4e9k{gdie%LVhkfldv`OLx*i>*yU~*u(-04 z+0cHcFXZ9ej|t6@{cTkf&;K*}>2%d$8vr23#L!ZaY3DLB>@1Dr($iao_lS36X*AQ& zDxUxv%~i%j=T5cL=A9zAOHHef{9Kc>Hd#UQJhmO@NHm7Y9stg~vx)xWwGkK^W+0 z47x*fB$w$+kT82==x&Kb631Y4yrC_f-QP)(iKuea0Ssn;u)Lw(lW^j(OlC-s!+O7S zfIi*%r4UhMeP~b4;lrHr_{g&1bS0_s7l0tA)K>Bxod#31G)#zzhUbPvPBTsgPo(Q` zII$H!fpK2ZwT2?j5d43hijMOtgirPsBcUoUPhZiMJ}4sO8>Nl@@hK>mOre~~v~&)L zLf6;V3#(^oeo<&Pn+*o#;?*pi-DpEK+ExI=%!rjnv6i4`Jr^>IZQZTb?Qe~x?Cla_ zWRrVXdZSAyYaiwnjYbo-trTa9M4}v=-Ao7J0v~U+PH%eR#OL!VD{jsDFsdgeEyvBe z=&Oog57z+;KWd1G+@Sp9+<%J)8()@@o$_mIYoAlAQVodnykL0l{_liaYjsVDk;h46 zsoa{z&QeeAgU1kxYvkIwN`z2B-K4AATS^V JC-jfK^cUahIeq{D literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_highlighted_1_ambient.png b/common/src/androidTest/resources/area/mines_around_highlighted_1_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..81ceea14eba4cd62c6d5e8a611a630c34bbcba1a GIT binary patch literal 1299 zcmeAS@N?(olHy`uVBq!ia0vp^=^)I(1|(%2V}1fD#^NA%Cx&(BWL^R}EX7WqAsj$Z z!;#VfJK zY~(FYzn}9^G5(yiiXj8H>Lm61kDA%}SFBxo)WrAHsZ(9H!Ja$!>`|HOwQ=)iXSK;Y zH|ndOyS&`r(06izfrq<0JHNc0iUdzkWMt%)MsG*0sgItYpP!SP`|<1R@N?(RMa0Le z%k{_0CKtTjbnX8A^S5qEUCfxWaG@g4;SI^}CVl?>J>SjU-O|QJWv0)jJ$rZ#*gnur zIX|Pfm-pV@YIhZ(iw3SG|NqriRaaYDSSZZ(d;GED#_ijSc^0f&$9LJJ({1sVty^!} zW}lRjlY92)QPa6|emsXy9Q*kD@0IJ?V9y@XZ^1)C%M>~uU+-_advk0yLVN=$xAO zhR2T|XO;10lmR+yP37LW2T?Mr{l^4-9&;=!WVvk7lqqx2q%T3r-Jn-_2C>4G^)^r0 zl$DjYY}>|UU|^8&*<}0URmSQZfdZ=%GSwQE2A z`B}W%eV1`x&*d98PCR&^(CE7@0k=58v1mNth_w) z^+$hxd{lnEK;3_yNP!OPhaVpw&)FKkzmBoKUiSN^Pm|u?-!IJ7nkQpoV$yQ{x%SO^ zE}bp&=E+4xMHO8$H#gs?qb;ot%wn519on3Je#M$KdkPawq;$_M;cB>gH58bSZrr_l zHtt$kS($~cZE8-=nRhq6ZXG?!T3cKD=H0uZy1H|=58nR#Y5DZ&(+V3oqnSK!-@Yw7 zA35pQuU{E?d1-ZZ^CnN8Trbb@=%dBSlu1XAy2kCP0Or+A#pfnX@=$s4;>ChhtGXg| zj@`Q_$H0~lYyaWmV)v4=vY^=5-uv&>f!RAg-rv==RknEdwTl-8fkwQ2n|tY{$?xC4 zYySQDsm1f8lQ}_xEpGkvS+k^cw9~ima-NnNdpG&t7xAC&yH)Zgn7jcNYz&^RelF{r G5}E*45NdS* literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_highlighted_2_ambient.png b/common/src/androidTest/resources/area/mines_around_highlighted_2_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1544eab92931fbb6e119358df68d7c5a5ae4da GIT binary patch literal 1792 zcmb7_`#;l*AICpCIm}(6qs!cTYLGosQ8Tx2cETRLRb&X=zOhfx))x4<angN)6s)HBJR-YkjW zW2PKE7}`-08r z$)Cx4@xpI)vUL}g4~>tHk7k~?Ej&?cWo-@e^?koO^~=!62#G>byY2?-)}RMZPfG?% zif}*AZ%K`^VfOi4*hZsRy0x*izAhXZQbTwMa(=J`fN#Lk_j?a5yz08x5xc07gxbG{ zn|YhS*Qocb5{jCGi}3Yc1VYa8a^wVXluZ69fkmI)=$Cz!-WjfxolQ zClrfmozEsFuC1?An?5#O4n3VYzI;tE?_Z(y4q5P%dwwaeEpcmozBgUzc>Q=ZE5d{u zyNFjvcWJ+SS2wroj0M8Zj$K_10&ZQ5i(4X-$zQywvk&i(fB&n8X=Bc2vopV&A1<2Wu@Xzm*?Y-LgO(bLw zX19Dw%X@2cbB1nSh&&Spc0wd7G47|i28{guAki9yqC#SiRMzR-56_!3#oAuH@4S#{qTEk>``5Q@E7wk{WQbL*HNJ50j#lh6N+DC zyv$ed&Ww}nsIRT9)sdVGJV&!@j$sCr>4K$=4ZFPSHCesAy|yC}@jew5FF&7bZJc^| zMcT$io+v~u>>MyCP)hFZUaBoiO--%&4Ql3XO+y-J!ivE73i}XDc5+0$xQ??fkJApM3ZrIKvgw+-oj+Yetq1cbX5&(U28k=j3)iqIU!4f`xPI??_(-FVIj68G07>C386zlaU z(vncKZKg#xjH|iaJ)SINZ#9}OTjEzar{HCE<$sTkhHNKsI4fV~1$6Uo?Hg?Of`QGM zHaJ1H^=WexvMHV6pHp=X#OZpB-^TaaJRWQalk20fN{ceXi+NsfZ0g4kwDsBUVBR+g z`s=d(2il*W@q@~a3;$L*|5Iy>5(d6r-G#L%LX<^4S|zZ{aEd*aG*t3Vg#YqnEBP!g z2L!km7}(}s`SOo)PfCH<0uG-O&^05XqYwFGb^3Ij;|Bbl8p6xzdW&;3nhLl!T_DxJokO<`!6_1`)Isg9Yt#4CoQn&I`5m4i)Wu@4oQvBZB&x69Cj_YxVM>5~e!5`3XJNR!dL`3} heQoI;%UKAQ1P>wh$FvQcnwEbt0E@x9aa@UM{{ePAQh5LX literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_highlighted_3_ambient.png b/common/src/androidTest/resources/area/mines_around_highlighted_3_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..68c6d3bcb92cae2c4002daf5c4c04dac17c4b907 GIT binary patch literal 1965 zcma)7`8(7L7yrs&kjXM3##}=fS*|4-OSWN9u8^I^axFun#!wov%iQ6nkZbIPa!ZW8 zT*(%)Z;8ny%M6K;EHOfN-oN0z=XuWgJm)#*Ip_Rv&gW1Z?5#zFWP|_!5V5tfbmC(0 z{}jy6wQ}a(94_!gI9Xc&)x)qAt^*p@=_Pl2ogJ^kd)&bB`6&vHrV+R+*mMbh4gqSJbfoz%p9C12$d3K zmqMj5c2~~1Dq%{M8eFod564Z@Ig-tNVTF_z?4gpVtgUwZaNeoe;cU`Kp6;@p0iYm# zdgZ>FaohnaL(Yi*E+&~*0CLvwNt1s}jBK7Ae`RGQ5-N1^hPc7GYm5X;St6F!J31V z^y~Pa8F>Blj10(g8f_5(wzs#<%EsD58~q7{8hUM$M%35Y?)UE{|HLSwGSvFVLK{D` z+1-14x9S(K#vH_%z6;fJKI2l0emI6Ba5e+!&fgC>5rcz+@&!Zs#-pxF@19<+nPE%A z;nm2g(8ke~$j|HR{J$W#dx zdz-c4k&%o2(v2+EKyFrDaWNb)^T=RC*qM~jes@0(yk!xybaF26`I2G$=c%wxErS$4 zBDjkwn%ajro{g4PCTrP2{QhgeZs6@a=`|hk4o2_3{BE8Ek6LFWV#-u=PYUty|Xjlkt}dh_%3sf1c#7$fw?UXRK-@CXs0ak+;z3O z{DF;fHkC?6UhH4q+PGzWBctIavUEs0&khxTWIPzORo%T-ep(P+#7jMm} z*X!*VG!~NZOoXIrMQ49cBUVfZ(x$xZ16vHFtZXXu%tberhGgl66%!tfi6zCw7?TpR zJh-m6XYt#!8xQ0)1n&E^9RqlId8x(4)zO8$i-}`6#)QFBbHgenalvW4K0WZ6LIot&Yle;#eTkCc@d>zDAs+3rO*=h02!5&pHFzDgLiVSRQHpGKF z2h&rPR?d?Dh~RenytS#`XSBbfZ&nh zNyUcL(eaR~wl*Kf2>zp#hC+)+4mTi?C|K&Jue9jrGwhzVwdeRErzMwc`>VRTx&#!g zt{$h52?pe$LJ0Uh#heQ~$R|3<9UD{TV_q+=Az+Xxjdf4+{b5x-=49MTrVS{l{*-F>V<0&gEbLr-8;?dDjo%fgfaKs!5yB*!CXXJx~ij#`3?|*Xn06lMU-%fdc zi!-+q{gc*|v`k8|Kp4mFJ8Kt##>4C>S@O99cXD!a&JPvLHXjcl5}maDfje(`(vsG0 z8iCA_yW^enHTW4nojd~bt(bRPoE)r|9YO~yK@}@3Lnw*(}?AXic48V z)!0_g-Wq9u!0JC~OV9n)2RH~eT>t)EUz`F;C6m=|5>YUR%E`3+Jlg5%D=n$@!6O&? zP2�j?i?XPTuj^*RkmZ=dPF5*Vp@7S5AJQ+MEIs9zRyXVO7-ku5NDMe(YXn zv_#S9wT*gSUS2hHyt|iI*V2;m5sy}5b29}^hCC`OQPAw|ZNaqP)0zhxL t!&7He^fuDc(P`*!L@DyG8LBBqihX}$Tl1QlBlqP3wpR9*)fT=<{{pwInaBVD literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_highlighted_4_ambient.png b/common/src/androidTest/resources/area/mines_around_highlighted_4_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..89af1ab979e5efa6505c7c47f6ab4dc82b1b8d87 GIT binary patch literal 1557 zcmb_cXH?S%5RZtghE0`i85I?f6-G=dH8Knv3W7k1U;tTRg*^iJ7!e8DNCae9L69XQ zMuZ4dA_z!8hCpOBfe@BJj37b4{{7g`?Y$fC-o3kb@5T@BrYHsify9xQEnEN_ z_+3PV0IhP-n-7>H(Js~q(9&aSveSjjDfHNF&4ASOgW= zRA&k-wX3|ixHxaf)lElFkJyhcEGkkfAHMHR?t`Z6L4c^!X^W5$ZEEaCbvZF-clTD` z^tyDrQ?zQw^1|X`RzFcoM@L5=3hkeo^5CjU*0ob|Pw0JGeXk9s{iK?|z>Qz;`#mQ4 z+hJ*0nQBy<@(Q;2gq{zmNpv|Ik(=;!NB7IdtcGGFA9Je_)%6EGpr)b0 zAA=z%ruFt(?WdY&`8MIcrBcaPblsnN`vwK!FKcGJSvb=tDkuOkHXa!pyB^nBt5smb zJ2FMn=QlZhcQyQ}Ey9wjTU*RaEsXUn;TR)o+~(5gW7}sGO2PQibP%0Rhd>~p zYq3~tA(2R2YMkjznXc6LednI(BP%OQ8cvCip8{th0wSf!(Hw`|*^v=vTl=dhRrA!) z8ewnd@JXALHPbnnAkRV?xnCb5CqFCKXrfoX2D3^77Dw8r(8 zS1X30QlW0<>5!BJ<0p46GEz*LH=vV^D9#5;$j=m@E5o8^XGZo|QwE&gJSDJ%gy(8U zM~6ve4VVxLWkwV(Ed^}MccENRMU=K<)&odQnVFXfV=ks(+9(~W@TMQ%;|Iqb&a_k^ zPZ7aj@YKCpL$lyP(QH}?JYlq@DkwZ$IARdP!}T~vvAFRJWBa(c)^muDnu>V>9up94 z*a+sefiCA0`)!F?Bb9AI)zWY?l z#>PfVL&Z!zJuHXBqc)aO+uPH+30P=Vb@khc=r-jnUn#r=NJQu+Dbh|cz}h;SJ*YPZ zq0_P@rxTAe-o10OoHsA9VWiG^;&5H;XdG|JekCD9CUWco!&6GP`hznxL;4prAb+MK z=}SItb7icW)F}H3QHa~CKp&eE1?Wky41K{g(mH+^Bc_YH(F2q>sm(0 z6p9R32#Py=`FL)0w0n2=g*bj9OPdW0nsiXDu&}TIPudyGvIwCSM3uA<_@>xF>DvSU z1KT+}m^`3(fBt%)q*$eRCNBBg{yx0PW++?oq>iZyEVe$QSuU-@I^Q$6+#Dx#co;py zX8X@|;T*lZy!!3A@yg}HoK+3G^~GK8!uoXUunX?XhDue?@kO+uf=_31f00q(le#+X zwh{f?dB|FjzJbB3?rs4xnVg9U3kb*pibid(x>3n)#$ zf7Yif)gAz_?d@%_xVV9-sc>3$_YtV2r>AF*g*x#4QX+yPnFs(ynq$_kz@n(6@cGWW z4%Pf!t_CBNq=)L%H#BsSJL+rIj0VxYUl8*eLTAbIv~fqq#Vf7q(@rY@ P&<;XcI#@hKT+8?eqB-ie literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_highlighted_5_ambient.png b/common/src/androidTest/resources/area/mines_around_highlighted_5_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..98da24625424c9e7e36675ad8a954c46609a8951 GIT binary patch literal 1825 zcmbtVi$B{}6#sd(p`=2p-c(gHZ8fNOiiUU&A){R@ijszTH3`L{%haQil93`vr?w(e zNouC3l@gCt(o~yTrylX{6fxSBP9OXAv%g@U-OsuAeD3F*d++C*^ZlM%gbnu9(lFEj z06@#%&pQm%=RZxz4sbO&5&0HWO5`wKG$4=~FM%6XGTQ$O2so&axGMm#L+tN;;)_hq zDkqSrdq#igBaVU4Qm=D(nixpY$R(bB=$lr^iss=rZB+ z`MgwugXXD=@$eRkh){?qP51kSe60-a-g$v0!;Sw z>CIL*N5_W1Ie5j3N43jOUM?>y0R}EU%j`J2FZ*vh1K;^sQWC6K>Yf$G(BmD(eQ7Rv zGbD&;LAyY_PqWfX-=+{5361$L1`)H7Yv<}pCmy@Iw9S4t?in!GVgznip#fKFbxIhb4jz;~0xTt?1-@t{?YEbHTb0X#%oG{3t`jzD^ zE-q@lZ>X92SEfUS3}FW*G#~ zL~U+&P*qj}h0D_bB#_u_$rxgCax$$mQXA7UQP<2kvd6lERWMq73TPZejLL!ma zT(0A8UDBJCvCB11spzts9Lkp!b-cvIq>lI7n_i)C1pS9YU1&?4-ud~sDQW=Hc9BA% zc$QgmP+2-Bg;5|9steMbuPPKNBKbsjj!}AgdcmBSf2REgB0$L5&M+Kv z;o*_Isi`Ogy-zZos;WC#4O<=?SIrYN_`Kr{<^4FgE z&=%4u+Pl2_Yn$iRrtTGF?KX3NC%3l&(JXw{RW(9~X1RcvEGS3NEvWADYLXzbGqz*& zzJ?^@(*>!F(=#J=UZ1DNuqt1H0sYd-D=md>y}u+v^~jl6L>zl)*vcf!g=yv?bu)pg zD*IWnz^taU8-Y@J^z7jDv^niv2p_ClN{5HH*2X#Ma4fFOQnVhAp&b?jv`4ibbJFW> zS!)OVb;6q9_D2zkAT#c^7CQvVN=)1$-jFL#3LZZW4T2BkPBcz@Jg^OtKsLHP-kwT+ zRNf%153B^MaJ#AT0gpHP;r+JSRbB^j|3RIi8$bT2V#?gfXquawW7pO`3%`q?JCheRp=R!y=Jy^94m-ChlSwqnp_i+xYTtbiX-@iy zPaqPB4<9I{v#+tV#0*JKuY`>&`u}A6m!5W{+4T+^S!~O-W9)$bKNyNQJ9YCw=@8Q_ zJwN!mYxpOkr_J`Oh9c?W)+=uydzw(eB*2!$G^(3N1p=NB1;_)DHGu-kH9% zChsY1NJwyLIi)F#y4Tl9eu2f|Sh$e|Qn^(a6o}5wHr%yq7yJ74po?GG+uLuwda)a9 z%n^#;t*h(n4`iZDB~oeZg$uB8;Pnw3o7kZe6RtquV_n`?y5D!$wU2LV%TOy{H05#V7IPy&q1S1!Pq^Jc6Mbj75!h8fD_u$ sc2(GuCwB(P;>j9U8WO5(2@W3t-EzaKvd@BNz;6!l#{_!|(9ya70F!W1lK=n! literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_highlighted_6_ambient.png b/common/src/androidTest/resources/area/mines_around_highlighted_6_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec9ac4876c49ea99c809b0edf90e8add857c8b5 GIT binary patch literal 1927 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 EFI&d>Z~y=R literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/mines_around_highlighted_8_ambient.png b/common/src/androidTest/resources/area/mines_around_highlighted_8_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..5c702fa3775f8ab3f427bb74b522a4fad448de66 GIT binary patch literal 2042 zcmbVNdpy(o8~?hrxs0ggNOEgM3=3&~*6GZp8S+)+?yK+$3k_9h35fN$;XbgkFxpuM zN79`=Jk;ri$295F-hqLSqf}2T&XM#I5)$$wc3TIvb@cVA5sAcnH<;Q5-RSv|SZQl| zxQ%Lt@G^^KfPkE$w^`8RCflo;ntmFK*5TmP7z_rGN(Gjc_E>%pmmML0eW##|t|TND zJWlz+=5p18+bQS+3^X3Ui^*j2z`*?cd`BHzUlUwfRwk;5>W*Lk9`m54rjsbR99p8` z(9qCOU0aKZi;HVn;*z_j5dB13&jUlxuBJx#1+C$a+>D>!9v!i*v{U* zYbL&`q2Yo@TVtb+hK5Ephob zX;twmv_4~9^Nf&x>8x`9^sO0*zvqp!3uf6Uq9npOQf$^tyhDljgC)PSv(s|1O;=Ue z+v{=T=FJSz%$vq`81^d})tt1*nu6_ir^B$3k&zu89YDC>X3dst{coOs&BuiW=adx3 zjZ4%l0o;JLI{}7O1eyaLPUZ?X3Gmmt1@@xt$r&xkM?jv9P3l z94YrQ1%W^$ku>&5X=$k%)s%r%zJeCFR(Y!=ElwPM`d3&cGt9p1!lSx#$ed_<^R< z-$vUHBVA3NiWE}!Vd#<1mWBwHD1+@zRr$m*$wJ(1LgqqwPoAMO)OC2wN@PQ$(X?`p zA3~vW#>V{Q)4>)9b~-ydmkz}>z0EBsD3H4Ufzf5pxR_|a{+uYDi-YT2k<2Oy5s`6m zU?Jk`DkZa$bJx_MBfJ*Du)ex@hAukKEJtL{V(h3`1rW>LQZb(R9CusX~gm7DWb1~SS;2xG_+3A z+uzNL4|;s@&Rg?M9f-vl3Wf4EhWR=1QRv8EJ>o(6Mr!R3c&d>~35zu$F3Q%F{Z!Qw zpox-14ZLm(vR1qd$a#U5k)bXd81SO3Evp9Ao?fzDvOW6JILONk>J%J&^GgCTS)puH z-1ytOWim?Mt!|Gx7x}lCGhMelpZLeGO8MQN6T=9E_j#kUeV2`&m4_fQcba;ABIErE zVLUi@-OlWHT_;VR@pA&-$RKZv5A%U)=k@U0+M=tQAeoCJ_B$aUZ3xI1yW_nK$vT=s zi?+X(vEA_gd^S5%39R{UewbTQUhX32jomgAyJ>|CQ|fp1G~ily+Al_x7um$N!6;Ix71jb*yh}jODx<8d?$^tvKj7{iY!b`Nvwl z`R4b}znNv%8JkvkP0xsmo6k>!?sK_KI1*C-5#!)C0CD(m`t|F(;8s?#q$qWD^}l4( z;4kAXr@oAvmo_vUMpk&qLxc+#c5MM4g98J*+y7Yi#^ciitTGa22d+CxvY*b8-oN6U zBCjnUY^QE*E?zY%a5K8@9!erXkHk&5{HMa|3~N{S^0J-3zkdkdSH8ad`g&y`gvU?u zxh&VSE~237?p=^v8{Q!`S5{VDKcP|`zHLUWuB}*{EaktG3V{IgI-#R630HKvpKdl3SRPw*(IKn%Dw(zYZ?37&yQY7MQwY{ z#g%)+w@F0ledLU}R$Jeg@PGM#ko(;C+_)dc7M)83bVB!8y(zKE+8TB0b4=!}e_#Ce zpDNpZHEZjo8oTS4FJEro?ec$*<>QYLmGiRq#;w-i3e}4LcG&#p+pyH9QMDK9VI zwR7js0{QlxJ9cycHB{6e`*X)fZL$Pk`}_0X?2kPzv~E@m#;f_uscK@lbvF z6W$QS;onb4f-sk35{InVz;e za?91mdKI;Vst0CUz$<^TWy literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/uncovered_highlighted_ambient.png b/common/src/androidTest/resources/area/uncovered_highlighted_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..d650c3803d3a2aaec97b13378474c9b1681fc32a GIT binary patch literal 1045 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 literal 0 HcmV?d00001 diff --git a/common/src/androidTest/resources/area/uncovered_mine_exploded_ambient.png b/common/src/androidTest/resources/area/uncovered_mine_exploded_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..c134e24a1ade0949f0b9f87630ec13fb612ccfb8 GIT binary patch literal 2017 zcmV<72Oju|P)Px#1am@3R0s$N2z&@+hyVZwi%CR5RCt{2onJ_kT^z^1`(rLxZPe1n`a>)fFEUC3 z3r80bR2Nyyu1e|OD7BnYV6^P-Dzb7F;V`i<@1m%Sq^|l)MNt%F3rf7`4_jMSHrO1? zJ@3U@>HEI$zRuszohP3UJm8*(=X;KPINRBI&N)*7kf0zW+J8G~Hk&bJ$`lw32B_8Q z(XP{&A|8*Ux3?F5zaQVfe;;y9g}=3&($Z2G3bt!dh-n?0wKYzY7_?&W#-eI@frQ+h^!RL~Hl$MrC^XARVcm>D$QC3za z6&4ms03|5pFf8}X1RX-I&3x@R4NtJ0FaZDgK#*U>3S&u=BJUQ8wR=Ue#F@F4b0DxjeU=%q5qsS2$MUKEIas)<^ zBQS~_fl=fLjI8A3hr|k(HG-qKt9l#>uMn$U;tjem*KHDoC;% z4hN=9n?{nwjV$E2-EOjxb2+sh;pNPkGY4g5Wu%##Hf@qc>k(c~V`C$ErbeT|!Gj0M zbEy$pPDx1#mMvSxl3h_zfmyR=v1C&rw4A1!pf(5K) ztX;cS=+?tNo%7`5( zc00<;%Q=e}F*chGHk)nO_r+o{JbwHb@87>?s8tfSw>7O+i<2i$a>Zwy?CfluIdg`! z3^qA+b#<6Ib0$~35Ug6Y3QLwOVasQcV>BAEXU`svXyIsSXbIIj+yWywHl{SpQehFC9SQkq zA3sPl$wvqp8ygV}2B~9(=E{{TX+5y}FUaLYqfxkAF6vlei9{mUwrv|rHp{4VTU#4m zy?VtFEgWvQo3s-!7#2B_Bw^>yogC3Z(bLnzGT@nl?Mdj(n>R_nkckLKCtxtFQ=_V@ ztN++9rd*wX!LZ8l`Fwcr-~ne58H01eV+vL|1qB5tDJkJBB4gCo*Rz+wD#z>fLZwo1 z7LhSlu3X7Bk2?jMoYkvW|M5>n&z(D$_8Qgy1B)E3Rtt~E!x1eM)2C0zzJ2@H@>%3K zoz6dgLSc#>J9Z#1FOMagT#nIb#NNGosbhsDD=P~ZE?i*ACYN*g@Zm8tp)kdwMT@X* z-8%AIQaM(ub;NrG$Q6&r1HE2Pnn^0>?AfzpZbD%SlgUInxdR}SvvlcF_I|(UR904^ zsHli6k3^1ItwwWmGewlFQK?j%MnVbC>mgwHZo09!Gh3Io`c{$68Lh2)h~HvuDrPSIT)j9%01*0?PrC zlPA7?`^J*}_3Kx--ENj_DukBP*Vo6^sc^Ym!v8j^&~kv}#69ZIp6>2$w6wI4W^y3B z901s`VFT&IyqcOCS*(7Lg`BRgE_l6OlB~OT@8ZUd8zfoW$U+VP?B2Z_pFe*dQHCT* zsI06csu4f3k<-`LH{zv?t*xzi{rWXgjrfs`8~|uRXZ(Y*K)=ZiX4Gao;H&hEF6Cfh0-EmebqY3yZ~)={hO=#A>x75C|mY`2BwJW!ehq zVKf>M3j0BPaEg_7NFmr}2lBQr;BZLO4>o11$5`$BPXv9xB*8cC^r%%7G z{X-6rTu-mp>tQmPlqKxUNRos=An@xmW-xyN8+O?PKGRfw00000NkvXXu0mjftV__% literal 0 HcmV?d00001 diff --git a/common/src/main/java/dev/lucasnlm/antimine/common/level/model/AreaPalette.kt b/common/src/main/java/dev/lucasnlm/antimine/common/level/model/AreaPalette.kt new file mode 100644 index 00000000..d41352ea --- /dev/null +++ b/common/src/main/java/dev/lucasnlm/antimine/common/level/model/AreaPalette.kt @@ -0,0 +1,85 @@ +package dev.lucasnlm.antimine.common.level.model + +import android.content.Context +import android.graphics.Color +import androidx.annotation.ColorInt +import androidx.core.content.ContextCompat +import dev.lucasnlm.antimine.common.R + +data class AreaPalette( + @ColorInt val border: Int, + @ColorInt val covered: Int, + @ColorInt val uncovered: Int, + @ColorInt val minesAround1: Int, + @ColorInt val minesAround2: Int, + @ColorInt val minesAround3: Int, + @ColorInt val minesAround4: Int, + @ColorInt val minesAround5: Int, + @ColorInt val minesAround6: Int, + @ColorInt val minesAround7: Int, + @ColorInt val minesAround8: Int, + @ColorInt val highlight: Int, + @ColorInt val focus: Int +) { + companion object { + private fun toArgb(color: Int): Int { + return Color.argb( + 0xFF, + Color.red(color), + Color.green(color), + Color.blue(color) + ) + } + + fun fromLightTheme() = + AreaPalette( + border = toArgb(0x424242), + covered = toArgb(0x424242), + uncovered = toArgb(0xd5d2cc), + minesAround1 = toArgb(0x527F8D), + minesAround2 = toArgb(0x2B8D43), + minesAround3 = toArgb(0xE65100), + minesAround4 = toArgb(0x20A5f7), + minesAround5 = toArgb(0xED1C24), + minesAround6 = toArgb(0xFFC107), + minesAround7 = toArgb(0x66126B), + minesAround8 = toArgb(0x000000), + highlight = toArgb(0x212121), + focus = toArgb(0xD32F2F) + ) + + fun fromDefault(context: Context) = + AreaPalette( + border = ContextCompat.getColor(context, R.color.view_cover), + covered = ContextCompat.getColor(context, R.color.view_cover), + uncovered = ContextCompat.getColor(context, R.color.view_clean), + minesAround1 = ContextCompat.getColor(context, R.color.mines_around_1), + minesAround2 = ContextCompat.getColor(context, R.color.mines_around_2), + minesAround3 = ContextCompat.getColor(context, R.color.mines_around_3), + minesAround4 = ContextCompat.getColor(context, R.color.mines_around_4), + minesAround5 = ContextCompat.getColor(context, R.color.mines_around_5), + minesAround6 = ContextCompat.getColor(context, R.color.mines_around_6), + minesAround7 = ContextCompat.getColor(context, R.color.mines_around_7), + minesAround8 = ContextCompat.getColor(context, R.color.mines_around_8), + highlight = ContextCompat.getColor(context, R.color.highlight), + focus = ContextCompat.getColor(context, R.color.accent) + ) + + fun fromContrast(context: Context) = + AreaPalette( + border = ContextCompat.getColor(context, android.R.color.white), + covered = ContextCompat.getColor(context, android.R.color.black), + uncovered = ContextCompat.getColor(context, android.R.color.black), + minesAround1 = ContextCompat.getColor(context, R.color.white), + minesAround2 = ContextCompat.getColor(context, R.color.white), + minesAround3 = ContextCompat.getColor(context, R.color.white), + minesAround4 = ContextCompat.getColor(context, R.color.white), + minesAround5 = ContextCompat.getColor(context, R.color.white), + minesAround6 = ContextCompat.getColor(context, R.color.white), + minesAround7 = ContextCompat.getColor(context, R.color.white), + minesAround8 = ContextCompat.getColor(context, R.color.white), + highlight = ContextCompat.getColor(context, R.color.white), + focus = ContextCompat.getColor(context, R.color.white) + ) + } +} diff --git a/common/src/main/java/dev/lucasnlm/antimine/common/level/view/AreaPainter.kt b/common/src/main/java/dev/lucasnlm/antimine/common/level/view/AreaPainter.kt index 359fc8e2..61319771 100644 --- a/common/src/main/java/dev/lucasnlm/antimine/common/level/view/AreaPainter.kt +++ b/common/src/main/java/dev/lucasnlm/antimine/common/level/view/AreaPainter.kt @@ -4,10 +4,10 @@ import android.content.Context import android.graphics.Canvas import android.graphics.Paint import android.graphics.RectF -import androidx.core.content.ContextCompat import dev.lucasnlm.antimine.common.R import dev.lucasnlm.antimine.common.level.data.Area import dev.lucasnlm.antimine.common.level.data.Mark +import dev.lucasnlm.antimine.common.level.model.AreaPalette import dev.lucasnlm.antimine.common.level.repository.DrawableRepository fun Area.paintOnCanvas(context: Context, @@ -17,6 +17,7 @@ fun Area.paintOnCanvas(context: Context, isFocused: Boolean, drawableRepository: DrawableRepository, paintSettings: AreaPaintSettings, + areaPalette: AreaPalette, markPadding: Int? = null, minePadding: Int? = null ) { @@ -27,13 +28,13 @@ fun Area.paintOnCanvas(context: Context, style = Paint.Style.STROKE strokeWidth = 2.0f isAntiAlias = !isLowBitAmbient - color = ContextCompat.getColor(context, android.R.color.white) + color = areaPalette.border } } else { painter.apply { style = Paint.Style.FILL isAntiAlias = !isLowBitAmbient - color = ContextCompat.getColor(context, R.color.view_cover) + color = areaPalette.covered alpha = if(highlighted) 155 else 255 } } @@ -79,13 +80,13 @@ fun Area.paintOnCanvas(context: Context, style = Paint.Style.STROKE strokeWidth = 0.5f isAntiAlias = !isLowBitAmbient - color = ContextCompat.getColor(context, android.R.color.white) + color = areaPalette.border } } else { painter.apply { style = Paint.Style.FILL isAntiAlias = !isLowBitAmbient - color = ContextCompat.getColor(context, R.color.view_clean) + color = areaPalette.uncovered } } @@ -110,22 +111,16 @@ fun Area.paintOnCanvas(context: Context, ) mine?.draw(canvas) } else if (minesAround > 0) { - val color = if (isAmbientMode) { - R.color.ambient_color_white - } else { - when (minesAround) { - 1 -> R.color.mines_around_1 - 2 -> R.color.mines_around_2 - 3 -> R.color.mines_around_3 - 4 -> R.color.mines_around_4 - 5 -> R.color.mines_around_5 - 6 -> R.color.mines_around_6 - 7 -> R.color.mines_around_7 - else -> R.color.mines_around_8 - } + painter.color = when (minesAround) { + 1 -> areaPalette.minesAround1 + 2 -> areaPalette.minesAround2 + 3 -> areaPalette.minesAround3 + 4 -> areaPalette.minesAround4 + 5 -> areaPalette.minesAround5 + 6 -> areaPalette.minesAround6 + 7 -> areaPalette.minesAround7 + else -> areaPalette.minesAround8 } - - painter.color = ContextCompat.getColor(context, color) drawText(canvas, painter, minesAround.toString(), paintSettings) } @@ -137,11 +132,7 @@ fun Area.paintOnCanvas(context: Context, style = Paint.Style.STROKE strokeWidth = highlightWidth isAntiAlias = !isLowBitAmbient - color = if (isAmbientMode) { - ContextCompat.getColor(context, R.color.white) - } else { - ContextCompat.getColor(context, R.color.highlight) - } + color = areaPalette.highlight val rect = RectF( rectF.left + halfWidth, @@ -163,7 +154,7 @@ fun Area.paintOnCanvas(context: Context, style = Paint.Style.STROKE strokeWidth = highlightWidth isAntiAlias = !isLowBitAmbient - color = ContextCompat.getColor(context, R.color.accent) + color = areaPalette.focus } val rect = RectF( diff --git a/common/src/main/java/dev/lucasnlm/antimine/common/level/view/AreaView.kt b/common/src/main/java/dev/lucasnlm/antimine/common/level/view/AreaView.kt index f6e197d5..21d5e1e3 100755 --- a/common/src/main/java/dev/lucasnlm/antimine/common/level/view/AreaView.kt +++ b/common/src/main/java/dev/lucasnlm/antimine/common/level/view/AreaView.kt @@ -14,6 +14,7 @@ import android.os.Build import androidx.core.view.ViewCompat import dev.lucasnlm.antimine.common.R import dev.lucasnlm.antimine.common.level.data.Mark +import dev.lucasnlm.antimine.common.level.model.AreaPalette class AreaView : View { // Used on Wear OS @@ -22,6 +23,7 @@ class AreaView : View { private var area: Area? = null private lateinit var paintSettings: AreaPaintSettings + private lateinit var palette: AreaPalette private val drawableRepository = DrawableRepository() constructor(context: Context) @@ -45,6 +47,12 @@ class AreaView : View { ).firstOrNull { it } ?: false if (changed) { + this.palette = if (isAmbientMode) { + AreaPalette.fromContrast(context) + } else { + AreaPalette.fromDefault(context) + } + this.isAmbientMode = isAmbientMode this.isLowBitAmbient = isLowBitAmbient @@ -97,7 +105,16 @@ class AreaView : View { setBackgroundResource(android.R.color.transparent) } - area?.paintOnCanvas(context, canvas, isAmbientMode, isLowBitAmbient, isFocused, drawableRepository, paintSettings) + area?.paintOnCanvas( + context, + canvas, + isAmbientMode, + isLowBitAmbient, + isFocused, + drawableRepository, + paintSettings, + palette + ) } private fun getRippleEffect(context: Context): Drawable? { diff --git a/wear/src/main/java/dev/lucasnlm/antimine/wear/WatchGameActivity.kt b/wear/src/main/java/dev/lucasnlm/antimine/wear/WatchGameActivity.kt index a96dbe42..bc609322 100644 --- a/wear/src/main/java/dev/lucasnlm/antimine/wear/WatchGameActivity.kt +++ b/wear/src/main/java/dev/lucasnlm/antimine/wear/WatchGameActivity.kt @@ -151,8 +151,6 @@ class WatchGameActivity : DaggerAppCompatActivity(), AmbientModeSupport.AmbientC private fun onGameEvent(event: GameEvent) { when (event) { - GameEvent.ResumeGame -> { - } GameEvent.StartNewGame -> { gameStatus = GameStatus.PreGame } @@ -160,13 +158,13 @@ class WatchGameActivity : DaggerAppCompatActivity(), AmbientModeSupport.AmbientC gameStatus = GameStatus.Running } GameEvent.Victory -> { - gameStatus = GameStatus.Over + gameStatus = GameStatus.Over() messageText.text = getString(R.string.victory) waitAndShowNewGameButton() } GameEvent.GameOver -> { - gameStatus = GameStatus.Over + gameStatus = GameStatus.Over() viewModel.stopClock() viewModel.gameOver() @@ -174,21 +172,23 @@ class WatchGameActivity : DaggerAppCompatActivity(), AmbientModeSupport.AmbientC waitAndShowNewGameButton() } GameEvent.ResumeVictory -> { - gameStatus = GameStatus.Over + gameStatus = GameStatus.Over() messageText.text = getString(R.string.victory) + waitAndShowNewGameButton(0L) } GameEvent.ResumeGameOver -> { - gameStatus = GameStatus.Over + gameStatus = GameStatus.Over() messageText.text = getString(R.string.game_over) + waitAndShowNewGameButton(0L) } else -> { } } } - private fun waitAndShowNewGameButton() { + private fun waitAndShowNewGameButton(wait: Long = DateUtils.SECOND_IN_MILLIS) { HandlerCompat.postDelayed(Handler(), { - if (this.gameStatus == GameStatus.Over && !isFinishing) { + if (this.gameStatus is GameStatus.Over && !isFinishing) { newGame.visibility = View.VISIBLE newGame.setOnClickListener { it.visibility = View.GONE @@ -197,7 +197,7 @@ class WatchGameActivity : DaggerAppCompatActivity(), AmbientModeSupport.AmbientC } } } - }, null, DateUtils.SECOND_IN_MILLIS) + }, null, wait) } override fun getAmbientCallback(): AmbientCallback = ambientMode diff --git a/wear/src/main/java/dev/lucasnlm/antimine/wear/WatchLevelFragment.kt b/wear/src/main/java/dev/lucasnlm/antimine/wear/WatchLevelFragment.kt index 2c5e3f15..34f2391a 100644 --- a/wear/src/main/java/dev/lucasnlm/antimine/wear/WatchLevelFragment.kt +++ b/wear/src/main/java/dev/lucasnlm/antimine/wear/WatchLevelFragment.kt @@ -101,6 +101,12 @@ class WatchLevelFragment: DaggerFragment() { if (it == GameEvent.StartNewGame) { recyclerGrid.scrollToPosition(areaAdapter.itemCount / 2) } + + when (it) { + GameEvent.ResumeGameOver, GameEvent.GameOver, + GameEvent.Victory, GameEvent.ResumeVictory -> areaAdapter.setClickEnabled(false) + else -> areaAdapter.setClickEnabled(true) + } }) } }