blob: 6d81a59b1f9fe0aa6166e408bb176df450110949 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*
* 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.service;
import android.app.assist.AssistStructure;
import android.app.assist.AssistStructure.ViewNode;
import android.app.assist.AssistStructure.WindowNode;
import android.util.Log;
import com.example.android.autofillframework.service.model.AutofillField;
import com.example.android.autofillframework.service.model.AutofillFieldsCollection;
import com.example.android.autofillframework.service.model.ClientFormData;
import com.example.android.autofillframework.service.model.SavableAutofillData;
import static com.example.android.autofillframework.CommonUtil.TAG;
/**
* 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.
*/
final class StructureParser {
private final AutofillFieldsCollection mAutofillFields = new AutofillFieldsCollection();
private final AssistStructure mStructure;
private ClientFormData mClientFormData;
StructureParser(AssistStructure structure) {
mStructure = structure;
}
public void parseForFill() {
parse(true);
}
public void parseForSave() {
parse(false);
}
/**
* Traverse AssistStructure and add ViewNode metadata to a flat list.
*/
private void parse(boolean forFill) {
Log.d(TAG, "Parsing structure for " + mStructure.getActivityComponent());
int nodes = mStructure.getWindowNodeCount();
mClientFormData = new ClientFormData();
for (int i = 0; i < nodes; i++) {
WindowNode node = mStructure.getWindowNodeAt(i);
ViewNode view = node.getRootViewNode();
parseLocked(forFill, view);
}
}
private void parseLocked(boolean forFill, ViewNode viewNode) {
if (viewNode.getAutofillHints() != null && viewNode.getAutofillHints().length > 0) {
//TODO check to make sure hints are supported by service.
if (forFill) {
mAutofillFields.add(new AutofillField(viewNode));
} else {
mClientFormData.setAutofillValuesForHints
(viewNode.getAutofillHints(), new SavableAutofillData(viewNode));
}
}
int childrenSize = viewNode.getChildCount();
if (childrenSize > 0) {
for (int i = 0; i < childrenSize; i++) {
parseLocked(forFill, viewNode.getChildAt(i));
}
}
}
public AutofillFieldsCollection getAutofillFields() {
return mAutofillFields;
}
public ClientFormData getClientFormData() {
return mClientFormData;
}
}
|