Skip to content

Commit

Permalink
Merge pull request #522 from KasperskyLab/TECH-dark-mode
Browse files Browse the repository at this point in the history
TECH: (Silinsky) add dark mode screenshots support
  • Loading branch information
ReCursia authored Jun 6, 2023
2 parents 06c7525 + 1beae47 commit 878f14a
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.kaspersky.kaspresso.docloc.rule

import androidx.appcompat.app.AppCompatDelegate
import com.kaspersky.kaspresso.logger.UiTestLogger
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement

class ToggleNightModeRule internal constructor(
private val toggleNightMode: Boolean,
private val logger: UiTestLogger
) : TestRule {

var isNightMode: Boolean = false
private set

override fun apply(base: Statement, description: Description): Statement {
return object : Statement() {
override fun evaluate() {
logger.i("DocLoc: ToggleNightModeRule started")
try {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
isNightMode = false
base.evaluate()
if (toggleNightMode) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
isNightMode = true
base.evaluate()
}
} finally {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_UNSPECIFIED)
isNightMode = false
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.kaspersky.kaspresso.device.screenshots.screenshotmaker.InternalScreen
import com.kaspersky.kaspresso.docloc.DocLocScreenshotCapturer
import com.kaspersky.kaspresso.docloc.MetadataSaver
import com.kaspersky.kaspresso.docloc.rule.LocaleRule
import com.kaspersky.kaspresso.docloc.rule.ToggleNightModeRule
import com.kaspersky.kaspresso.files.dirs.DefaultDirsProvider
import com.kaspersky.kaspresso.files.resources.ResourceFileNamesProvider
import com.kaspersky.kaspresso.files.resources.ResourcesDirsProvider
Expand Down Expand Up @@ -51,6 +52,7 @@ import java.lang.reflect.Proxy
* @param changeSystemLocale change the system language, i.e. system dialogs (e.g. runtime permissions) will also be localized.
* Need permission in manifest file for a target app android.permission.CHANGE_CONFIGURATION
* @param locales comma-separated string with locales to run test with.
* @param toggleNightMode used to capture screenshots with night mode enabled
*/
abstract class DocLocScreenshotTestCase(
private val resourcesRootDirsProvider: ResourcesRootDirsProvider =
Expand All @@ -68,6 +70,7 @@ abstract class DocLocScreenshotTestCase(
),
private val changeSystemLocale: Boolean = false,
private val screenshotParams: ScreenshotParams = ScreenshotParams(),
private val toggleNightMode: Boolean = false,
locales: String?,
kaspressoBuilder: Kaspresso.Builder = Kaspresso.Builder.simple().apply {
testRunWatcherInterceptors.add(TestRunnerScreenshotWatcherInterceptor(screenshots))
Expand Down Expand Up @@ -129,6 +132,12 @@ abstract class DocLocScreenshotTestCase(
logger = kaspresso.libLogger
)

@get:Rule
val nightModeRule = ToggleNightModeRule(
toggleNightMode = toggleNightMode,
logger = kaspresso.libLogger
)

@get:Rule
val storagePermissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE)!!

Expand All @@ -141,7 +150,15 @@ abstract class DocLocScreenshotTestCase(
val localedResourcesRootDirsProvider: ResourcesRootDirsProvider =
object : ResourcesRootDirsProvider by resourcesRootDirsProvider {
override val screenshotsRootDir: File =
resourcesRootDirsProvider.screenshotsRootDir.resolve(localeRule.currentLocaleName)
resourcesRootDirsProvider.screenshotsRootDir.resolve(
if (!toggleNightMode) {
SCREENSHOTS_DIR_DEFAULT
} else if (nightModeRule.isNightMode) {
SCREENSHOTS_DIR_DARK
} else {
SCREENSHOTS_DIR_LIGHT
}
).resolve(localeRule.currentLocaleName)
}

screenshotCapturer = DocLocScreenshotCapturer(
Expand Down Expand Up @@ -216,4 +233,10 @@ abstract class DocLocScreenshotTestCase(
UiInvocationHandler(view as Any, logger)
) as T
}

private companion object {
const val SCREENSHOTS_DIR_LIGHT = "light"
const val SCREENSHOTS_DIR_DARK = "dark"
const val SCREENSHOTS_DIR_DEFAULT = ""
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.kaspersky.kaspresso.testcases.api.testcase.DocLocScreenshotTestCase
import org.junit.Rule
import org.junit.Test

class ScreenshotDialogSampleTest : DocLocScreenshotTestCase(locales = "en,ru") {
class ScreenshotDialogSampleTest : DocLocScreenshotTestCase(locales = "en,ru", toggleNightMode = true) {

@get:Rule
val runtimePermissionRule: GrantPermissionRule = GrantPermissionRule.grant(
Expand Down
2 changes: 1 addition & 1 deletion samples/kaspresso-sample/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
Expand Down

0 comments on commit 878f14a

Please sign in to comment.