mirror of
https://github.com/Myzel394/Alibi.git
synced 2025-06-18 23:05:26 +02:00
current stand
This commit is contained in:
parent
5416fcb046
commit
a816f2355d
@ -106,6 +106,7 @@ dependencies {
|
|||||||
implementation 'androidx.appcompat:appcompat:1.6.1'
|
implementation 'androidx.appcompat:appcompat:1.6.1'
|
||||||
implementation 'androidx.documentfile:documentfile:1.0.1'
|
implementation 'androidx.documentfile:documentfile:1.0.1'
|
||||||
implementation 'androidx.lifecycle:lifecycle-service:2.6.2'
|
implementation 'androidx.lifecycle:lifecycle-service:2.6.2'
|
||||||
|
implementation 'androidx.test.uiautomator:uiautomator:2.2.0'
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
|
||||||
@ -144,8 +145,14 @@ dependencies {
|
|||||||
implementation "androidx.camera:camera-view:${camerax_version}"
|
implementation "androidx.camera:camera-view:${camerax_version}"
|
||||||
implementation "androidx.camera:camera-extensions:${camerax_version}"
|
implementation "androidx.camera:camera-extensions:${camerax_version}"
|
||||||
|
|
||||||
|
|
||||||
implementation "com.valentinilk.shimmer:compose-shimmer:1.2.0"
|
implementation "com.valentinilk.shimmer:compose-shimmer:1.2.0"
|
||||||
|
|
||||||
implementation "androidx.biometric:biometric-ktx:1.2.0-alpha05"
|
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'
|
||||||
}
|
}
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
24
app/src/androidTest/java/app/myzel394/alibi/utils.kt
Normal file
24
app/src/androidTest/java/app/myzel394/alibi/utils.kt
Normal 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()
|
||||||
|
}
|
31
app/src/main/java/app/myzel394/alibi/AlibiApp.kt
Normal file
31
app/src/main/java/app/myzel394/alibi/AlibiApp.kt
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -30,21 +30,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
AlibiTheme {
|
AlibiApp()
|
||||||
LockedAppHandlers()
|
|
||||||
|
|
||||||
Box(
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxSize()
|
|
||||||
.background(
|
|
||||||
MaterialTheme.colorScheme.background
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
AsLockedApp {
|
|
||||||
Navigation()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import androidx.compose.material3.MaterialTheme
|
|||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.semantics.contentDescription
|
import androidx.compose.ui.semantics.contentDescription
|
||||||
import androidx.compose.ui.semantics.semantics
|
import androidx.compose.ui.semantics.semantics
|
||||||
@ -29,6 +30,7 @@ fun SaveButton(
|
|||||||
.semantics {
|
.semantics {
|
||||||
contentDescription = label
|
contentDescription = label
|
||||||
}
|
}
|
||||||
|
.testTag("SaveButton")
|
||||||
.then(modifier),
|
.then(modifier),
|
||||||
onClick = onSave,
|
onClick = onSave,
|
||||||
colors = ButtonDefaults.textButtonColors(),
|
colors = ButtonDefaults.textButtonColors(),
|
||||||
|
@ -23,6 +23,7 @@ import androidx.compose.ui.Alignment
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.semantics.contentDescription
|
import androidx.compose.ui.semantics.contentDescription
|
||||||
import androidx.compose.ui.semantics.semantics
|
import androidx.compose.ui.semantics.semantics
|
||||||
@ -67,7 +68,8 @@ fun AudioRecordingStart(
|
|||||||
contentDescription = label
|
contentDescription = label
|
||||||
}
|
}
|
||||||
.size(250.dp)
|
.size(250.dp)
|
||||||
.clip(shape = CircleShape),
|
.clip(shape = CircleShape)
|
||||||
|
.testTag("AudioRecorderStartButton"),
|
||||||
colors = ButtonDefaults.outlinedButtonColors(),
|
colors = ButtonDefaults.outlinedButtonColors(),
|
||||||
) {
|
) {
|
||||||
Column(
|
Column(
|
||||||
|
@ -20,6 +20,7 @@ import androidx.compose.material3.Text
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import app.myzel394.alibi.R
|
import app.myzel394.alibi.R
|
||||||
@ -63,7 +64,8 @@ fun ExplanationPage(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(16.dp)
|
.padding(16.dp)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.height(BIG_PRIMARY_BUTTON_SIZE),
|
.height(BIG_PRIMARY_BUTTON_SIZE)
|
||||||
|
.testTag("ExplanationContinueButton"),
|
||||||
) {
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
Icons.Default.ChevronRight,
|
Icons.Default.ChevronRight,
|
||||||
|
@ -20,6 +20,7 @@ import androidx.compose.material3.Text
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import app.myzel394.alibi.R
|
import app.myzel394.alibi.R
|
||||||
@ -63,7 +64,8 @@ fun ResponsibilityPage(
|
|||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(16.dp)
|
.padding(16.dp)
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.height(BIG_PRIMARY_BUTTON_SIZE),
|
.height(BIG_PRIMARY_BUTTON_SIZE)
|
||||||
|
.testTag("ResponsibilityContinueButton"),
|
||||||
) {
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
Icons.Default.Check,
|
Icons.Default.Check,
|
||||||
|
@ -35,17 +35,17 @@ fun WelcomeScreen(
|
|||||||
val pagerState = rememberPagerState(
|
val pagerState = rememberPagerState(
|
||||||
initialPage = 0,
|
initialPage = 0,
|
||||||
initialPageOffsetFraction = 0f,
|
initialPageOffsetFraction = 0f,
|
||||||
pageCount = {2}
|
pageCount = { 2 }
|
||||||
)
|
)
|
||||||
|
|
||||||
Scaffold() {padding ->
|
Scaffold() { padding ->
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxSize()
|
.fillMaxSize()
|
||||||
.padding(padding),
|
.padding(padding),
|
||||||
horizontalAlignment = Alignment.CenterHorizontally,
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
) {
|
) {
|
||||||
HorizontalPager(state = pagerState) {position ->
|
HorizontalPager(state = pagerState) { position ->
|
||||||
when (position) {
|
when (position) {
|
||||||
0 -> ExplanationPage(
|
0 -> ExplanationPage(
|
||||||
onContinue = {
|
onContinue = {
|
||||||
@ -54,12 +54,12 @@ fun WelcomeScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
1 -> ResponsibilityPage {
|
1 -> ResponsibilityPage {
|
||||||
scope.launch {
|
scope.launch {
|
||||||
dataStore.updateData {
|
dataStore.updateData {
|
||||||
settings.setHasSeenOnboarding(true)
|
settings.setHasSeenOnboarding(true)
|
||||||
}
|
}
|
||||||
navController.navigate(Screen.AudioRecorder.route)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user