Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
meikpiep committed Jan 28, 2024
1 parent a665d10 commit 860c9b2
Show file tree
Hide file tree
Showing 20 changed files with 368 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package org.piepmeyer.gauguin.preferences

import android.content.SharedPreferences
import androidx.core.content.edit
import org.piepmeyer.gauguin.Utils
import org.piepmeyer.gauguin.grid.Grid
import kotlin.time.Duration
import kotlin.time.Duration.Companion.ZERO
import kotlin.time.Duration.Companion.milliseconds

Expand Down Expand Up @@ -34,27 +34,31 @@ class StatisticsManagerImpl(
}
}

override fun storeStatisticsAfterFinishedGame(grid: Grid): String? {
val gridsize = grid.gridSize

// assess hint penalty - gridsize^2/2 seconds for each cell
val penalty = grid.countCheated().toLong() * 500 * gridsize.surfaceArea
grid.playTime = grid.playTime + penalty.milliseconds
override fun storeStatisticsAfterFinishedGame(grid: Grid) {
val key = getBestTimeKey(grid)
val solvetime = grid.playTime

val timestat = stats.getLong("solvedtime$gridsize", 0).milliseconds
val editor = stats.edit()
val recordTime =
if (timestat == ZERO || timestat > solvetime) {
editor.putLong("solvedtime$gridsize", solvetime.inWholeMilliseconds)
Utils.displayableGameDuration(solvetime)
val bestTime = stats.getLong(key, 0).milliseconds

if (bestTime == ZERO || bestTime > solvetime) {
stats.edit { putLong(key, solvetime.inWholeMilliseconds) }

if (bestTime == ZERO) {
grid.solvedFirstTimeOfKind = true
} else {
null
grid.solvedBestTimeOfKind = true
}
editor.apply()
return recordTime
}
}

override fun getBestTime(grid: Grid): Duration {
val key = getBestTimeKey(grid)

return stats.getLong(key, 0).milliseconds
}

private fun getBestTimeKey(grid: Grid) = "solvedtime${grid.gridSize}"

override fun storeStreak(isSolved: Boolean) {
val solvedStreak = currentStreak()
val longestStreak = longestStreak()
Expand Down Expand Up @@ -84,4 +88,22 @@ class StatisticsManagerImpl(
override fun clearStatistics() {
stats.edit { clear() }
}

override fun typeOfSolved(grid: Grid): TypeOfSolved {
if (totalSolved() == 1) {
return TypeOfSolved.FirstGame
}

if (grid.solvedFirstTimeOfKind) {
return TypeOfSolved.FirstGameOfKind
}

if (grid.solvedBestTimeOfKind) {
println("-> " + getBestTime(grid))
println(grid.playTime)
return TypeOfSolved.BestTimeOfKind
}

return TypeOfSolved.Regular
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class BottomAppBarItemClickListener(

override fun onMenuItemClick(menuItem: MenuItem): Boolean {
when (menuItem.itemId) {
R.id.hintOrNewGame -> mainActivity.checkProgressOrStartNewGame()
R.id.undo -> game.undoOneStep()
R.id.eraser -> game.eraseSelectedCell()
R.id.simulate_game_solved -> game.solveAllMissingCells()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package org.piepmeyer.gauguin.ui.main

import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.piepmeyer.gauguin.R
import org.piepmeyer.gauguin.Utils
import org.piepmeyer.gauguin.databinding.FragmentMainGameSolvedBinding
import org.piepmeyer.gauguin.game.Game
import org.piepmeyer.gauguin.game.GameSolvedListener
import org.piepmeyer.gauguin.game.GridCreationListener
import org.piepmeyer.gauguin.preferences.StatisticsManager
import org.piepmeyer.gauguin.preferences.TypeOfSolved
import org.piepmeyer.gauguin.ui.StatisticsActivity

class GameSolvedFragment :
Fragment(R.layout.fragment_main_game_solved),
KoinComponent,
GameSolvedListener,
GridCreationListener {
private val game: Game by inject()
private val statisticsManager: StatisticsManager by inject()

private lateinit var binding: FragmentMainGameSolvedBinding

override fun onCreateView(
inflater: LayoutInflater,
parent: ViewGroup?,
savedInstanceState: Bundle?,
): View {
binding = FragmentMainGameSolvedBinding.inflate(inflater, parent, false)
return binding.root
}

override fun onViewCreated(
view: View,
savedInstanceState: Bundle?,
) {
binding.showStatisticsButton.setOnClickListener {
requireActivity().startActivity(
Intent(
requireActivity(),
StatisticsActivity::class.java,
),
)
}

game.addGameSolvedHandler(this)
game.addGridCreationListener(this)
}

override fun puzzleSolved(troughReveal: Boolean) {
binding.detailsIcon

if (!troughReveal) {
val iconAndText =
when (statisticsManager.typeOfSolved(game.grid)) {
TypeOfSolved.FirstGame -> Pair(R.drawable.trophy_variant_outline, "Erstes Spiel gewonnen!")
TypeOfSolved.FirstGameOfKind -> Pair(R.drawable.trophy_variant_outline, "Erstes Spiel dieser Art gewonnen!")
TypeOfSolved.BestTimeOfKind -> Pair(R.drawable.podium_gold, "Neue Bestzeit!")
TypeOfSolved.Regular ->
Pair(
null,
"Bestehende Bestzeit: " + Utils.displayableGameDuration(statisticsManager.getBestTime(game.grid)),
)
}

if (iconAndText.first != null) {
binding.detailsIcon.setImageResource(iconAndText.first!!)
} else {
binding.detailsIcon.visibility = View.INVISIBLE
}

binding.detailsText.text = iconAndText.second
} else {
binding.detailsIcon.visibility = View.INVISIBLE
binding.detailsText.visibility = View.INVISIBLE
}

binding.gameSolvedCardView.visibility = View.VISIBLE
}

override fun freshGridWasCreated() {
binding.gameSolvedCardView.visibility = View.GONE
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@ class MainActivity : AppCompatActivity(), GridCreationListener {
private lateinit var binding: ActivityMainBinding
private lateinit var bottomAppBarService: MainBottomAppBarService

private var gameEndedSnackbar: Snackbar? = null

private lateinit var specialListener: OnSharedPreferenceChangeListener

public override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -70,6 +68,7 @@ class MainActivity : AppCompatActivity(), GridCreationListener {
topFragment = GameTopFragment()
ft.replace(R.id.keypadFrame, KeyPadFragment())
ft.replace(R.id.fastFinishingModeFrame, FastFinishingModeFragment())
ft.replace(R.id.gameSolvedFrame, GameSolvedFragment())
ft.replace(R.id.gameTopFrame, topFragment)
ft.commit()

Expand All @@ -79,7 +78,7 @@ class MainActivity : AppCompatActivity(), GridCreationListener {
binding.gridview.invalidate()
}

game.setSolvedHandler { reveal -> gameSolved(reveal) }
game.addGameSolvedHandler { reveal -> gameSolved(reveal) }

registerForContextMenu(binding.gridview)

Expand Down Expand Up @@ -146,20 +145,12 @@ class MainActivity : AppCompatActivity(), GridCreationListener {
private fun gameSolved(reveal: Boolean) {
gameLifecycle.gameSolved()

gameEndedSnackbar = showSnackbar(getString(R.string.puzzle_solved))

bottomAppBarService.updateAppBarState()

binding.hintOrNewGame.hide()
binding.hintOrNewGame.show()

statisticsManager.storeStreak(!reveal)
topFragment.setGameTime(game.grid.playTime)

val recordTime = statisticsManager.storeStatisticsAfterFinishedGame(game.grid)

if (!reveal) {
recordTime?.let { gameEndedSnackbar = showSnackbar("${getString(R.string.puzzle_record_time)} $it") }
val konfettiView = binding.konfettiView

val emitterConfig = Emitter(8L, TimeUnit.SECONDS).perSecond(150)
Expand Down Expand Up @@ -286,9 +277,6 @@ class MainActivity : AppCompatActivity(), GridCreationListener {
}

private fun postNewGame(startedFromMainActivityWithSameVariant: Boolean = false) {
gameEndedSnackbar?.dismiss()
gameEndedSnackbar = null

if (game.grid.isActive && game.grid.startedToBePlayed) {
statisticsManager.storeStreak(false)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class MainBottomAppBarService(

game.undoManager = undoList

binding.hintOrNewGame.setOnClickListener { mainActivity.checkProgressOrStartNewGame() }
binding.hint.setOnClickListener { mainActivity.checkProgressOrStartNewGame() }
undoButton.setOnClickListener { game.undoOneStep() }
eraserButton?.setOnClickListener { game.eraseSelectedCell() }

Expand All @@ -55,14 +55,13 @@ class MainBottomAppBarService(

fun updateAppBarState() {
if (game.grid.isSolved()) {
binding.hintOrNewGame.isEnabled = true
binding.hintOrNewGame.setImageResource(R.drawable.outline_add_24)
binding.hint.hide()

undoButton.visibility = View.GONE
eraserButton?.visibility = View.GONE
} else {
binding.hintOrNewGame.isEnabled = true
binding.hintOrNewGame.setImageResource(R.drawable.baseline_question_mark_24)
binding.hint.isEnabled = true
binding.hint.show()

undoButton.visibility = View.VISIBLE
undoButton.isEnabled = false
Expand Down
1 change: 1 addition & 0 deletions gauguin-app/src/main/res/drawable/flag_checkered.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<!-- drawable/flag_checkered.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M14.4,6H20V16H13L12.6,14H7V21H5V4H14L14.4,6M14,14H16V12H18V10H16V8H14V10L13,8V6H11V8H9V6H7V8H9V10H7V12H9V10H11V12H13V10L14,12V14M11,10V8H13V10H11M14,10H16V12H14V10Z" /></vector>
1 change: 1 addition & 0 deletions gauguin-app/src/main/res/drawable/human_handsup.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<!-- drawable/human_handsup.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M5,1C5,3.7 6.56,6.16 9,7.32V22H11V15H13V22H15V7.31C17.44,6.16 19,3.7 19,1H17A5,5 0 0,1 12,6A5,5 0 0,1 7,1M12,1C10.89,1 10,1.89 10,3C10,4.11 10.89,5 12,5C13.11,5 14,4.11 14,3C14,1.89 13.11,1 12,1Z" /></vector>
1 change: 1 addition & 0 deletions gauguin-app/src/main/res/drawable/podium_gold.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<!-- drawable/podium_gold.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M12,7.09L14.45,8.58L13.8,5.77L16,3.89L13.11,3.64L12,1L10.87,3.64L8,3.89L10.18,5.77L9.5,8.58L12,7.09M15,23H9V10H15V23M1,17V23H7V17H1M5,21H3V19H5V21M17,13V23H23V13H17M21,21H19V15H21V21Z" /></vector>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<!-- drawable/trophy_variant_outline.xml --><vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"><path android:fillColor="#000000" android:pathData="M17 4V2H7V4H2V11C2 12.1 2.9 13 4 13H7.1C7.5 14.96 9.04 16.5 11 16.9V19.08C8 19.54 8 22 8 22H16C16 22 16 19.54 13 19.08V16.9C14.96 16.5 16.5 14.96 16.9 13H20C21.1 13 22 12.1 22 11V4H17M4 11V6H7V11L4 11M15 12C15 13.65 13.65 15 12 15S9 13.65 9 12V4H15V12M20 11L17 11V6H20L20 11Z" /></vector>
17 changes: 15 additions & 2 deletions gauguin-app/src/main/res/layout-land/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="72dp"
android:layout_marginBottom="84dp"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@id/gridview"
app:layout_constraintTop_toBottomOf="@id/gameTopFrame"
Expand All @@ -78,6 +78,18 @@
app:layout_constraintEnd_toEndOf="@id/keypadFrame"
/>

<FrameLayout
android:id="@+id/gameSolvedFrame"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintStart_toEndOf="@id/gridview"
app:layout_constraintTop_toBottomOf="@id/gameTopFrame"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="16dp"
android:layout_marginBottom="84dp"
/>

<ImageView
android:id="@+id/pendingNextGridCalculation"
android:layout_width="wrap_content"
Expand Down Expand Up @@ -105,10 +117,11 @@
app:menu="@menu/bottom_app_bar" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/hintOrNewGame"
android:id="@+id/hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/MainFab"
android:src="@drawable/baseline_question_mark_24"
app:layout_anchor="@id/mainBottomAppBar"
android:text=""
/>
Expand Down
12 changes: 11 additions & 1 deletion gauguin-app/src/main/res/layout-sw600dp-land/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,15 @@
app:layout_constraintTop_toBottomOf="@id/gameTopFrame"
app:layout_constraintBottom_toBottomOf="parent"/>

<FrameLayout
android:id="@+id/gameSolvedFrame"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintStart_toEndOf="@id/gridview"
app:layout_constraintEnd_toEndOf="@id/gameTopFrame"
app:layout_constraintTop_toBottomOf="@id/gameTopFrame"
app:layout_constraintBottom_toBottomOf="parent"/>

<FrameLayout
android:id="@+id/fastFinishingModeFrame"
android:layout_width="wrap_content"
Expand All @@ -104,9 +113,10 @@
app:menu="@menu/bottom_app_bar" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/hintOrNewGame"
android:id="@+id/hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/baseline_question_mark_24"
style="@style/MainFab"
app:layout_anchor="@id/mainBottomAppBar"
/>
Expand Down
17 changes: 13 additions & 4 deletions gauguin-app/src/main/res/layout-sw600dp/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
android:id="@+id/mainConstraintLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="48dp">
android:layout_marginBottom="72dp">

<FrameLayout
android:id="@+id/gameTopFrame"
Expand Down Expand Up @@ -70,14 +70,22 @@
android:id="@+id/keypadFrame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintVertical_bias="0.75"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginBottom="20dp"
/>

<FrameLayout
android:id="@+id/gameSolvedFrame"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="@id/keypadFrame"
app:layout_constraintBottom_toBottomOf="@id/keypadFrame"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>

<FrameLayout
android:id="@+id/fastFinishingModeFrame"
android:layout_width="wrap_content"
Expand Down Expand Up @@ -114,9 +122,10 @@
app:menu="@menu/bottom_app_bar" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/hintOrNewGame"
android:id="@+id/hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/baseline_question_mark_24"
style="@style/MainFab"
app:layout_anchor="@id/mainBottomAppBar"
/>
Expand Down
Loading

0 comments on commit 860c9b2

Please sign in to comment.