| /* |
| * Copyright 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package androidx.compose.ui.text.samples |
| |
| import androidx.annotation.Sampled |
| import androidx.compose.ui.text.input.OffsetMap |
| import androidx.compose.ui.text.input.TransformedText |
| import androidx.compose.ui.text.AnnotatedString |
| |
| @Sampled |
| fun passwordFilter(text: AnnotatedString): TransformedText { |
| return TransformedText( |
| AnnotatedString("*".repeat(text.text.length)), |
| |
| /** |
| * [OffsetMap.identityOffsetMap] is a predefined [OffsetMap] that can be used for the |
| * transformation that does not change the character count. |
| */ |
| OffsetMap.identityOffsetMap |
| ) |
| } |
| |
| @Sampled |
| fun creditCardFilter(text: AnnotatedString): TransformedText { |
| |
| // Making XXXX-XXXX-XXXX-XXXX string. |
| val trimmed = if (text.text.length >= 16) text.text.substring(0..15) else text.text |
| var out = "" |
| for (i in trimmed.indices) { |
| out += trimmed[i] |
| if (i % 4 == 3 && i != 15) out += "-" |
| } |
| |
| /** |
| * The offset translator should ignore the hyphen characters, so conversion from |
| * original offset to transformed text works like |
| * - The 4th char of the original text is 5th char in the transformed text. |
| * - The 13th char of the original text is 15th char in the transformed text. |
| * Similarly, the reverse conversion works like |
| * - The 5th char of the transformed text is 4th char in the original text. |
| * - The 12th char of the transformed text is 10th char in the original text. |
| */ |
| val creditCardOffsetTranslator = object : OffsetMap { |
| override fun originalToTransformed(offset: Int): Int { |
| if (offset <= 3) return offset |
| if (offset <= 7) return offset + 1 |
| if (offset <= 11) return offset + 2 |
| if (offset <= 16) return offset + 3 |
| return 19 |
| } |
| |
| override fun transformedToOriginal(offset: Int): Int { |
| if (offset <= 4) return offset |
| if (offset <= 9) return offset - 1 |
| if (offset <= 14) return offset - 2 |
| if (offset <= 19) return offset - 3 |
| return 16 |
| } |
| } |
| |
| return TransformedText(AnnotatedString(out), creditCardOffsetTranslator) |
| } |