From a816f2355dda5bcf1bd41844d2f90349d6144ef9 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Thu, 28 Dec 2023 16:07:30 +0100 Subject: [PATCH] current stand --- app/build.gradle | 9 ++- .../myzel394/alibi/MicrophoneRecordingTest.kt | 57 +++++++++++++++++++ .../java/app/myzel394/alibi/utils.kt | 24 ++++++++ .../main/java/app/myzel394/alibi/AlibiApp.kt | 31 ++++++++++ .../java/app/myzel394/alibi/MainActivity.kt | 16 +----- .../RecorderScreen/atoms/SaveButton.kt | 2 + .../molecules/AudioRecordingStart.kt | 4 +- .../WelcomeScreen/atoms/ExplanationPage.kt | 4 +- .../WelcomeScreen/atoms/ResponsibilityPage.kt | 4 +- .../alibi/ui/screens/WelcomeScreen.kt | 8 +-- 10 files changed, 136 insertions(+), 23 deletions(-) create mode 100644 app/src/androidTest/java/app/myzel394/alibi/MicrophoneRecordingTest.kt create mode 100644 app/src/androidTest/java/app/myzel394/alibi/utils.kt create mode 100644 app/src/main/java/app/myzel394/alibi/AlibiApp.kt diff --git a/app/build.gradle b/app/build.gradle index 20252d1..98df917 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,6 +106,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.documentfile:documentfile:1.0.1' implementation 'androidx.lifecycle:lifecycle-service:2.6.2' + implementation 'androidx.test.uiautomator:uiautomator:2.2.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' @@ -144,8 +145,14 @@ dependencies { implementation "androidx.camera:camera-view:${camerax_version}" implementation "androidx.camera:camera-extensions:${camerax_version}" - implementation "com.valentinilk.shimmer:compose-shimmer:1.2.0" implementation "androidx.biometric:biometric-ktx:1.2.0-alpha05" + + implementation "androidx.fragment:fragment-ktx:1.6.2" + + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation 'androidx.test:runner:1.5.2' + androidTestImplementation 'androidx.test:rules:1.5.0' + androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3' } \ No newline at end of file diff --git a/app/src/androidTest/java/app/myzel394/alibi/MicrophoneRecordingTest.kt b/app/src/androidTest/java/app/myzel394/alibi/MicrophoneRecordingTest.kt new file mode 100644 index 0000000..c3aa19a --- /dev/null +++ b/app/src/androidTest/java/app/myzel394/alibi/MicrophoneRecordingTest.kt @@ -0,0 +1,57 @@ +package app.myzel394.alibi + +import android.accessibilityservice.AccessibilityService +import android.os.Build +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.matcher.ViewMatchers.isRoot +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.LargeTest +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.rule.GrantPermissionRule +import androidx.test.rule.GrantPermissionRule.grant +import androidx.test.uiautomator.By +import androidx.test.uiautomator.UiDevice +import androidx.test.uiautomator.UiSelector +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +@LargeTest +class MicrophoneRecordingTest { + private val permissions = arrayOf( + android.Manifest.permission.RECORD_AUDIO, + android.Manifest.permission.CAMERA, + ) + + @get:Rule + val composeTestRule = createComposeRule() + + @JvmField + @Rule + val permissionRule: GrantPermissionRule = + grant(*permissions) + + @Test + fun runMicrophoneTest() { + composeTestRule.setContent { + AlibiApp() + } + + finishTutorial(composeTestRule) + + composeTestRule.onNodeWithTag("AudioRecorderStartButton").performClick() + onView(isRoot()).perform(waitFor(1000)) + composeTestRule.onNodeWithTag("SaveButton").performClick() + onView(isRoot()).perform(waitFor(1000)) + + UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).pressBack() + + composeTestRule.onNodeWithTag("AudioRecorderStartButton").assertIsDisplayed() + } +} diff --git a/app/src/androidTest/java/app/myzel394/alibi/utils.kt b/app/src/androidTest/java/app/myzel394/alibi/utils.kt new file mode 100644 index 0000000..ba7ccec --- /dev/null +++ b/app/src/androidTest/java/app/myzel394/alibi/utils.kt @@ -0,0 +1,24 @@ +package app.myzel394.alibi + +import android.view.View +import androidx.compose.ui.test.junit4.ComposeContentTestRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import androidx.test.espresso.UiController +import androidx.test.espresso.ViewAction +import androidx.test.espresso.matcher.ViewMatchers.isRoot + +fun waitFor(delay: Long): ViewAction { + return object : ViewAction { + override fun getConstraints() = isRoot() + override fun getDescription(): String = "wait for $delay milliseconds" + override fun perform(uiController: UiController, v: View?) { + uiController.loopMainThreadForAtLeast(delay) + } + } +} + +fun finishTutorial(composeTestRule: ComposeContentTestRule) { + composeTestRule.onNodeWithTag("ExplanationContinueButton").performClick() + composeTestRule.onNodeWithTag("ResponsibilityContinueButton").performClick() +} \ No newline at end of file diff --git a/app/src/main/java/app/myzel394/alibi/AlibiApp.kt b/app/src/main/java/app/myzel394/alibi/AlibiApp.kt new file mode 100644 index 0000000..63af9e5 --- /dev/null +++ b/app/src/main/java/app/myzel394/alibi/AlibiApp.kt @@ -0,0 +1,31 @@ +package app.myzel394.alibi + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import app.myzel394.alibi.ui.AsLockedApp +import app.myzel394.alibi.ui.LockedAppHandlers +import app.myzel394.alibi.ui.Navigation +import app.myzel394.alibi.ui.theme.AlibiTheme + +@Composable +fun AlibiApp() { + AlibiTheme { + LockedAppHandlers() + + Box( + modifier = Modifier + .fillMaxSize() + .background( + MaterialTheme.colorScheme.background + ) + ) { + AsLockedApp { + Navigation() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/myzel394/alibi/MainActivity.kt b/app/src/main/java/app/myzel394/alibi/MainActivity.kt index 79b3966..93ac9fe 100644 --- a/app/src/main/java/app/myzel394/alibi/MainActivity.kt +++ b/app/src/main/java/app/myzel394/alibi/MainActivity.kt @@ -30,21 +30,7 @@ class MainActivity : AppCompatActivity() { WindowCompat.setDecorFitsSystemWindows(window, false) setContent { - AlibiTheme { - LockedAppHandlers() - - Box( - modifier = Modifier - .fillMaxSize() - .background( - MaterialTheme.colorScheme.background - ) - ) { - AsLockedApp { - Navigation() - } - } - } + AlibiApp() } } } diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/atoms/SaveButton.kt b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/atoms/SaveButton.kt index 7304bf9..2b93866 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/atoms/SaveButton.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/atoms/SaveButton.kt @@ -12,6 +12,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics @@ -29,6 +30,7 @@ fun SaveButton( .semantics { contentDescription = label } + .testTag("SaveButton") .then(modifier), onClick = onSave, colors = ButtonDefaults.textButtonColors(), diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/molecules/AudioRecordingStart.kt b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/molecules/AudioRecordingStart.kt index 12feaec..0c2714d 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/molecules/AudioRecordingStart.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/RecorderScreen/molecules/AudioRecordingStart.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics @@ -67,7 +68,8 @@ fun AudioRecordingStart( contentDescription = label } .size(250.dp) - .clip(shape = CircleShape), + .clip(shape = CircleShape) + .testTag("AudioRecorderStartButton"), colors = ButtonDefaults.outlinedButtonColors(), ) { Column( diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/WelcomeScreen/atoms/ExplanationPage.kt b/app/src/main/java/app/myzel394/alibi/ui/components/WelcomeScreen/atoms/ExplanationPage.kt index 0cf5a1b..e752e3a 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/WelcomeScreen/atoms/ExplanationPage.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/WelcomeScreen/atoms/ExplanationPage.kt @@ -20,6 +20,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.myzel394.alibi.R @@ -63,7 +64,8 @@ fun ExplanationPage( modifier = Modifier .padding(16.dp) .fillMaxWidth() - .height(BIG_PRIMARY_BUTTON_SIZE), + .height(BIG_PRIMARY_BUTTON_SIZE) + .testTag("ExplanationContinueButton"), ) { Icon( Icons.Default.ChevronRight, diff --git a/app/src/main/java/app/myzel394/alibi/ui/components/WelcomeScreen/atoms/ResponsibilityPage.kt b/app/src/main/java/app/myzel394/alibi/ui/components/WelcomeScreen/atoms/ResponsibilityPage.kt index 377d24f..cb97ccd 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/components/WelcomeScreen/atoms/ResponsibilityPage.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/components/WelcomeScreen/atoms/ResponsibilityPage.kt @@ -20,6 +20,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.myzel394.alibi.R @@ -63,7 +64,8 @@ fun ResponsibilityPage( modifier = Modifier .padding(16.dp) .fillMaxWidth() - .height(BIG_PRIMARY_BUTTON_SIZE), + .height(BIG_PRIMARY_BUTTON_SIZE) + .testTag("ResponsibilityContinueButton"), ) { Icon( Icons.Default.Check, diff --git a/app/src/main/java/app/myzel394/alibi/ui/screens/WelcomeScreen.kt b/app/src/main/java/app/myzel394/alibi/ui/screens/WelcomeScreen.kt index c52607c..fa8a385 100644 --- a/app/src/main/java/app/myzel394/alibi/ui/screens/WelcomeScreen.kt +++ b/app/src/main/java/app/myzel394/alibi/ui/screens/WelcomeScreen.kt @@ -35,17 +35,17 @@ fun WelcomeScreen( val pagerState = rememberPagerState( initialPage = 0, initialPageOffsetFraction = 0f, - pageCount = {2} + pageCount = { 2 } ) - Scaffold() {padding -> + Scaffold() { padding -> Column( modifier = Modifier .fillMaxSize() .padding(padding), horizontalAlignment = Alignment.CenterHorizontally, ) { - HorizontalPager(state = pagerState) {position -> + HorizontalPager(state = pagerState) { position -> when (position) { 0 -> ExplanationPage( onContinue = { @@ -54,12 +54,12 @@ fun WelcomeScreen( } } ) + 1 -> ResponsibilityPage { scope.launch { dataStore.updateData { settings.setHasSeenOnboarding(true) } - navController.navigate(Screen.AudioRecorder.route) } } }