aboutsummaryrefslogtreecommitdiff
path: root/input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/multidatasetservice/StructureParser.kt
diff options
context:
space:
mode:
authorDouglas Sigelbaum <sigelbaum@google.com>2017-06-07 16:21:09 -0400
committerDouglas Sigelbaum <sigelbaum@google.com>2017-06-07 17:53:35 -0400
commitd44566a42776d03195b15ba394d0d861306c0057 (patch)
tree8b24e014ce03b3e50826ef628bf283459d46c8f6 /input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/multidatasetservice/StructureParser.kt
parentb7d6772dc5b2a35a1d23cd274f9e3e17b4b55b08 (diff)
downloadandroid-d44566a42776d03195b15ba394d0d861306c0057.tar.gz
Renaming sample autofill service to Multidataset
AutofillService. Bug: 38182790 Test: manual Change-Id: I21784ece130355f9bd1efec811bba7c0bfba5b70
Diffstat (limited to 'input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/multidatasetservice/StructureParser.kt')
-rw-r--r--input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/multidatasetservice/StructureParser.kt78
1 files changed, 78 insertions, 0 deletions
diff --git a/input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/multidatasetservice/StructureParser.kt b/input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/multidatasetservice/StructureParser.kt
new file mode 100644
index 00000000..78cab5ee
--- /dev/null
+++ b/input/autofill/AutofillFramework/kotlinApp/Application/src/main/java/com/example/android/autofillframework/multidatasetservice/StructureParser.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2017 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 com.example.android.autofillframework.multidatasetservice
+
+import android.app.assist.AssistStructure
+import android.app.assist.AssistStructure.ViewNode
+import android.util.Log
+import com.example.android.autofillframework.CommonUtil.TAG
+import com.example.android.autofillframework.multidatasetservice.model.AutofillField
+import com.example.android.autofillframework.multidatasetservice.model.AutofillFieldsCollection
+import com.example.android.autofillframework.multidatasetservice.model.ClientFormData
+import com.example.android.autofillframework.multidatasetservice.model.SavableAutofillData
+
+/**
+ * Parser for an AssistStructure object. This is invoked when the Autofill Service receives an
+ * AssistStructure from the client Activity, representing its View hierarchy. In this sample, it
+ * parses the hierarchy and collects autofill metadata from {@link ViewNode}s along the way.
+ */
+internal class StructureParser(private val mStructure: AssistStructure) {
+ val autofillFields = AutofillFieldsCollection()
+ var clientFormData: ClientFormData = ClientFormData()
+ private set
+
+
+ fun parseForFill() {
+ parse(true)
+ }
+
+ fun parseForSave() {
+ parse(false)
+ }
+
+ /**
+ * Traverse AssistStructure and add ViewNode metadata to a flat list.
+ */
+ private fun parse(forFill: Boolean) {
+ Log.d(TAG, "Parsing structure for " + mStructure.activityComponent)
+ val nodes = mStructure.windowNodeCount
+ clientFormData = ClientFormData()
+ for (i in 0..nodes - 1) {
+ val node = mStructure.getWindowNodeAt(i)
+ val view = node.rootViewNode
+ parseLocked(forFill, view)
+ }
+ }
+
+ private fun parseLocked(forFill: Boolean, viewNode: ViewNode) {
+ viewNode.autofillHints?.let { autofillHints ->
+ if (autofillHints.isNotEmpty()) {
+ if (forFill) {
+ autofillFields.add(AutofillField(viewNode))
+ } else {
+ clientFormData.setAutofillValuesForHints(viewNode.autofillHints,
+ SavableAutofillData(viewNode))
+ }
+ }
+ }
+ val childrenSize = viewNode.childCount
+ if (childrenSize > 0) {
+ for (i in 0..childrenSize - 1) {
+ parseLocked(forFill, viewNode.getChildAt(i))
+ }
+ }
+ }
+}