Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -115,4 +115,9 @@ class MainInstrumentedTest {
fun settings() {
SettingsInstrumentedTest().run()
}

@Test
fun theme() {
ThemeInstrumentedTest().run()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* WiFiAnalyzer
* Copyright (C) 2026 VREM Software Development <[email protected]>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package com.vrem.wifianalyzer

import androidx.appcompat.app.AppCompatDelegate
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.Espresso.pressBack
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withText
import org.junit.Assert.assertEquals

internal class ThemeInstrumentedTest : Runnable {
override fun run() {
verifyThemeSettings()

listOf(
"Dark" to AppCompatDelegate.MODE_NIGHT_YES,
"Light" to AppCompatDelegate.MODE_NIGHT_NO,
"System" to AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM,
"Black" to AppCompatDelegate.MODE_NIGHT_YES,
).forEach { (themeName, expectedNightMode) ->
changeThemeAndVerify(themeName, expectedNightMode)
}
}

private fun verifyThemeSettings() {
selectMenuItem(R.id.nav_drawer_settings, "Settings")
scrollToAndVerify("Theme")
pressBack()
}

private fun changeThemeAndVerify(
themeName: String,
expectedNightMode: Int,
) {
selectMenuItem(R.id.nav_drawer_settings, "Settings")
scrollToAndVerify("Theme")
onView(withText("Theme")).perform(click())
pauseShort()
onView(withText(themeName)).check(matches(isDisplayed()))
onView(withText(themeName)).perform(click())
pauseShort()
assertEquals(
"Theme $themeName should set night mode to $expectedNightMode",
expectedNightMode,
AppCompatDelegate.getDefaultNightMode(),
)
}
}
7 changes: 6 additions & 1 deletion app/src/main/kotlin/com/vrem/wifianalyzer/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
Expand Down Expand Up @@ -61,7 +62,11 @@ class MainActivity :

val settings = mainContext.settings
settings.initializeDefaultValues()
setTheme(settings.themeStyle().themeNoActionBar)

settings.themeStyle().apply {
AppCompatDelegate.setDefaultNightMode(nightMode)
setTheme(themeNoActionBar)
}

mainReload = MainReload(settings)

Expand Down
10 changes: 6 additions & 4 deletions app/src/main/kotlin/com/vrem/wifianalyzer/settings/ThemeStyle.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,17 @@ package com.vrem.wifianalyzer.settings
import android.graphics.Color
import androidx.annotation.ColorInt
import androidx.annotation.StyleRes
import androidx.appcompat.app.AppCompatDelegate
import com.vrem.wifianalyzer.R

enum class ThemeStyle(
@param:StyleRes val theme: Int,
@param:StyleRes val themeNoActionBar: Int,
@param:ColorInt val colorGraphText: Int,
val nightMode: Int,
) {
DARK(R.style.ThemeDark, R.style.ThemeDarkNoActionBar, Color.WHITE),
LIGHT(R.style.ThemeLight, R.style.ThemeLightNoActionBar, Color.BLACK),
SYSTEM(R.style.ThemeSystem, R.style.ThemeSystemNoActionBar, Color.GRAY),
BLACK(R.style.ThemeBlack, R.style.ThemeBlackNoActionBar, Color.WHITE),
DARK(R.style.ThemeSystem, R.style.ThemeSystemNoActionBar, Color.WHITE, AppCompatDelegate.MODE_NIGHT_YES),
LIGHT(R.style.ThemeSystem, R.style.ThemeSystemNoActionBar, Color.BLACK, AppCompatDelegate.MODE_NIGHT_NO),
SYSTEM(R.style.ThemeSystem, R.style.ThemeSystemNoActionBar, Color.GRAY, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM),
BLACK(R.style.ThemeBlack, R.style.ThemeBlackNoActionBar, Color.WHITE, AppCompatDelegate.MODE_NIGHT_YES),
}
20 changes: 0 additions & 20 deletions app/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,6 @@

<resources>

<!-- Dark theme -->
<style name="ThemeDark" parent="Theme.AppCompat">
<item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
<item name="android:actionMenuTextColor">@color/selected</item>
</style>
<style name="ThemeDarkNoActionBar" parent="ThemeDark">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

<!-- Light theme -->
<style name="ThemeLight" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
<item name="android:actionMenuTextColor">@color/selected</item>
</style>
<style name="ThemeLightNoActionBar" parent="ThemeLight">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>

<!-- Black theme -->
<style name="ThemeBlack" parent="Theme.AppCompat">
<item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.vrem.wifianalyzer.settings

import android.graphics.Color
import androidx.appcompat.app.AppCompatDelegate
import com.vrem.wifianalyzer.R
import org.assertj.core.api.Assertions.assertThat
import org.junit.Test
Expand All @@ -32,16 +33,16 @@ class ThemeStyleTest {

@Test
fun theme() {
assertThat(ThemeStyle.LIGHT.theme).isEqualTo(R.style.ThemeLight)
assertThat(ThemeStyle.DARK.theme).isEqualTo(R.style.ThemeDark)
assertThat(ThemeStyle.LIGHT.theme).isEqualTo(R.style.ThemeSystem)
assertThat(ThemeStyle.DARK.theme).isEqualTo(R.style.ThemeSystem)
assertThat(ThemeStyle.SYSTEM.theme).isEqualTo(R.style.ThemeSystem)
assertThat(ThemeStyle.BLACK.theme).isEqualTo(R.style.ThemeBlack)
}

@Test
fun themeNoActionBar() {
assertThat(ThemeStyle.DARK.themeNoActionBar).isEqualTo(R.style.ThemeDarkNoActionBar)
assertThat(ThemeStyle.LIGHT.themeNoActionBar).isEqualTo(R.style.ThemeLightNoActionBar)
assertThat(ThemeStyle.DARK.themeNoActionBar).isEqualTo(R.style.ThemeSystemNoActionBar)
assertThat(ThemeStyle.LIGHT.themeNoActionBar).isEqualTo(R.style.ThemeSystemNoActionBar)
assertThat(ThemeStyle.SYSTEM.themeNoActionBar).isEqualTo(R.style.ThemeSystemNoActionBar)
assertThat(ThemeStyle.BLACK.themeNoActionBar).isEqualTo(R.style.ThemeBlackNoActionBar)
}
Expand All @@ -54,6 +55,14 @@ class ThemeStyleTest {
assertThat(ThemeStyle.BLACK.colorGraphText).isEqualTo(Color.WHITE)
}

@Test
fun nightMode() {
assertThat(ThemeStyle.DARK.nightMode).isEqualTo(AppCompatDelegate.MODE_NIGHT_YES)
assertThat(ThemeStyle.LIGHT.nightMode).isEqualTo(AppCompatDelegate.MODE_NIGHT_NO)
assertThat(ThemeStyle.SYSTEM.nightMode).isEqualTo(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
assertThat(ThemeStyle.BLACK.nightMode).isEqualTo(AppCompatDelegate.MODE_NIGHT_YES)
}

@Test
fun themeStyleOrdinal() {
assertThat(ThemeStyle.DARK.ordinal).isEqualTo(0)
Expand Down