diff --git a/kaspresso/build.gradle.kts b/kaspresso/build.gradle.kts index a7dddc4b8..cc1eb9cf6 100644 --- a/kaspresso/build.gradle.kts +++ b/kaspresso/build.gradle.kts @@ -31,6 +31,7 @@ dependencies { implementation(libs.gson) implementation(projects.adbServer.adbserverDevice) implementation(libs.appcompat) + implementation(libs.material) testImplementation(libs.junit) testImplementation(libs.truth) diff --git a/kaspresso/src/main/kotlin/com/kaspersky/kaspresso/device/activities/metadata/ActivityMetadata.kt b/kaspresso/src/main/kotlin/com/kaspersky/kaspresso/device/activities/metadata/ActivityMetadata.kt index a4c25b534..f0100d39c 100644 --- a/kaspresso/src/main/kotlin/com/kaspersky/kaspresso/device/activities/metadata/ActivityMetadata.kt +++ b/kaspresso/src/main/kotlin/com/kaspersky/kaspresso/device/activities/metadata/ActivityMetadata.kt @@ -5,6 +5,7 @@ import android.content.res.Resources import android.view.View import android.widget.TextView import androidx.test.espresso.util.TreeIterables +import com.google.android.material.appbar.CollapsingToolbarLayout import com.kaspersky.kaspresso.logger.UiTestLogger /** @@ -48,7 +49,7 @@ internal class ActivityMetadata( } private fun getLocalizedStrings(decorView: View): List { - return TreeIterables.depthFirstViewTraversal(decorView) + val localizedStrings = TreeIterables.depthFirstViewTraversal(decorView) .filter { it.visibility == View.VISIBLE } .filter { it is TextView } .map { it as TextView } @@ -61,7 +62,25 @@ internal class ActivityMetadata( v.width, v.height ) + }.toMutableList() + + val stringsFromToolbarLayouts = TreeIterables.depthFirstViewTraversal(decorView) + .filter { it.visibility == View.VISIBLE } + .filter { it is CollapsingToolbarLayout } + .map { it as CollapsingToolbarLayout } + .map { v -> + LocalizedString( + v.title.toString(), + getEntryNameFromLayout(decorView.resources, v), + v.left, + v.top, + v.width, + v.height + ) } + + localizedStrings.addAll(stringsFromToolbarLayouts) + return localizedStrings } private fun getEntryName(resources: Resources, v: TextView): String { @@ -73,6 +92,16 @@ internal class ActivityMetadata( } } + private fun getEntryNameFromLayout(resources: Resources, layout: CollapsingToolbarLayout): String { + return try { + resources.getResourceEntryName(layout.id) + } + catch (ex: Resources.NotFoundException) { + logger.e("Entry ${layout.id} not found") + "[id:${Integer.toHexString(layout.id)}]" + } + } + private fun resolveAmbiguous(localizedStrings: List): List { return localizedStrings.groupBy { it.locValueDescription } .values diff --git a/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/docloc_tests/ScreenshotActivityWithToolbarTest.kt b/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/docloc_tests/ScreenshotActivityWithToolbarTest.kt new file mode 100644 index 000000000..c57487e31 --- /dev/null +++ b/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/docloc_tests/ScreenshotActivityWithToolbarTest.kt @@ -0,0 +1,36 @@ +package com.kaspersky.kaspressample.docloc_tests + +import androidx.test.espresso.action.ViewActions +import androidx.test.ext.junit.rules.activityScenarioRule +import com.kaspersky.kaspressample.MainActivity +import com.kaspersky.kaspressample.screen.MainScreen +import com.kaspersky.kaspressample.screen.WithToolbarScreen +import com.kaspersky.kaspresso.testcases.api.testcase.DocLocScreenshotTestCase +import org.junit.Rule +import org.junit.Test + +class ScreenshotActivityWithToolbarTest : DocLocScreenshotTestCase(locales="en") { + + @get:Rule + val activityRule = activityScenarioRule() + + @Test + fun takeScreenshot() = run { + step("Open screen with toolbar") { + MainScreen { + withToolbarButton { + click() + } + } + } + + step("Take screenshot") { + WithToolbarScreen { + collapsingToolbar { + view.perform(ViewActions.swipeUp()) + } + } + captureScreenshot("screen with toolbar") + } + } +} diff --git a/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/screen/MainScreen.kt b/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/screen/MainScreen.kt index 2ef5ecef1..cc02fab83 100644 --- a/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/screen/MainScreen.kt +++ b/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/screen/MainScreen.kt @@ -27,5 +27,7 @@ object MainScreen : KScreen() { val changeLocaleButton = KButton { withId(R.id.activity_main_change_locale_mid_test_button) } + val withToolbarButton = KButton { withId(R.id.activity_with_toolbar_button) } + val descriptionText = KTextView { withId(R.id.activity_main_title) } } diff --git a/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/screen/WithToolbarScreen.kt b/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/screen/WithToolbarScreen.kt new file mode 100644 index 000000000..245ae8f7d --- /dev/null +++ b/samples/kaspresso-sample/src/androidTest/kotlin/com/kaspersky/kaspressample/screen/WithToolbarScreen.kt @@ -0,0 +1,12 @@ +package com.kaspersky.kaspressample.screen + +import com.kaspersky.kaspresso.screens.KScreen +import com.kaspersky.kaspressample.R +import io.github.kakaocup.kakao.toolbar.KToolbar + +object WithToolbarScreen : KScreen() { + override val layoutId: Int? = null + override val viewClass: Class<*>? = null + + val collapsingToolbar = KToolbar { withId(R.id.collapsing_toolbar)} +} diff --git a/samples/kaspresso-sample/src/main/AndroidManifest.xml b/samples/kaspresso-sample/src/main/AndroidManifest.xml index acf14df13..e2a5ee367 100644 --- a/samples/kaspresso-sample/src/main/AndroidManifest.xml +++ b/samples/kaspresso-sample/src/main/AndroidManifest.xml @@ -88,6 +88,11 @@ android:name=".systemlanguage.ChangeLocaleActivity" android:label="@string/main_screen_change_language_mid_test_button"/> + + (R.id.toolbar) + toolbar.title = getString(R.string.toolbar_title) + + val collapsingToolbar = findViewById(R.id.collapsing_toolbar) + collapsingToolbar.title = getString(R.string.toolbar_layout_title) + + this.setSupportActionBar(toolbar) + val actionBar = this.supportActionBar!! + actionBar.setDisplayHomeAsUpEnabled(true) + actionBar.setDisplayShowHomeEnabled(true) + + toolbar.setNavigationOnClickListener { this.onBackPressed() } + } +} diff --git a/samples/kaspresso-sample/src/main/res/layout/activity_main.xml b/samples/kaspresso-sample/src/main/res/layout/activity_main.xml index 31e47ab3f..66f3b0252 100644 --- a/samples/kaspresso-sample/src/main/res/layout/activity_main.xml +++ b/samples/kaspresso-sample/src/main/res/layout/activity_main.xml @@ -105,6 +105,13 @@ android:layout_below="@id/activity_main_device_full_button" android:text="@string/main_screen_change_language_mid_test_button" /> +