blob: 86b89adb5ce38dcfd2525fd2a9fb60703cafb301 [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.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.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/111276913): add javadocs / implement Parcelable / implement
//TODO(b/111276913): 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
public final class ViewNode extends AssistStructure.ViewNode {
private static final String TAG = "ViewNode";
private AutofillId mParentAutofillId;
// TODO(b/111276913): temporarily setting some fields here while they're not accessible from the
// superclass
private AutofillId mAutofillId;
private CharSequence mText;
private String mClassName;
/** @hide */
public ViewNode() {
}
/**
* 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;
}
// TODO(b/111276913): temporarily overwriting some methods
@Override
public AutofillId getAutofillId() {
return mAutofillId;
}
@Override
public CharSequence getText() {
return mText;
}
@Override
public String getClassName() {
return mClassName;
}
/** @hide */
public static void writeToParcel(@NonNull Parcel parcel, @Nullable ViewNode node, int flags) {
if (node == null) {
parcel.writeParcelable(null, flags);
return;
}
parcel.writeParcelable(node.mAutofillId, flags);
parcel.writeParcelable(node.mParentAutofillId, flags);
parcel.writeCharSequence(node.mText);
parcel.writeString(node.mClassName);
}
/** @hide */
public static @Nullable ViewNode readFromParcel(@NonNull Parcel parcel) {
final AutofillId id = parcel.readParcelable(null);
if (id == null) return null;
final ViewNode node = new ViewNode();
node.mAutofillId = id;
node.mParentAutofillId = parcel.readParcelable(null);
node.mText = parcel.readCharSequence();
node.mClassName = parcel.readString();
return node;
}
/** @hide */
static final class ViewStructureImpl extends ViewStructure {
final ViewNode mNode = new ViewNode();
ViewStructureImpl(@NonNull View view) {
mNode.mAutofillId = Preconditions.checkNotNull(view).getAutofillId();
final ViewParent parent = view.getParent();
if (parent instanceof View) {
mNode.mParentAutofillId = ((View) parent).getAutofillId();
}
}
ViewStructureImpl(@NonNull AutofillId parentId, int virtualId) {
mNode.mParentAutofillId = Preconditions.checkNotNull(parentId);
mNode.mAutofillId = new AutofillId(parentId, virtualId);
}
@Override
public void setId(int id, String packageName, String typeName, String entryName) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setDimens(int left, int top, int scrollX, int scrollY, int width, int height) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setTransformation(Matrix matrix) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setElevation(float elevation) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setAlpha(float alpha) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setVisibility(int visibility) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setAssistBlocked(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setEnabled(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setClickable(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setLongClickable(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setContextClickable(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setFocusable(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setFocused(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setAccessibilityFocused(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setCheckable(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setChecked(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setSelected(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setActivated(boolean state) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setOpaque(boolean opaque) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setClassName(String className) {
// TODO(b/111276913): temporarily setting directly; should be done on superclass instead
mNode.mClassName = className;
}
@Override
public void setContentDescription(CharSequence contentDescription) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setText(CharSequence text) {
// TODO(b/111276913): temporarily setting directly; should be done on superclass instead
mNode.mText = text;
}
@Override
public void setText(CharSequence text, int selectionStart, int selectionEnd) {
// TODO(b/111276913): temporarily setting directly; should be done on superclass instead
mNode.mText = text;
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setTextStyle(float size, int fgColor, int bgColor, int style) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setTextLines(int[] charOffsets, int[] baselines) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setHint(CharSequence hint) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public CharSequence getText() {
// TODO(b/111276913): temporarily getting directly; should be done on superclass instead
return mNode.mText;
}
@Override
public int getTextSelectionStart() {
// TODO(b/111276913): implement or move to superclass
return 0;
}
@Override
public int getTextSelectionEnd() {
// TODO(b/111276913): implement or move to superclass
return 0;
}
@Override
public CharSequence getHint() {
// TODO(b/111276913): implement or move to superclass
return null;
}
@Override
public Bundle getExtras() {
// TODO(b/111276913): implement or move to superclass
return null;
}
@Override
public boolean hasExtras() {
// TODO(b/111276913): implement or move to superclass
return false;
}
@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() {
// TODO(b/111276913): temporarily getting directly; should be done on superclass instead
return mNode.mAutofillId;
}
@Override
public void setAutofillId(AutofillId id) {
// TODO(b/111276913): temporarily setting directly; should be done on superclass instead
mNode.mAutofillId = id;
}
@Override
public void setAutofillId(AutofillId parentId, int virtualId) {
// TODO(b/111276913): temporarily setting directly; should be done on superclass instead
mNode.mAutofillId = new AutofillId(parentId, virtualId);
}
@Override
public void setAutofillType(int type) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setAutofillHints(String[] hint) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setAutofillValue(AutofillValue value) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setAutofillOptions(CharSequence[] options) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setInputType(int inputType) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void setDataIsSensitive(boolean sensitive) {
// TODO(b/111276913): implement or move to superclass
}
@Override
public void asyncCommit() {
Log.w(TAG, "asyncCommit() is not supported");
}
@Override
public Rect getTempRect() {
// TODO(b/111276913): implement or move to superclass
return null;
}
@Override
public void setWebDomain(String domain) {
Log.w(TAG, "setWebDomain() is not supported");
}
@Override
public void setLocaleList(LocaleList localeList) {
// TODO(b/111276913): implement or move to superclass
}
@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");
}
}
}