Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save rayworks/f74fef1e1187b1a46451e0d0a0ab06bb to your computer and use it in GitHub Desktop.

Select an option

Save rayworks/f74fef1e1187b1a46451e0d0a0ab06bb to your computer and use it in GitHub Desktop.
package com.example.myapplication
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.modifier.modifierLocalConsumer
import androidx.compose.ui.modifier.modifierLocalOf
import androidx.compose.ui.modifier.modifierLocalProvider
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTagsAsResourceId
private val ModifierLocalAutomationContext = modifierLocalOf { "" }
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun Modifier.automationContext(context: String): Modifier {
var prev by remember { mutableStateOf<String?>(null) }
return this then Modifier
.modifierLocalConsumer { prev = ModifierLocalAutomationContext.current }
.modifierLocalProvider(ModifierLocalAutomationContext) {
if (prev.isNullOrEmpty()) context else "${prev}_${context}"
}
}
@Composable
fun Modifier.automationIndex(index: Int): Modifier = automationContext("index_$index")
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun Modifier.automationId(id: String): Modifier {
val packagePrefix = LocalContext.current.packageName
var prev by remember { mutableStateOf<String?>(null) }
return this then Modifier
.modifierLocalConsumer { prev = ModifierLocalAutomationContext.current }
.semantics { testTagsAsResourceId = true }
.testTag(if (prev.isNullOrEmpty()) "$packagePrefix:id/$id" else "$packagePrefix:id/${prev}_${id}")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment