current stand

This commit is contained in:
Myzel394 2023-12-28 16:07:30 +01:00
parent 5416fcb046
commit a816f2355d
No known key found for this signature in database
GPG Key ID: 79CC92F37B3E1A2B
10 changed files with 136 additions and 23 deletions

View File

@ -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'
}

View File

@ -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()
}
}

View File

@ -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()
}

View File

@ -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()
}
}
}
}

View File

@ -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()
}
}
}

View File

@ -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(),

View File

@ -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(

View File

@ -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,

View File

@ -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,

View File

@ -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)
}
}
}