From 529466f86e9c646cc2e882a3fdecf018b4c103e2 Mon Sep 17 00:00:00 2001
From: Mohamed Metwalli <mohamed.metwalli@sap.com>
Date: Mon, 4 Jan 2021 20:40:25 +0100
Subject: [PATCH] Support cleaning device status bar before taking screenshot

---
 ...ardingDeltaInteroperabilityFragmentTest.kt |  4 ++
 .../ui/onboarding/OnboardingFragmentTest.kt   |  4 ++
 .../OnboardingNotificationsFragmentTest.kt    |  4 ++
 .../OnboardingPrivacyFragmentTest.kt          |  4 ++
 .../onboarding/OnboardingTestFragmentTest.kt  |  4 ++
 .../OnboardingTracingFragmentTest.kt          |  4 ++
 .../testhelpers/SystemUIDemoModeHelper.kt     | 56 +++++++++++++++++++
 .../java/testhelpers/SystemUIDemoModeRule.kt  | 27 +++++++++
 8 files changed, 107 insertions(+)
 create mode 100644 Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeHelper.kt
 create mode 100644 Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeRule.kt

diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentTest.kt
index 7c7e8aab2..7ea43ae38 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentTest.kt
@@ -19,6 +19,7 @@ import org.junit.Test
 import org.junit.runner.RunWith
 import testhelpers.BaseUITest
 import testhelpers.Screenshot
+import testhelpers.SystemUIDemoModeRule
 import testhelpers.TestDispatcherProvider
 import testhelpers.launchFragmentInContainer2
 import tools.fastlane.screengrab.Screengrab
@@ -33,6 +34,9 @@ class OnboardingDeltaInteroperabilityFragmentTest : BaseUITest() {
     @JvmField
     val localeTestRule = LocaleTestRule()
 
+    @get:Rule
+    val systemUIDemoModeRule = SystemUIDemoModeRule()
+
     @Before
     fun setup() {
         MockKAnnotations.init(this, relaxed = true)
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragmentTest.kt
index afbfe6575..15810f431 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragmentTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragmentTest.kt
@@ -18,6 +18,7 @@ import org.junit.Test
 import org.junit.runner.RunWith
 import testhelpers.BaseUITest
 import testhelpers.Screenshot
+import testhelpers.SystemUIDemoModeRule
 import testhelpers.launchFragmentInContainer2
 import tools.fastlane.screengrab.Screengrab
 import tools.fastlane.screengrab.locale.LocaleTestRule
@@ -29,6 +30,9 @@ class OnboardingFragmentTest : BaseUITest() {
     @JvmField
     val localeTestRule = LocaleTestRule()
 
+    @get:Rule
+    val systemUIDemoModeRule = SystemUIDemoModeRule()
+
     @Before
     fun setUp() {
         setupMockViewModel(object : OnboardingFragmentViewModel.Factory {
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragmentTest.kt
index 33eb47d75..36b9ab7b6 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragmentTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragmentTest.kt
@@ -16,6 +16,7 @@ import org.junit.Test
 import org.junit.runner.RunWith
 import testhelpers.BaseUITest
 import testhelpers.Screenshot
+import testhelpers.SystemUIDemoModeRule
 import testhelpers.launchFragmentInContainer2
 import tools.fastlane.screengrab.Screengrab
 import tools.fastlane.screengrab.locale.LocaleTestRule
@@ -27,6 +28,9 @@ class OnboardingNotificationsFragmentTest : BaseUITest() {
     @JvmField
     val localeTestRule = LocaleTestRule()
 
+    @get:Rule
+    val systemUIDemoModeRule = SystemUIDemoModeRule()
+
     @Before
     fun setup() {
         setupMockViewModel(object : OnboardingNotificationsViewModel.Factory {
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragmentTest.kt
index aa3166ad0..31f7e4244 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragmentTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragmentTest.kt
@@ -15,6 +15,7 @@ import org.junit.Test
 import org.junit.runner.RunWith
 import testhelpers.BaseUITest
 import testhelpers.Screenshot
+import testhelpers.SystemUIDemoModeRule
 import testhelpers.launchFragmentInContainer2
 import tools.fastlane.screengrab.Screengrab
 import tools.fastlane.screengrab.locale.LocaleTestRule
@@ -26,6 +27,9 @@ class OnboardingPrivacyFragmentTest : BaseUITest() {
     @JvmField
     val localeTestRule = LocaleTestRule()
 
+    @get:Rule
+    val systemUIDemoModeRule = SystemUIDemoModeRule()
+
     @Before
     fun setup() {
         setupMockViewModel(object : OnboardingPrivacyViewModel.Factory {
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragmentTest.kt
index 9cc641ea4..3c0a2631f 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragmentTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragmentTest.kt
@@ -16,6 +16,7 @@ import org.junit.Test
 import org.junit.runner.RunWith
 import testhelpers.BaseUITest
 import testhelpers.Screenshot
+import testhelpers.SystemUIDemoModeRule
 import testhelpers.launchFragmentInContainer2
 import tools.fastlane.screengrab.Screengrab
 import tools.fastlane.screengrab.locale.LocaleTestRule
@@ -27,6 +28,9 @@ class OnboardingTestFragmentTest : BaseUITest() {
     @JvmField
     val localeTestRule = LocaleTestRule()
 
+    @get:Rule
+    val systemUIDemoModeRule = SystemUIDemoModeRule()
+
     @Before
     fun setup() {
         setupMockViewModel(object : OnboardingTestViewModel.Factory {
diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt
index 18877ff1e..fe0c93bf5 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt
@@ -24,6 +24,7 @@ import org.junit.Test
 import org.junit.runner.RunWith
 import testhelpers.BaseUITest
 import testhelpers.Screenshot
+import testhelpers.SystemUIDemoModeRule
 import testhelpers.TestDispatcherProvider
 import testhelpers.launchFragmentInContainer2
 import tools.fastlane.screengrab.Screengrab
@@ -39,6 +40,9 @@ class OnboardingTracingFragmentTest : BaseUITest() {
     @JvmField
     val localeTestRule = LocaleTestRule()
 
+    @get:Rule
+    val systemUIDemoModeRule = SystemUIDemoModeRule()
+
     @Before
     fun setup() {
         MockKAnnotations.init(this, relaxed = true)
diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeHelper.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeHelper.kt
new file mode 100644
index 000000000..d98a657ea
--- /dev/null
+++ b/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeHelper.kt
@@ -0,0 +1,56 @@
+package testhelpers
+
+import android.os.ParcelFileDescriptor
+import androidx.test.platform.app.InstrumentationRegistry
+import java.io.BufferedReader
+import java.io.InputStreamReader
+
+/**
+ * System UI Demo Mode helper that uses instrumentation commands to clean device status bar.
+ * @see <a href="https://android.googlesource.com/platform/frameworks/base/+/master/packages/SystemUI/docs/demo_mode.md" >Demo mode</a>
+ * @see <a href="https://developer.android.com/studio/debug/dev-options#general" >Dev options</a>
+ */
+class SystemUIDemoModeHelper {
+
+    /**
+     * Allows System UI demo mode and configure how the status bar should look like
+     */
+    fun enter() {
+        executeShellCommand("settings put global sysui_demo_allowed 1")
+        sendCommand("exit")
+        sendCommand("enter")
+        sendCommand("notifications", "visible" to "false")
+        sendCommand("network", "wifi" to "show", "level" to "4", "fully" to "true")
+        sendCommand("battery", "level" to "100", "plugged" to "false")
+        sendCommand("clock", "hhmm" to "1000")
+    }
+
+    /**
+     * Exist system UI demo mode
+     */
+    fun exit() {
+        sendCommand("exit")
+    }
+
+    private fun sendCommand(command: String, vararg extras: Pair<String, Any>) {
+        val exec = StringBuilder("am broadcast -a com.android.systemui.demo -e command $command")
+        for ((key, value) in extras) {
+            exec.append(" -e $key $value")
+        }
+        executeShellCommand(exec.toString())
+    }
+
+    private fun executeShellCommand(command: String) {
+        waitForCompletion(InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand(command))
+    }
+
+    private fun waitForCompletion(descriptor: ParcelFileDescriptor) {
+        BufferedReader(
+            InputStreamReader(
+                ParcelFileDescriptor.AutoCloseInputStream(descriptor)
+            )
+        ).use {
+            it.readText()
+        }
+    }
+}
diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeRule.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeRule.kt
new file mode 100644
index 000000000..779235757
--- /dev/null
+++ b/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeRule.kt
@@ -0,0 +1,27 @@
+package testhelpers
+
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+
+/**
+ * Enters UI demo mode (clean up device status bar)
+ * before running screenshot tests and exists after it afterwards
+ */
+class SystemUIDemoModeRule : TestRule {
+
+    private val helper = SystemUIDemoModeHelper()
+
+    override fun apply(base: Statement, description: Description): Statement =
+        object : Statement() {
+            override fun evaluate() {
+                try {
+                    helper.enter()
+                    base.evaluate()
+                    helper.exit()
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        }
+}
-- 
GitLab