| /* |
| * 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.ui.autofill |
| |
| import androidx.compose.ui.geometry.Rect |
| import androidx.ui.util.annotation.GuardedBy |
| |
| /** |
| * Autofill API. |
| * |
| * This interface is available to all composables via an ambient. The composable can then request |
| * or cancel autofill as required. For instance, the [TextField] can call [requestAutofillForNode] |
| * when it gains focus, and [cancelAutofillForNode] when it loses focus. |
| */ |
| interface Autofill { |
| |
| /** |
| * Request autofill for the specified node. |
| * |
| * @param autofillNode The node that needs to be autofilled. |
| * |
| * This function is usually called when an autofillable component gains focus. |
| */ |
| fun requestAutofillForNode(autofillNode: AutofillNode) |
| |
| /** |
| * Cancel a previously supplied autofill request. |
| * |
| * @param autofillNode The node that needs to be autofilled. |
| * |
| * This function is usually called when an autofillable component loses focus. |
| */ |
| fun cancelAutofillForNode(autofillNode: AutofillNode) |
| } |
| |
| /** |
| * Every autofillable composable will have an [AutofillNode]. (An autofill node will be created |
| * for every semantics node that adds autofill properties). This node is used to request/cancel |
| * autofill, and it holds the [onFill] lambda which is called by the autofill framework. |
| * |
| * @property autofillTypes A list of autofill types for this node. These types are conveyed to the |
| * autofill framework and it is used to call [onFill] with the appropriate value. If you don't set |
| * this property, the autofill framework will use heuristics to guess the type. This property is a |
| * list because some fields can have multiple types. For instance, userid in a login form can |
| * either be a username or an email address. TODO(b/138731416): Check with the autofill service |
| * team if the order matters, and how duplicate types are handled. |
| * |
| * @property boundingBox The screen coordinates of the composable being autofilled. |
| * This data is used by the autofill framework to decide where to show the autofill popup. |
| * |
| * @property onFill The callback that is called by the autofill framework to perform autofill. |
| * |
| * @property id A virtual id that is automatically generated for each node. |
| */ |
| data class AutofillNode( |
| val autofillTypes: List<AutofillType> = listOf(), |
| var boundingBox: Rect? = null, |
| val onFill: ((String) -> Unit)? |
| ) { |
| internal companion object { |
| @GuardedBy("this") |
| private var previousId = 0 |
| |
| @Suppress("DEPRECATION_ERROR") |
| private fun generateId() = |
| synchronized(this) { ++previousId } |
| } |
| |
| val id: Int = generateId() |
| } |