Skip to content

Instantly share code, notes, and snippets.

@galex
Last active April 5, 2025 12:21
Show Gist options
  • Save galex/28d5ad2325ebbc633d7f4e4ee98c6ee1 to your computer and use it in GitHub Desktop.
Save galex/28d5ad2325ebbc633d7f4e4ee98c6ee1 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