blob: 8d6245458d62f6597bf548dc15c7ec796dc41eff [file] [log] [blame]
/*
* Copyright (C) 2018 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 android.view.contentcapture;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.app.assist.AssistStructure;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.LocaleList;
import android.os.Parcel;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewParent;
import android.view.ViewStructure;
import android.view.ViewStructure.HtmlInfo.Builder;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
import com.android.internal.util.Preconditions;
//TODO(b/122484602): add javadocs / implement Parcelable / implement
//TODO(b/122484602): for now it's extending ViewNode directly as it needs most of its properties,
// but it might be better to create a common, abstract android.view.ViewNode class that both extend
// instead
/** @hide */
@SystemApi
@TestApi
public final class ViewNode extends AssistStructure.ViewNode {
private static final String TAG = ViewNode.class.getSimpleName();
private static final long FLAGS_HAS_TEXT = 1L << 0;
private static final long FLAGS_HAS_COMPLEX_TEXT = 1L << 1;
private static final long FLAGS_VISIBILITY_MASK = View.VISIBLE | View.INVISIBLE | View.GONE;
private static final long FLAGS_HAS_CLASSNAME = 1L << 4;
private static final long FLAGS_HAS_AUTOFILL_ID = 1L << 5;
private static final long FLAGS_HAS_AUTOFILL_PARENT_ID = 1L << 6;
private static final long FLAGS_HAS_ID = 1L << 7;
private static final long FLAGS_HAS_LARGE_COORDS = 1L << 8;
private static final long FLAGS_HAS_SCROLL = 1L << 9;
private static final long FLAGS_ASSIST_BLOCKED = 1L << 10;
private static final long FLAGS_DISABLED = 1L << 11;
private static final long FLAGS_CLICKABLE = 1L << 12;
private static final long FLAGS_LONG_CLICKABLE = 1L << 13;
private static final long FLAGS_CONTEXT_CLICKABLE = 1L << 14;
private static final long FLAGS_FOCUSABLE = 1L << 15;
private static final long FLAGS_FOCUSED = 1L << 16;
private static final long FLAGS_ACCESSIBILITY_FOCUSED = 1L << 17;
private static final long FLAGS_CHECKABLE = 1L << 18;
private static final long FLAGS_CHECKED = 1L << 19;
private static final long FLAGS_SELECTED = 1L << 20;
private static final long FLAGS_ACTIVATED = 1L << 21;
private static final long FLAGS_OPAQUE = 1L << 22;
private static final long FLAGS_HAS_CONTENT_DESCRIPTION = 1L << 23;
private static final long FLAGS_HAS_EXTRAS = 1L << 24;
private static final long FLAGS_HAS_LOCALE_LIST = 1L << 25;
private static final long FLAGS_HAS_INPUT_TYPE = 1L << 26;
private static final long FLAGS_HAS_MIN_TEXT_EMS = 1L << 27;
private static final long FLAGS_HAS_MAX_TEXT_EMS = 1L << 28;
private static final long FLAGS_HAS_MAX_TEXT_LENGTH = 1L << 29;
private static final long FLAGS_HAS_TEXT_ID_ENTRY = 1L << 30;
private static final long FLAGS_HAS_AUTOFILL_TYPE = 1L << 31;
private static final long FLAGS_HAS_AUTOFILL_VALUE = 1L << 32;
private static final long FLAGS_HAS_AUTOFILL_HINTS = 1L << 33;
private static final long FLAGS_HAS_AUTOFILL_OPTIONS = 1L << 34;
/** Flags used to optimize what's written to the parcel */
private long mFlags;
private AutofillId mParentAutofillId;
private AutofillId mAutofillId;
private ViewNodeText mText;
private String mClassName;
private int mId = View.NO_ID;
private String mIdPackage;
private String mIdType;
private String mIdEntry;
private int mX;
private int mY;
private int mScrollX;
private int mScrollY;
private int mWidth;
private int mHeight;
private CharSequence mContentDescription;
private Bundle mExtras;
private LocaleList mLocaleList;
private int mInputType;
private int mMinEms = -1;
private int mMaxEms = -1;
private int mMaxLength = -1;
private String mTextIdEntry;
private @View.AutofillType int mAutofillType = View.AUTOFILL_TYPE_NONE;
private String[] mAutofillHints;
private AutofillValue mAutofillValue;
private CharSequence[] mAutofillOptions;
/** @hide */
public ViewNode() {
}
private ViewNode(long nodeFlags, @NonNull Parcel parcel) {
mFlags = nodeFlags;
if ((nodeFlags & FLAGS_HAS_AUTOFILL_ID) != 0) {
mAutofillId = parcel.readParcelable(null);
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_PARENT_ID) != 0) {
mParentAutofillId = parcel.readParcelable(null);
}
if ((nodeFlags & FLAGS_HAS_TEXT) != 0) {
mText = new ViewNodeText(parcel, (nodeFlags & FLAGS_HAS_COMPLEX_TEXT) == 0);
}
if ((nodeFlags & FLAGS_HAS_CLASSNAME) != 0) {
mClassName = parcel.readString();
}
if ((nodeFlags & FLAGS_HAS_ID) != 0) {
mId = parcel.readInt();
if (mId != View.NO_ID) {
mIdEntry = parcel.readString();
if (mIdEntry != null) {
mIdType = parcel.readString();
mIdPackage = parcel.readString();
}
}
}
if ((nodeFlags & FLAGS_HAS_LARGE_COORDS) != 0) {
mX = parcel.readInt();
mY = parcel.readInt();
mWidth = parcel.readInt();
mHeight = parcel.readInt();
} else {
int val = parcel.readInt();
mX = val & 0x7fff;
mY = (val >> 16) & 0x7fff;
val = parcel.readInt();
mWidth = val & 0x7fff;
mHeight = (val >> 16) & 0x7fff;
}
if ((nodeFlags & FLAGS_HAS_SCROLL) != 0) {
mScrollX = parcel.readInt();
mScrollY = parcel.readInt();
}
if ((nodeFlags & FLAGS_HAS_CONTENT_DESCRIPTION) != 0) {
mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
}
if ((nodeFlags & FLAGS_HAS_EXTRAS) != 0) {
mExtras = parcel.readBundle();
}
if ((nodeFlags & FLAGS_HAS_LOCALE_LIST) != 0) {
mLocaleList = parcel.readParcelable(null);
}
if ((nodeFlags & FLAGS_HAS_INPUT_TYPE) != 0) {
mInputType = parcel.readInt();
}
if ((nodeFlags & FLAGS_HAS_MIN_TEXT_EMS) != 0) {
mMinEms = parcel.readInt();
}
if ((nodeFlags & FLAGS_HAS_MAX_TEXT_EMS) != 0) {
mMaxEms = parcel.readInt();
}
if ((nodeFlags & FLAGS_HAS_MAX_TEXT_LENGTH) != 0) {
mMaxLength = parcel.readInt();
}
if ((nodeFlags & FLAGS_HAS_TEXT_ID_ENTRY) != 0) {
mTextIdEntry = parcel.readString();
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_TYPE) != 0) {
mAutofillType = parcel.readInt();
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_HINTS) != 0) {
mAutofillHints = parcel.readStringArray();
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_VALUE) != 0) {
mAutofillValue = parcel.readParcelable(null);
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_OPTIONS) != 0) {
mAutofillOptions = parcel.readCharSequenceArray();
}
}
/**
* Returns the {@link AutofillId} of this view's parent, if the parent is also part of the
* screen observation tree.
*/
@Nullable
public AutofillId getParentAutofillId() {
return mParentAutofillId;
}
@Override
public AutofillId getAutofillId() {
return mAutofillId;
}
@Override
public CharSequence getText() {
return mText != null ? mText.mText : null;
}
@Override
public String getClassName() {
return mClassName;
}
@Override
public int getId() {
return mId;
}
@Override
public String getIdPackage() {
return mIdPackage;
}
@Override
public String getIdType() {
return mIdType;
}
@Override
public String getIdEntry() {
return mIdEntry;
}
@Override
public int getLeft() {
return mX;
}
@Override
public int getTop() {
return mY;
}
@Override
public int getScrollX() {
return mScrollX;
}
@Override
public int getScrollY() {
return mScrollY;
}
@Override
public int getWidth() {
return mWidth;
}
@Override
public int getHeight() {
return mHeight;
}
@Override
public boolean isAssistBlocked() {
return (mFlags & FLAGS_ASSIST_BLOCKED) != 0;
}
@Override
public boolean isEnabled() {
return (mFlags & FLAGS_DISABLED) == 0;
}
@Override
public boolean isClickable() {
return (mFlags & FLAGS_CLICKABLE) != 0;
}
@Override
public boolean isLongClickable() {
return (mFlags & FLAGS_LONG_CLICKABLE) != 0;
}
@Override
public boolean isContextClickable() {
return (mFlags & FLAGS_CONTEXT_CLICKABLE) != 0;
}
@Override
public boolean isFocusable() {
return (mFlags & FLAGS_FOCUSABLE) != 0;
}
@Override
public boolean isFocused() {
return (mFlags & FLAGS_FOCUSED) != 0;
}
@Override
public boolean isAccessibilityFocused() {
return (mFlags & FLAGS_ACCESSIBILITY_FOCUSED) != 0;
}
@Override
public boolean isCheckable() {
return (mFlags & FLAGS_CHECKABLE) != 0;
}
@Override
public boolean isChecked() {
return (mFlags & FLAGS_CHECKED) != 0;
}
@Override
public boolean isSelected() {
return (mFlags & FLAGS_SELECTED) != 0;
}
@Override
public boolean isActivated() {
return (mFlags & FLAGS_ACTIVATED) != 0;
}
@Override
public boolean isOpaque() {
return (mFlags & FLAGS_OPAQUE) != 0;
}
@Override
public CharSequence getContentDescription() {
return mContentDescription;
}
@Override
public Bundle getExtras() {
return mExtras;
}
@Override
public String getHint() {
return mText != null ? mText.mHint : null;
}
@Override
public int getTextSelectionStart() {
return mText != null ? mText.mTextSelectionStart : -1;
}
@Override
public int getTextSelectionEnd() {
return mText != null ? mText.mTextSelectionEnd : -1;
}
@Override
public int getTextColor() {
return mText != null ? mText.mTextColor : TEXT_COLOR_UNDEFINED;
}
@Override
public int getTextBackgroundColor() {
return mText != null ? mText.mTextBackgroundColor : TEXT_COLOR_UNDEFINED;
}
@Override
public float getTextSize() {
return mText != null ? mText.mTextSize : 0;
}
@Override
public int getTextStyle() {
return mText != null ? mText.mTextStyle : 0;
}
@Override
public int[] getTextLineCharOffsets() {
return mText != null ? mText.mLineCharOffsets : null;
}
@Override
public int[] getTextLineBaselines() {
return mText != null ? mText.mLineBaselines : null;
}
@Override
public int getVisibility() {
return (int) (mFlags & FLAGS_VISIBILITY_MASK);
}
@Override
public int getInputType() {
return mInputType;
}
@Override
public int getMinTextEms() {
return mMinEms;
}
@Override
public int getMaxTextEms() {
return mMaxEms;
}
@Override
public int getMaxTextLength() {
return mMaxLength;
}
@Override
public String getTextIdEntry() {
return mTextIdEntry;
}
@Override
public @View.AutofillType int getAutofillType() {
return mAutofillType;
}
@Override
@Nullable public String[] getAutofillHints() {
return mAutofillHints;
}
@Override
@Nullable public AutofillValue getAutofillValue() {
return mAutofillValue;
}
@Override
@Nullable public CharSequence[] getAutofillOptions() {
return mAutofillOptions;
}
@Override
public LocaleList getLocaleList() {
return mLocaleList;
}
private void writeSelfToParcel(@NonNull Parcel parcel, int parcelFlags) {
long nodeFlags = mFlags;
if (mAutofillId != null) {
nodeFlags |= FLAGS_HAS_AUTOFILL_ID;
}
if (mParentAutofillId != null) {
nodeFlags |= FLAGS_HAS_AUTOFILL_PARENT_ID;
}
if (mText != null) {
nodeFlags |= FLAGS_HAS_TEXT;
if (!mText.isSimple()) {
nodeFlags |= FLAGS_HAS_COMPLEX_TEXT;
}
}
if (mClassName != null) {
nodeFlags |= FLAGS_HAS_CLASSNAME;
}
if (mId != View.NO_ID) {
nodeFlags |= FLAGS_HAS_ID;
}
if ((mX & ~0x7fff) != 0 || (mY & ~0x7fff) != 0
|| (mWidth & ~0x7fff) != 0 | (mHeight & ~0x7fff) != 0) {
nodeFlags |= FLAGS_HAS_LARGE_COORDS;
}
if (mScrollX != 0 || mScrollY != 0) {
nodeFlags |= FLAGS_HAS_SCROLL;
}
if (mContentDescription != null) {
nodeFlags |= FLAGS_HAS_CONTENT_DESCRIPTION;
}
if (mExtras != null) {
nodeFlags |= FLAGS_HAS_EXTRAS;
}
if (mLocaleList != null) {
nodeFlags |= FLAGS_HAS_LOCALE_LIST;
}
if (mInputType != 0) {
nodeFlags |= FLAGS_HAS_INPUT_TYPE;
}
if (mMinEms > -1) {
nodeFlags |= FLAGS_HAS_MIN_TEXT_EMS;
}
if (mMaxEms > -1) {
nodeFlags |= FLAGS_HAS_MAX_TEXT_EMS;
}
if (mMaxLength > -1) {
nodeFlags |= FLAGS_HAS_MAX_TEXT_LENGTH;
}
if (mTextIdEntry != null) {
nodeFlags |= FLAGS_HAS_TEXT_ID_ENTRY;
}
if (mAutofillValue != null) {
nodeFlags |= FLAGS_HAS_AUTOFILL_VALUE;
}
if (mAutofillType != View.AUTOFILL_TYPE_NONE) {
nodeFlags |= FLAGS_HAS_AUTOFILL_TYPE;
}
if (mAutofillHints != null) {
nodeFlags |= FLAGS_HAS_AUTOFILL_HINTS;
}
if (mAutofillOptions != null) {
nodeFlags |= FLAGS_HAS_AUTOFILL_OPTIONS;
}
parcel.writeLong(nodeFlags);
if ((nodeFlags & FLAGS_HAS_AUTOFILL_ID) != 0) {
parcel.writeParcelable(mAutofillId, parcelFlags);
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_PARENT_ID) != 0) {
parcel.writeParcelable(mParentAutofillId, parcelFlags);
}
if ((nodeFlags & FLAGS_HAS_TEXT) != 0) {
mText.writeToParcel(parcel, (nodeFlags & FLAGS_HAS_COMPLEX_TEXT) == 0);
}
if ((nodeFlags & FLAGS_HAS_CLASSNAME) != 0) {
parcel.writeString(mClassName);
}
if ((nodeFlags & FLAGS_HAS_ID) != 0) {
parcel.writeInt(mId);
if (mId != View.NO_ID) {
parcel.writeString(mIdEntry);
if (mIdEntry != null) {
parcel.writeString(mIdType);
parcel.writeString(mIdPackage);
}
}
}
if ((nodeFlags & FLAGS_HAS_LARGE_COORDS) != 0) {
parcel.writeInt(mX);
parcel.writeInt(mY);
parcel.writeInt(mWidth);
parcel.writeInt(mHeight);
} else {
parcel.writeInt((mY << 16) | mX);
parcel.writeInt((mHeight << 16) | mWidth);
}
if ((nodeFlags & FLAGS_HAS_SCROLL) != 0) {
parcel.writeInt(mScrollX);
parcel.writeInt(mScrollY);
}
if ((nodeFlags & FLAGS_HAS_CONTENT_DESCRIPTION) != 0) {
TextUtils.writeToParcel(mContentDescription, parcel, 0);
}
if ((nodeFlags & FLAGS_HAS_EXTRAS) != 0) {
parcel.writeBundle(mExtras);
}
if ((nodeFlags & FLAGS_HAS_LOCALE_LIST) != 0) {
parcel.writeParcelable(mLocaleList, 0);
}
if ((nodeFlags & FLAGS_HAS_INPUT_TYPE) != 0) {
parcel.writeInt(mInputType);
}
if ((nodeFlags & FLAGS_HAS_MIN_TEXT_EMS) != 0) {
parcel.writeInt(mMinEms);
}
if ((nodeFlags & FLAGS_HAS_MAX_TEXT_EMS) != 0) {
parcel.writeInt(mMaxEms);
}
if ((nodeFlags & FLAGS_HAS_MAX_TEXT_LENGTH) != 0) {
parcel.writeInt(mMaxLength);
}
if ((nodeFlags & FLAGS_HAS_TEXT_ID_ENTRY) != 0) {
parcel.writeString(mTextIdEntry);
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_TYPE) != 0) {
parcel.writeInt(mAutofillType);
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_HINTS) != 0) {
parcel.writeStringArray(mAutofillHints);
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_VALUE) != 0) {
parcel.writeParcelable(mAutofillValue, 0);
}
if ((nodeFlags & FLAGS_HAS_AUTOFILL_OPTIONS) != 0) {
parcel.writeCharSequenceArray(mAutofillOptions);
}
}
/** @hide */
@TestApi
public static void writeToParcel(@NonNull Parcel parcel, @Nullable ViewNode node, int flags) {
if (node == null) {
parcel.writeLong(0);
} else {
node.writeSelfToParcel(parcel, flags);
}
}
/** @hide */
@TestApi
public static @Nullable ViewNode readFromParcel(@NonNull Parcel parcel) {
final long nodeFlags = parcel.readLong();
return nodeFlags == 0 ? null : new ViewNode(nodeFlags, parcel);
}
/** @hide */
@TestApi
public static final class ViewStructureImpl extends ViewStructure {
final ViewNode mNode = new ViewNode();
/** @hide */
@TestApi
public ViewStructureImpl(@NonNull View view) {
mNode.mAutofillId = Preconditions.checkNotNull(view).getAutofillId();
final ViewParent parent = view.getParent();
if (parent instanceof View) {
mNode.mParentAutofillId = ((View) parent).getAutofillId();
}
}
/** @hide */
@TestApi
public ViewStructureImpl(@NonNull AutofillId parentId, long virtualId, int sessionId) {
mNode.mParentAutofillId = Preconditions.checkNotNull(parentId);
mNode.mAutofillId = new AutofillId(parentId, virtualId, sessionId);
}
/** @hide */
@TestApi
public ViewNode getNode() {
return mNode;
}
@Override
public void setId(int id, String packageName, String typeName, String entryName) {
mNode.mId = id;
mNode.mIdPackage = packageName;
mNode.mIdType = typeName;
mNode.mIdEntry = entryName;
}
@Override
public void setDimens(int left, int top, int scrollX, int scrollY, int width, int height) {
mNode.mX = left;
mNode.mY = top;
mNode.mScrollX = scrollX;
mNode.mScrollY = scrollY;
mNode.mWidth = width;
mNode.mHeight = height;
}
@Override
public void setTransformation(Matrix matrix) {
Log.w(TAG, "setTransformation() is not supported");
}
@Override
public void setElevation(float elevation) {
Log.w(TAG, "setElevation() is not supported");
}
@Override
public void setAlpha(float alpha) {
Log.w(TAG, "setAlpha() is not supported");
}
@Override
public void setVisibility(int visibility) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_VISIBILITY_MASK)
| (visibility & FLAGS_VISIBILITY_MASK);
}
@Override
public void setAssistBlocked(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_ASSIST_BLOCKED)
| (state ? FLAGS_ASSIST_BLOCKED : 0);
}
@Override
public void setEnabled(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_DISABLED) | (state ? 0 : FLAGS_DISABLED);
}
@Override
public void setClickable(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_CLICKABLE) | (state ? FLAGS_CLICKABLE : 0);
}
@Override
public void setLongClickable(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_LONG_CLICKABLE)
| (state ? FLAGS_LONG_CLICKABLE : 0);
}
@Override
public void setContextClickable(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_CONTEXT_CLICKABLE)
| (state ? FLAGS_CONTEXT_CLICKABLE : 0);
}
@Override
public void setFocusable(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_FOCUSABLE) | (state ? FLAGS_FOCUSABLE : 0);
}
@Override
public void setFocused(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_FOCUSED) | (state ? FLAGS_FOCUSED : 0);
}
@Override
public void setAccessibilityFocused(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_ACCESSIBILITY_FOCUSED)
| (state ? FLAGS_ACCESSIBILITY_FOCUSED : 0);
}
@Override
public void setCheckable(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_CHECKABLE) | (state ? FLAGS_CHECKABLE : 0);
}
@Override
public void setChecked(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_CHECKED) | (state ? FLAGS_CHECKED : 0);
}
@Override
public void setSelected(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_SELECTED) | (state ? FLAGS_SELECTED : 0);
}
@Override
public void setActivated(boolean state) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_ACTIVATED) | (state ? FLAGS_ACTIVATED : 0);
}
@Override
public void setOpaque(boolean opaque) {
mNode.mFlags = (mNode.mFlags & ~FLAGS_OPAQUE) | (opaque ? FLAGS_OPAQUE : 0);
}
@Override
public void setClassName(String className) {
mNode.mClassName = className;
}
@Override
public void setContentDescription(CharSequence contentDescription) {
mNode.mContentDescription = contentDescription;
}
@Override
public void setText(CharSequence text) {
final ViewNodeText t = getNodeText();
t.mText = TextUtils.trimNoCopySpans(text);
t.mTextSelectionStart = t.mTextSelectionEnd = -1;
}
@Override
public void setText(CharSequence text, int selectionStart, int selectionEnd) {
final ViewNodeText t = getNodeText();
t.mText = TextUtils.trimNoCopySpans(text);
t.mTextSelectionStart = selectionStart;
t.mTextSelectionEnd = selectionEnd;
}
@Override
public void setTextStyle(float size, int fgColor, int bgColor, int style) {
final ViewNodeText t = getNodeText();
t.mTextColor = fgColor;
t.mTextBackgroundColor = bgColor;
t.mTextSize = size;
t.mTextStyle = style;
}
@Override
public void setTextLines(int[] charOffsets, int[] baselines) {
final ViewNodeText t = getNodeText();
t.mLineCharOffsets = charOffsets;
t.mLineBaselines = baselines;
}
@Override
public void setTextIdEntry(String entryName) {
mNode.mTextIdEntry = Preconditions.checkNotNull(entryName);
}
@Override
public void setHint(CharSequence hint) {
getNodeText().mHint = hint != null ? hint.toString() : null;
}
@Override
public CharSequence getText() {
return mNode.getText();
}
@Override
public int getTextSelectionStart() {
return mNode.getTextSelectionStart();
}
@Override
public int getTextSelectionEnd() {
return mNode.getTextSelectionEnd();
}
@Override
public CharSequence getHint() {
return mNode.getHint();
}
@Override
public Bundle getExtras() {
if (mNode.mExtras != null) {
return mNode.mExtras;
}
mNode.mExtras = new Bundle();
return mNode.mExtras;
}
@Override
public boolean hasExtras() {
return mNode.mExtras != null;
}
@Override
public void setChildCount(int num) {
Log.w(TAG, "setChildCount() is not supported");
}
@Override
public int addChildCount(int num) {
Log.w(TAG, "addChildCount() is not supported");
return 0;
}
@Override
public int getChildCount() {
Log.w(TAG, "getChildCount() is not supported");
return 0;
}
@Override
public ViewStructure newChild(int index) {
Log.w(TAG, "newChild() is not supported");
return null;
}
@Override
public ViewStructure asyncNewChild(int index) {
Log.w(TAG, "asyncNewChild() is not supported");
return null;
}
@Override
public AutofillId getAutofillId() {
return mNode.mAutofillId;
}
@Override
public void setAutofillId(AutofillId id) {
mNode.mAutofillId = Preconditions.checkNotNull(id);
}
@Override
public void setAutofillId(AutofillId parentId, int virtualId) {
mNode.mParentAutofillId = Preconditions.checkNotNull(parentId);
mNode.mAutofillId = new AutofillId(parentId, virtualId);
}
@Override
public void setAutofillType(@View.AutofillType int type) {
mNode.mAutofillType = type;
}
@Override
public void setAutofillHints(String[] hints) {
mNode.mAutofillHints = hints;
}
@Override
public void setAutofillValue(AutofillValue value) {
mNode.mAutofillValue = value;
}
@Override
public void setAutofillOptions(CharSequence[] options) {
mNode.mAutofillOptions = options;
}
@Override
public void setInputType(int inputType) {
mNode.mInputType = inputType;
}
@Override
public void setMinTextEms(int minEms) {
mNode.mMinEms = minEms;
}
@Override
public void setMaxTextEms(int maxEms) {
mNode.mMaxEms = maxEms;
}
@Override
public void setMaxTextLength(int maxLength) {
mNode.mMaxLength = maxLength;
}
@Override
public void setDataIsSensitive(boolean sensitive) {
Log.w(TAG, "setDataIsSensitive() is not supported");
}
@Override
public void asyncCommit() {
Log.w(TAG, "asyncCommit() is not supported");
}
@Override
public Rect getTempRect() {
Log.w(TAG, "getTempRect() is not supported");
return null;
}
@Override
public void setWebDomain(String domain) {
Log.w(TAG, "setWebDomain() is not supported");
}
@Override
public void setLocaleList(LocaleList localeList) {
mNode.mLocaleList = localeList;
}
@Override
public Builder newHtmlInfoBuilder(String tagName) {
Log.w(TAG, "newHtmlInfoBuilder() is not supported");
return null;
}
@Override
public void setHtmlInfo(HtmlInfo htmlInfo) {
Log.w(TAG, "setHtmlInfo() is not supported");
}
private ViewNodeText getNodeText() {
if (mNode.mText != null) {
return mNode.mText;
}
mNode.mText = new ViewNodeText();
return mNode.mText;
}
}
//TODO(b/122484602): copied 'as-is' from AssistStructure, except for writeSensitive
static final class ViewNodeText {
CharSequence mText;
float mTextSize;
int mTextStyle;
int mTextColor = ViewNode.TEXT_COLOR_UNDEFINED;
int mTextBackgroundColor = ViewNode.TEXT_COLOR_UNDEFINED;
int mTextSelectionStart;
int mTextSelectionEnd;
int[] mLineCharOffsets;
int[] mLineBaselines;
String mHint;
ViewNodeText() {
}
boolean isSimple() {
return mTextBackgroundColor == ViewNode.TEXT_COLOR_UNDEFINED
&& mTextSelectionStart == 0 && mTextSelectionEnd == 0
&& mLineCharOffsets == null && mLineBaselines == null && mHint == null;
}
ViewNodeText(Parcel in, boolean simple) {
mText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
mTextSize = in.readFloat();
mTextStyle = in.readInt();
mTextColor = in.readInt();
if (!simple) {
mTextBackgroundColor = in.readInt();
mTextSelectionStart = in.readInt();
mTextSelectionEnd = in.readInt();
mLineCharOffsets = in.createIntArray();
mLineBaselines = in.createIntArray();
mHint = in.readString();
}
}
void writeToParcel(Parcel out, boolean simple) {
TextUtils.writeToParcel(mText, out, 0);
out.writeFloat(mTextSize);
out.writeInt(mTextStyle);
out.writeInt(mTextColor);
if (!simple) {
out.writeInt(mTextBackgroundColor);
out.writeInt(mTextSelectionStart);
out.writeInt(mTextSelectionEnd);
out.writeIntArray(mLineCharOffsets);
out.writeIntArray(mLineBaselines);
out.writeString(mHint);
}
}
}
}