Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion evervault-inputs/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ dependencies {
api("com.github.evervault:evervault-pay:android-v0.0.30")
implementation(project(":evervault-core"))
implementation("androidx.core:core-ktx:1.12.0")
implementation(platform("androidx.compose:compose-bom:2024.06.00"))
implementation(platform("androidx.compose:compose-bom:2025.06.01"))
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:${composeActivityVersion}")
implementation("androidx.compose.ui:ui")
Expand Down
134 changes: 71 additions & 63 deletions evervault-inputs/gradle.lockfile

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,17 @@ import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.remember
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.autofill.AutofillNode
import androidx.compose.ui.autofill.AutofillType
import androidx.compose.ui.autofill.ContentType
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.platform.LocalAutofill
import androidx.compose.ui.platform.LocalAutofillTree
import androidx.compose.ui.platform.LocalAutofillManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.contentType
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardCapitalization
Expand All @@ -36,8 +35,6 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import com.evervault.sdk.input.model.placeholder.PlaceholderTextsDefaults
import com.evervault.sdk.input.ui.component.CustomTextField
import com.evervault.sdk.input.ui.modifier.autofillBoundingBox
import com.evervault.sdk.input.ui.modifier.autofillOnFocusChange

internal class PaymentCardInputScopeImpl(
private val textStyle: TextStyle,
Expand Down Expand Up @@ -88,7 +85,6 @@ internal class PaymentCardInputScopeImpl(
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun CardNumberField(
modifier: Modifier,
Expand All @@ -101,11 +97,10 @@ internal class PaymentCardInputScopeImpl(
modifier = modifier.focusRequester(creditCardRequester),
options = options,
onNext = { expiryRequester.requestFocus() },
autofillType = AutofillType.CreditCardNumber
contentType = ContentType.CreditCardNumber
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun CardNumberField(
modifier: Modifier,
Expand All @@ -122,11 +117,10 @@ internal class PaymentCardInputScopeImpl(
textStyle = textStyle,
textFieldColors = textFieldColors,
onNext = { expiryRequester.requestFocus() },
autofillType = AutofillType.CreditCardNumber,
contentType = ContentType.CreditCardNumber,
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun CardNumberField(
modifier: Modifier,
Expand All @@ -144,12 +138,11 @@ internal class PaymentCardInputScopeImpl(
textStyle = textStyle,
textFieldColors = textFieldColors,
onNext = { expiryRequester.requestFocus() },
autofillType = AutofillType.CreditCardNumber,
contentType = ContentType.CreditCardNumber,
cursorBrush = cursorBrush
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun CardNumberField(
modifier: Modifier,
Expand All @@ -168,7 +161,7 @@ internal class PaymentCardInputScopeImpl(
textStyle = textStyle,
textFieldColors = textFieldColors,
onNext = onNext,
autofillType = AutofillType.CreditCardNumber,
contentType = ContentType.CreditCardNumber,
cursorBrush = cursorBrush
)
}
Expand All @@ -192,7 +185,6 @@ internal class PaymentCardInputScopeImpl(
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun ExpiryField(
modifier: Modifier,
Expand All @@ -205,11 +197,10 @@ internal class PaymentCardInputScopeImpl(
modifier = modifier.focusRequester(expiryRequester),
options = options,
onNext = { cvcRequester.requestFocus() },
autofillType = AutofillType.CreditCardExpirationDate
contentType = ContentType.CreditCardExpirationDate
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun ExpiryField(
modifier: Modifier,
Expand All @@ -226,11 +217,10 @@ internal class PaymentCardInputScopeImpl(
textStyle = textStyle,
textFieldColors = textFieldColors,
onNext = { cvcRequester.requestFocus() },
autofillType = AutofillType.CreditCardExpirationDate,
contentType = ContentType.CreditCardExpirationDate,
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun ExpiryField(
modifier: Modifier,
Expand All @@ -248,7 +238,7 @@ internal class PaymentCardInputScopeImpl(
textStyle = textStyle,
textFieldColors = textFieldColors,
onNext = { cvcRequester.requestFocus() },
autofillType = AutofillType.CreditCardExpirationDate,
contentType = ContentType.CreditCardExpirationDate,
cursorBrush = cursorBrush,
)
}
Expand All @@ -274,7 +264,6 @@ internal class PaymentCardInputScopeImpl(
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun CVCField(
modifier: Modifier,
Expand All @@ -286,11 +275,10 @@ internal class PaymentCardInputScopeImpl(
placeholder = placeholder,
modifier = modifier.focusRequester(cvcRequester),
options = options,
autofillType = AutofillType.CreditCardSecurityCode
contentType = ContentType.CreditCardSecurityCode
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun CVCField(
modifier: Modifier,
Expand All @@ -306,11 +294,10 @@ internal class PaymentCardInputScopeImpl(
placeholder = placeholder,
textStyle = textStyle,
textFieldColors = textFieldColors,
autofillType = AutofillType.CreditCardSecurityCode,
contentType = ContentType.CreditCardSecurityCode,
)
}

@OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun CVCField(
modifier: Modifier,
Expand All @@ -327,36 +314,27 @@ internal class PaymentCardInputScopeImpl(
placeholder = placeholder,
textStyle = textStyle,
textFieldColors = textFieldColors,
autofillType = AutofillType.CreditCardSecurityCode,
contentType = ContentType.CreditCardSecurityCode,
cursorBrush = cursorBrush
)
}

@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun CustomTextField(
state: MutableState<TextFieldValue>,
placeholder: String,
modifier: Modifier = Modifier,
options: PaymentCardInputScope.TextFieldOptions,
onNext: (() -> Unit)? = null,
autofillType: AutofillType,
contentType: ContentType,
) {
val autofill = LocalAutofill.current
val autofillNode = AutofillNode(
autofillTypes = listOf(autofillType),
onFill = {
state.value = TextFieldValue(state.value.text + it)
}
)
LocalAutofillTree.current.plusAssign(autofillNode)
val autofillManager = LocalAutofillManager.current

BasicTextField(
value = state.value,
onValueChange = { state.value = it },
modifier = modifier
.autofillBoundingBox(autofillNode)
.autofillOnFocusChange(autofill, autofillNode),
modifier = modifier.semantics { this.contentType = contentType },
textStyle = options.textStyle.invoke(textStyle),
keyboardOptions = KeyboardOptions(
capitalization = KeyboardCapitalization.None,
Expand All @@ -366,6 +344,7 @@ internal class PaymentCardInputScopeImpl(
),
keyboardActions = KeyboardActions(
onNext = { onNext?.invoke() },
onDone = { autofillManager?.commit() },
),
cursorBrush = setDefaultCursorBrush(),
decorationBox = @Composable { innerTextField ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,26 @@ import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.remember
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.autofill.AutofillNode
import androidx.compose.ui.autofill.AutofillType
import androidx.compose.ui.autofill.ContentType
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.platform.LocalAutofill
import androidx.compose.ui.platform.LocalAutofillTree
import androidx.compose.ui.platform.LocalAutofillManager
import androidx.compose.ui.semantics.contentType
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import com.evervault.sdk.input.ui.modifier.autofillBoundingBox
import com.evervault.sdk.input.ui.modifier.autofillOnFocusChange

/**
* Input field that accepts composables for the placeholder and labels, so the user can modify and provide them as they need.
*/
@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun CustomTextField(
state: MutableState<TextFieldValue>,
Expand All @@ -45,25 +42,16 @@ internal fun CustomTextField(
textStyle: TextStyle = LocalTextStyle.current,
textFieldColors: TextFieldColors = TextFieldDefaults.colors(),
onNext: (() -> Unit)? = null,
autofillType: AutofillType,
contentType: ContentType,
cursorBrush: Brush? = null
) {
val interactionSource = remember { MutableInteractionSource() }
val autofill = LocalAutofill.current
val autofillNode = AutofillNode(
autofillTypes = listOf(autofillType),
onFill = {
state.value = TextFieldValue(state.value.text + it)
}
)
LocalAutofillTree.current.plusAssign(autofillNode)
val autofillManager = LocalAutofillManager.current
val defaultOrPassedBrush = setDefaultCursorBrush(cursorBrush)
BasicTextField(
value = state.value,
onValueChange = { state.value = it },
modifier = modifier
.autofillBoundingBox(autofillNode)
.autofillOnFocusChange(autofill, autofillNode),
modifier = modifier.semantics { this.contentType = contentType },
textStyle = textStyle,
interactionSource = interactionSource,
keyboardOptions = KeyboardOptions(
Expand All @@ -74,6 +62,7 @@ internal fun CustomTextField(
),
keyboardActions = KeyboardActions(
onNext = { onNext?.invoke() },
onDone = { autofillManager?.commit() },
),
cursorBrush = defaultOrPassedBrush,
decorationBox = @Composable { innerTextField ->
Expand Down

This file was deleted.

Loading
Loading