Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
meikpiep committed Jan 13, 2025
1 parent 8c5ec0d commit 0f8bc76
Show file tree
Hide file tree
Showing 50 changed files with 143 additions and 66 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.piepmeyer.gauguin

import android.content.SharedPreferences
import org.koin.core.module.Module
import org.koin.core.module.dsl.binds
import org.koin.core.module.dsl.createdAtStart
import org.koin.core.module.dsl.withOptions
import org.koin.dsl.module
import org.piepmeyer.gauguin.preferences.ApplicationPreferences
import org.piepmeyer.gauguin.preferences.ApplicationPreferencesImpl
import org.piepmeyer.gauguin.preferences.StatisticsManager
import org.piepmeyer.gauguin.preferences.StatisticsManagerImpl
import org.piepmeyer.gauguin.ui.ActivityUtils
import java.io.File

class ApplicationModule(
private val filesDir: File,
private val statisticsPreferences: SharedPreferences,
private val applicationPreferences: ApplicationPreferencesImpl,
) {
fun module(): Module =
module {
single {
applicationPreferences
} withOptions { binds(listOf(ApplicationPreferences::class)) }
single {
StatisticsManagerImpl(
filesDir,
statisticsPreferences,
)
} withOptions {
binds(listOf(StatisticsManager::class))
createdAtStart()
}
single { ActivityUtils() }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,12 @@ import android.content.Context
import com.google.android.material.color.DynamicColors
import com.google.android.material.color.DynamicColorsOptions
import io.github.oshai.kotlinlogging.KotlinLogging
import org.koin.android.ext.android.get
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin
import org.koin.core.module.dsl.binds
import org.koin.core.module.dsl.createdAtStart
import org.koin.core.module.dsl.withOptions
import org.koin.dsl.module
import org.piepmeyer.gauguin.preferences.ApplicationPreferences
import org.koin.core.module.Module
import org.piepmeyer.gauguin.preferences.ApplicationPreferencesImpl
import org.piepmeyer.gauguin.preferences.StatisticsManager
import org.piepmeyer.gauguin.preferences.StatisticsManagerImpl
import org.piepmeyer.gauguin.ui.ActivityUtils
import org.piepmeyer.gauguin.ui.DynamicColorsPrecondition

Expand All @@ -29,47 +24,47 @@ class MainApplication : Application() {

val applicationPreferences = ApplicationPreferencesImpl(this)

val options =
DynamicColorsOptions.Builder()
.setThemeOverlay(R.style.AppTheme_Overlay)
.setPrecondition(DynamicColorsPrecondition())
.build()

DynamicColors.applyToActivitiesIfAvailable(this, options)

startKoin {
androidLogger()
androidContext(this@MainApplication)

val appModule =
module {
single {
applicationPreferences
} withOptions { binds(listOf(ApplicationPreferences::class)) }
single {
StatisticsManagerImpl(
filesDir,
this@MainApplication.getSharedPreferences("stats", Context.MODE_PRIVATE),
)
} withOptions {
binds(listOf(StatisticsManager::class))
createdAtStart()
}
single { ActivityUtils() }
}
val statisticsPreferences = getSharedPreferences("stats", Context.MODE_PRIVATE)

applicationPreferences.migrateGridSizeFromTwoToThree()

modules(
CoreModule(filesDir).module(),
appModule,
)
var modules =
listOf(
CoreModule(filesDir).module(),
ApplicationModule(filesDir, statisticsPreferences, applicationPreferences).module(),
)

testOverideModule?.let {
modules += it
}

modules(modules)
}

val options =
DynamicColorsOptions
.Builder()
.setThemeOverlay(R.style.AppTheme_Overlay)
.setPrecondition(DynamicColorsPrecondition())
.build()

DynamicColors.applyToActivitiesIfAvailable(this, options)

val activityUtils = get<ActivityUtils>()
activityUtils.configureNightMode()

logger.info {
"Gauguin application started successfully, " +
"version ${resources.getString(R.string.versionName)}, " +
"debug flag ${resources.getBoolean(R.bool.debuggable)}."
}
}

companion object {
var testOverideModule: Module? = null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import org.koin.android.ext.android.inject
import org.piepmeyer.gauguin.R
import org.piepmeyer.gauguin.databinding.ActivityAboutBinding

class AboutActivity : AppCompatActivity() {
Expand All @@ -13,8 +12,10 @@ class AboutActivity : AppCompatActivity() {
private lateinit var binding: ActivityAboutBinding

public override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme)
activityUtils.configureTheme(this)

super.onCreate(savedInstanceState)

binding = ActivityAboutBinding.inflate(layoutInflater)
setContentView(binding.root)

Expand All @@ -26,7 +27,9 @@ class AboutActivity : AppCompatActivity() {

binding.aboutShareApplicationLog.setOnClickListener {
val reversedLines =
Runtime.getRuntime().exec("logcat -d")
Runtime
.getRuntime()
.exec("logcat -d")
.inputStream
.bufferedReader()
.readLines()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,17 @@ class ActivityUtils : KoinComponent {
}

fun configureTheme(activity: Activity) {
if (applicationPreferences.theme != Theme.DYNAMIC_COLORS) {
activity.setTheme(R.style.AppTheme)
}
}

fun configureNightMode() {
when (applicationPreferences.theme) {
Theme.LIGHT -> {
activity.setTheme(R.style.AppTheme)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
Theme.DARK -> {
activity.setTheme(R.style.AppTheme)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
Theme.SYSTEM_DEFAULT, Theme.DYNAMIC_COLORS -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ class LoadGameListActivity : AppCompatActivity() {
private lateinit var empty: View

public override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme)
activityUtils.configureTheme(this)

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_savegame)

val recyclerView = findViewById<RecyclerView>(android.R.id.list)

activityUtils.configureTheme(this)
activityUtils.configureFullscreen(this)

empty = findViewById(android.R.id.empty)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ class SettingsActivity : AppCompatActivity() {
private val activityUtils: ActivityUtils by inject()

override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme)
activityUtils.configureTheme(this)

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_settings)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,37 +35,40 @@ class ThemeChooserFragment(

binding.navigationDrawerThemeLight.isChecked = preferences.theme == Theme.LIGHT
binding.navigationDrawerThemeLight.setOnClickListener {
preferences.theme = Theme.LIGHT
activityUtils.configureTheme(mainActivity)
switchToTheme(Theme.LIGHT)
}

binding.navigationDrawerThemeDark.isChecked = preferences.theme == Theme.DARK
binding.navigationDrawerThemeDark.setOnClickListener {
preferences.theme = Theme.DARK
activityUtils.configureTheme(mainActivity)
switchToTheme(Theme.DARK)
}

binding.navigationDrawerThemeAuto.isChecked = preferences.theme == Theme.SYSTEM_DEFAULT
binding.navigationDrawerThemeAuto.setOnClickListener {
preferences.theme = Theme.SYSTEM_DEFAULT
activityUtils.configureTheme(mainActivity)
switchToTheme(Theme.SYSTEM_DEFAULT)
}

binding.navigationDrawerThemeDynamicColors.isChecked = preferences.theme == Theme.DYNAMIC_COLORS
binding.navigationDrawerThemeDynamicColors.setOnClickListener {
preferences.theme = Theme.DYNAMIC_COLORS
activityUtils.configureTheme(mainActivity)

val options =
DynamicColorsOptions
.Builder()
.setThemeOverlay(R.style.AppTheme_Overlay)
.setPrecondition(DynamicColorsPrecondition())
.build()

DynamicColors.applyToActivitiesIfAvailable(this.mainActivity.application, options)
switchToTheme(Theme.DYNAMIC_COLORS)
}

return binding.root
}

private fun switchToTheme(theme: Theme) {
preferences.theme = theme

activityUtils.configureTheme(mainActivity)
activityUtils.configureNightMode()

val options =
DynamicColorsOptions
.Builder()
.setThemeOverlay(R.style.AppTheme_Overlay)
.setPrecondition(DynamicColorsPrecondition())
.build()

DynamicColors.applyToActivitiesIfAvailable(this.mainActivity.application, options)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ class NewGameActivity : AppCompatActivity() {
private lateinit var viewModel: NewGameViewModel

public override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme)
activityUtils.configureTheme(this)

super.onCreate(savedInstanceState)

val binding = ActivityNewgameBinding.inflate(layoutInflater)
setContentView(binding.root)

activityUtils.configureTheme(this)
activityUtils.configureFullscreen(this)

val startNewGameButton = binding.startnewgame
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,17 @@ class StatisticsActivity : AppCompatActivity() {
private var multiDiagramFragment: StatisticsMultiDiagramFragment? = null

public override fun onCreate(savedInstanceState: Bundle?) {
setTheme(R.style.AppTheme)
activityUtils.configureTheme(this)

super.onCreate(savedInstanceState)

binding = ActivityStatisticsBinding.inflate(layoutInflater)
setContentView(binding.root)

binding.clearstats.setOnClickListener { _: View? ->
resetStatisticsDialog()
}

activityUtils.configureTheme(this)
activityUtils.configureFullscreen(this)

scatterPlotDiagramFragment = StatisticsScatterPlotDiagramFragment()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,36 @@ package org.piepmeyer.gauguin.ui.newgame

import com.github.takahirom.roborazzi.captureRoboImage
import com.google.android.material.tabs.TabLayout
import io.mockk.every
import io.mockk.mockk
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.experimental.categories.Category
import org.junit.runner.RunWith
import org.koin.core.context.stopKoin
import org.koin.test.KoinTest
import org.koin.core.module.dsl.binds
import org.koin.core.module.dsl.withOptions
import org.koin.dsl.module
import org.piepmeyer.gauguin.MainApplication
import org.piepmeyer.gauguin.R
import org.piepmeyer.gauguin.ScreenshotTest
import org.piepmeyer.gauguin.ScreenshotTestUtils
import org.piepmeyer.gauguin.Theme
import org.piepmeyer.gauguin.creation.GridCreator
import org.piepmeyer.gauguin.creation.RandomPossibleDigitsShuffler
import org.piepmeyer.gauguin.creation.SeedRandomizerMock
import org.piepmeyer.gauguin.grid.Grid
import org.piepmeyer.gauguin.grid.GridSize
import org.piepmeyer.gauguin.options.DifficultySetting
import org.piepmeyer.gauguin.options.DigitSetting
import org.piepmeyer.gauguin.options.GameOptionsVariant
import org.piepmeyer.gauguin.options.GameVariant
import org.piepmeyer.gauguin.options.GridCageOperation
import org.piepmeyer.gauguin.options.NumeralSystem
import org.piepmeyer.gauguin.options.SingleCageUsage
import org.piepmeyer.gauguin.preferences.ApplicationPreferences
import org.piepmeyer.gauguin.ui.grid.GridUI
import org.robolectric.ParameterizedRobolectricTestRunner
import org.robolectric.annotation.Config
Expand All @@ -37,7 +50,7 @@ import sergio.sastre.uitesting.utils.common.UiMode
@GraphicsMode(GraphicsMode.Mode.NATIVE)
class NewGameActivityScreenshotTest(
private val testItem: TestDataForActivity<UiStateEnum>,
) : KoinTest {
) {
enum class UiStateEnum {
TabBasic,
TabNumbers,
Expand Down Expand Up @@ -76,6 +89,26 @@ class NewGameActivityScreenshotTest(
deviceScreen = testItem.device,
)

@Before
fun before() {
MainApplication.testOverideModule =
module {
single {
mockk<ApplicationPreferences>(relaxed = true) {
every { theme } returns Theme.LIGHT
every { difficultySetting } returns DifficultySetting.ANY
every { digitSetting } returns DigitSetting.FIRST_DIGIT_ONE
every { numeralSystem } returns NumeralSystem.Decimal
every { operations } returns GridCageOperation.OPERATIONS_ALL
every { singleCageUsage } returns SingleCageUsage.FIXED_NUMBER
every { gridWidth } returns 9
every { gridHeigth } returns 9
every { gameVariant } returns GameOptionsVariant.createClassic()
}
} withOptions { binds(listOf(ApplicationPreferences::class)) }
}
}

@After
fun after() {
stopKoin()
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 0f8bc76

Please sign in to comment.