summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Leme <felipeal@google.com>2019-04-12 11:53:16 -0700
committerFelipe Leme <felipeal@google.com>2019-04-15 09:36:25 -0700
commitef1c0b36ab402c9f936220dd4f64f4ac96f52e37 (patch)
treeec760dfe4ce4b8e8135ac3e83ae561c7eb8ecefd
parent3403f2d85e7e5dd2413439a9e22ba571f91e1c2f (diff)
DO NOT MERGE - Removed ContentCapture support from standard SDK toolkit.
Test: atest CtsContentCaptureServiceTestCases Test: m update-api Test: make ds-docs Fixes: 129982633 Change-Id: I5a0fa4231d0222638830c1abd8015d9f2635996a
-rw-r--r--api/current.txt32
-rw-r--r--api/system-current.txt2
-rw-r--r--api/test-current.txt2
-rw-r--r--core/java/android/service/contentcapture/ContentCaptureService.java16
-rw-r--r--core/java/android/service/contentcapture/IContentCaptureService.aidl4
-rw-r--r--core/java/android/view/View.java537
-rw-r--r--core/java/android/view/ViewGroup.java60
-rw-r--r--core/java/android/view/ViewRootImpl.java157
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureManager.java13
-rw-r--r--core/java/android/view/contentcapture/ContentCaptureSession.java48
-rw-r--r--core/java/android/view/contentcapture/DataRemovalRequest.aidl (renamed from core/java/android/view/contentcapture/UserDataRemovalRequest.aidl)2
-rw-r--r--core/java/android/view/contentcapture/DataRemovalRequest.java (renamed from core/java/android/view/contentcapture/UserDataRemovalRequest.java)40
-rw-r--r--core/java/android/view/contentcapture/IContentCaptureManager.aidl6
-rw-r--r--core/java/android/webkit/WebView.java8
-rw-r--r--core/java/android/widget/AdapterView.java3
-rw-r--r--core/java/android/widget/TextView.java39
-rw-r--r--core/res/res/values/attrs.xml19
-rw-r--r--core/res/res/values/public.xml2
-rw-r--r--core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java2
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java6
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java6
-rw-r--r--services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java8
22 files changed, 120 insertions, 892 deletions
diff --git a/api/current.txt b/api/current.txt
index 867279a5388b..edc27073c202 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -224,6 +224,7 @@ package android {
field public static final int __removed3 = 16844187; // 0x101059b
field public static final int __removed4 = 16844188; // 0x101059c
field public static final int __removed5 = 16844189; // 0x101059d
+ field public static final int __removed6 = 16844182; // 0x1010596
field public static final int absListViewStyle = 16842858; // 0x101006a
field public static final int accessibilityEventTypes = 16843648; // 0x1010380
field public static final int accessibilityFeedbackType = 16843650; // 0x1010382
@@ -750,7 +751,6 @@ package android {
field public static final int immersive = 16843456; // 0x10102c0
field public static final int importantForAccessibility = 16843690; // 0x10103aa
field public static final int importantForAutofill = 16844120; // 0x1010558
- field public static final int importantForContentCapture = 16844182; // 0x1010596
field public static final int inAnimation = 16843127; // 0x1010177
field public static final int includeFontPadding = 16843103; // 0x101015f
field public static final int includeInGlobalSearch = 16843374; // 0x101026e
@@ -50196,7 +50196,6 @@ package android.view {
method @android.view.ViewDebug.CapturedViewProperty @IdRes public int getId();
method @android.view.ViewDebug.ExportedProperty(category="accessibility", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS, to="noHideDescendants")}) public int getImportantForAccessibility();
method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForAutofill();
- method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForContentCapture();
method public boolean getKeepScreenOn();
method public android.view.KeyEvent.DispatcherState getKeyDispatcherState();
method @android.view.ViewDebug.ExportedProperty(category="accessibility") @IdRes public int getLabelFor();
@@ -50337,7 +50336,6 @@ package android.view {
method @android.view.ViewDebug.ExportedProperty public boolean isHovered();
method public boolean isImportantForAccessibility();
method public final boolean isImportantForAutofill();
- method public final boolean isImportantForContentCapture();
method public boolean isInEditMode();
method public boolean isInLayout();
method @android.view.ViewDebug.ExportedProperty public boolean isInTouchMode();
@@ -50412,7 +50410,6 @@ package android.view {
method @CallSuper public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public void onProvideAutofillStructure(android.view.ViewStructure, int);
method public void onProvideAutofillVirtualStructure(android.view.ViewStructure, int);
- method public void onProvideContentCaptureStructure(@NonNull android.view.ViewStructure, int);
method public void onProvideStructure(android.view.ViewStructure);
method public void onProvideVirtualStructure(android.view.ViewStructure);
method public android.view.PointerIcon onResolvePointerIcon(android.view.MotionEvent, int);
@@ -50538,7 +50535,6 @@ package android.view {
method public void setId(@IdRes int);
method public void setImportantForAccessibility(int);
method public void setImportantForAutofill(int);
- method public void setImportantForContentCapture(int);
method public void setKeepScreenOn(boolean);
method public void setKeyboardNavigationCluster(boolean);
method public void setLabelFor(@IdRes int);
@@ -50717,11 +50713,6 @@ package android.view {
field public static final int IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS = 8; // 0x8
field public static final int IMPORTANT_FOR_AUTOFILL_YES = 1; // 0x1
field public static final int IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS = 4; // 0x4
- field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_AUTO = 0; // 0x0
- field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO = 2; // 0x2
- field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 8; // 0x8
- field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES = 1; // 0x1
- field public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS = 4; // 0x4
field public static final int INVISIBLE = 4; // 0x4
field public static final int KEEP_SCREEN_ON = 67108864; // 0x4000000
field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
@@ -52829,7 +52820,7 @@ package android.view.contentcapture {
method @Nullable public java.util.Set<android.view.contentcapture.ContentCaptureCondition> getContentCaptureConditions();
method @Nullable public android.content.ComponentName getServiceComponentName();
method public boolean isContentCaptureEnabled();
- method public void removeUserData(@NonNull android.view.contentcapture.UserDataRemovalRequest);
+ method public void removeData(@NonNull android.view.contentcapture.DataRemovalRequest);
method public void setContentCaptureEnabled(boolean);
}
@@ -52840,6 +52831,7 @@ package android.view.contentcapture {
method @Nullable public final android.view.contentcapture.ContentCaptureContext getContentCaptureContext();
method @NonNull public final android.view.contentcapture.ContentCaptureSessionId getContentCaptureSessionId();
method @NonNull public android.view.autofill.AutofillId newAutofillId(@NonNull android.view.autofill.AutofillId, long);
+ method @NonNull public final android.view.ViewStructure newViewStructure(@NonNull android.view.View);
method @NonNull public final android.view.ViewStructure newVirtualViewStructure(@NonNull android.view.autofill.AutofillId, long);
method public final void notifyViewAppeared(@NonNull android.view.ViewStructure);
method public final void notifyViewDisappeared(@NonNull android.view.autofill.AutofillId);
@@ -52854,24 +52846,24 @@ package android.view.contentcapture {
field @NonNull public static final android.os.Parcelable.Creator<android.view.contentcapture.ContentCaptureSessionId> CREATOR;
}
- public final class UserDataRemovalRequest implements android.os.Parcelable {
+ public final class DataRemovalRequest implements android.os.Parcelable {
method public int describeContents();
- method @NonNull public java.util.List<android.view.contentcapture.UserDataRemovalRequest.LocusIdRequest> getLocusIdRequests();
+ method @NonNull public java.util.List<android.view.contentcapture.DataRemovalRequest.LocusIdRequest> getLocusIdRequests();
method @NonNull public String getPackageName();
method public boolean isForEverything();
method public void writeToParcel(android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.view.contentcapture.UserDataRemovalRequest> CREATOR;
+ field @NonNull public static final android.os.Parcelable.Creator<android.view.contentcapture.DataRemovalRequest> CREATOR;
field public static final int FLAG_IS_PREFIX = 1; // 0x1
}
- public static final class UserDataRemovalRequest.Builder {
- ctor public UserDataRemovalRequest.Builder();
- method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, int);
- method @NonNull public android.view.contentcapture.UserDataRemovalRequest build();
- method @NonNull public android.view.contentcapture.UserDataRemovalRequest.Builder forEverything();
+ public static final class DataRemovalRequest.Builder {
+ ctor public DataRemovalRequest.Builder();
+ method @NonNull public android.view.contentcapture.DataRemovalRequest.Builder addLocusId(@NonNull android.content.LocusId, int);
+ method @NonNull public android.view.contentcapture.DataRemovalRequest build();
+ method @NonNull public android.view.contentcapture.DataRemovalRequest.Builder forEverything();
}
- public final class UserDataRemovalRequest.LocusIdRequest {
+ public final class DataRemovalRequest.LocusIdRequest {
method @NonNull public int getFlags();
method @NonNull public android.content.LocusId getLocusId();
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 2d8b09293abb..1622c6d59b18 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -6396,9 +6396,9 @@ package android.service.contentcapture {
method public void onConnected();
method public void onContentCaptureEvent(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.view.contentcapture.ContentCaptureEvent);
method public void onCreateContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext, @NonNull android.view.contentcapture.ContentCaptureSessionId);
+ method public void onDataRemovalRequest(@NonNull android.view.contentcapture.DataRemovalRequest);
method public void onDestroyContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSessionId);
method public void onDisconnected();
- method public void onUserDataRemovalRequest(@NonNull android.view.contentcapture.UserDataRemovalRequest);
method public final void setContentCaptureConditions(@NonNull String, @Nullable java.util.Set<android.view.contentcapture.ContentCaptureCondition>);
method public final void setContentCaptureWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>);
field public static final String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService";
diff --git a/api/test-current.txt b/api/test-current.txt
index 6fb4a92d7816..3f73c91c4639 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -2445,9 +2445,9 @@ package android.service.contentcapture {
method public void onConnected();
method public void onContentCaptureEvent(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.view.contentcapture.ContentCaptureEvent);
method public void onCreateContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext, @NonNull android.view.contentcapture.ContentCaptureSessionId);
+ method public void onDataRemovalRequest(@NonNull android.view.contentcapture.DataRemovalRequest);
method public void onDestroyContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSessionId);
method public void onDisconnected();
- method public void onUserDataRemovalRequest(@NonNull android.view.contentcapture.UserDataRemovalRequest);
method public final void setContentCaptureConditions(@NonNull String, @Nullable java.util.Set<android.view.contentcapture.ContentCaptureCondition>);
method public final void setContentCaptureWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>);
field public static final String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService";
diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java
index 5be73b92fbc0..d8614a9d66af 100644
--- a/core/java/android/service/contentcapture/ContentCaptureService.java
+++ b/core/java/android/service/contentcapture/ContentCaptureService.java
@@ -46,9 +46,9 @@ import android.view.contentcapture.ContentCaptureEvent;
import android.view.contentcapture.ContentCaptureManager;
import android.view.contentcapture.ContentCaptureSession;
import android.view.contentcapture.ContentCaptureSessionId;
+import android.view.contentcapture.DataRemovalRequest;
import android.view.contentcapture.IContentCaptureDirectManager;
import android.view.contentcapture.MainContentCaptureSession;
-import android.view.contentcapture.UserDataRemovalRequest;
import com.android.internal.os.IResultReceiver;
@@ -138,7 +138,7 @@ public abstract class ContentCaptureService extends Service {
}
@Override
- public void onUserDataRemovalRequest(UserDataRemovalRequest request) {
+ public void onDataRemovalRequest(DataRemovalRequest request) {
mHandler.sendMessage(
obtainMessage(ContentCaptureService::handleOnUserDataRemovalRequest,
ContentCaptureService.this, request));
@@ -288,12 +288,12 @@ public abstract class ContentCaptureService extends Service {
}
/**
- * Notifies the service that the app requested to remove data associated with the user.
+ * Notifies the service that the app requested to remove content capture data.
*
- * @param request the user data requested to be removed
+ * @param request the content capture data requested to be removed
*/
- public void onUserDataRemovalRequest(@NonNull UserDataRemovalRequest request) {
- if (sVerbose) Log.v(TAG, "onUserDataRemovalRequest()");
+ public void onDataRemovalRequest(@NonNull DataRemovalRequest request) {
+ if (sVerbose) Log.v(TAG, "onDataRemovalRequest()");
}
/**
@@ -449,8 +449,8 @@ public abstract class ContentCaptureService extends Service {
onDestroyContentCaptureSession(new ContentCaptureSessionId(sessionId));
}
- private void handleOnUserDataRemovalRequest(@NonNull UserDataRemovalRequest request) {
- onUserDataRemovalRequest(request);
+ private void handleOnUserDataRemovalRequest(@NonNull DataRemovalRequest request) {
+ onDataRemovalRequest(request);
}
private void handleOnActivityEvent(@NonNull ActivityEvent event) {
diff --git a/core/java/android/service/contentcapture/IContentCaptureService.aidl b/core/java/android/service/contentcapture/IContentCaptureService.aidl
index 03e1b7857837..a7578af94004 100644
--- a/core/java/android/service/contentcapture/IContentCaptureService.aidl
+++ b/core/java/android/service/contentcapture/IContentCaptureService.aidl
@@ -21,7 +21,7 @@ import android.os.IBinder;
import android.service.contentcapture.ActivityEvent;
import android.service.contentcapture.SnapshotData;
import android.view.contentcapture.ContentCaptureContext;
-import android.view.contentcapture.UserDataRemovalRequest;
+import android.view.contentcapture.DataRemovalRequest;
import com.android.internal.os.IResultReceiver;
@@ -39,6 +39,6 @@ oneway interface IContentCaptureService {
in IResultReceiver clientReceiver, int initialState);
void onSessionFinished(int sessionId);
void onActivitySnapshot(int sessionId, in SnapshotData snapshotData);
- void onUserDataRemovalRequest(in UserDataRemovalRequest request);
+ void onDataRemovalRequest(in DataRemovalRequest request);
void onActivityEvent(in ActivityEvent event);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 51bcbbdb7e7d..c3a94655d7d5 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -1377,59 +1377,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x1;
- /** @hide */
- @IntDef(prefix = { "IMPORTANT_FOR_CONTENT_CAPTURE_" }, value = {
- IMPORTANT_FOR_CONTENT_CAPTURE_AUTO,
- IMPORTANT_FOR_CONTENT_CAPTURE_YES,
- IMPORTANT_FOR_CONTENT_CAPTURE_NO,
- IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS,
- IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS
- })
- @Retention(RetentionPolicy.SOURCE)
- public @interface ContentCaptureImportance {}
-
- /**
- * Automatically determine whether a view is important for content capture.
- *
- * @see #isImportantForContentCapture()
- * @see #setImportantForContentCapture(int)
- */
- public static final int IMPORTANT_FOR_CONTENT_CAPTURE_AUTO = 0x0;
-
- /**
- * The view is important for content capture, and its children (if any) will be traversed.
- *
- * @see #isImportantForContentCapture()
- * @see #setImportantForContentCapture(int)
- */
- public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES = 0x1;
-
- /**
- * The view is not important for content capture, but its children (if any) will be traversed.
- *
- * @see #isImportantForContentCapture()
- * @see #setImportantForContentCapture(int)
- */
- public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO = 0x2;
-
- /**
- * The view is important for content capture, but its children (if any) will not be traversed.
- *
- * @see #isImportantForContentCapture()
- * @see #setImportantForContentCapture(int)
- */
- public static final int IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS = 0x4;
-
- /**
- * The view is not important for content capture, and its children (if any) will not be
- * traversed.
- *
- * @see #isImportantForContentCapture()
- * @see #setImportantForContentCapture(int)
- */
- public static final int IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS = 0x8;
-
-
/**
* This view is enabled. Interpretation varies by subclass.
* Use with ENABLED_MASK when calling setFlags.
@@ -3402,55 +3349,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/* End of masks for mPrivateFlags3 */
- /*
- * Masks for mPrivateFlags4, as generated by dumpFlags():
- *
- * |-------|-------|-------|-------|
- * 1111 PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK
- * 1 PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED
- * 1 PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED
- * 1 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED
- * 1 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE
- * 11 PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK
- * |-------|-------|-------|-------|
- */
-
- /**
- * Mask for obtaining the bits which specify how to determine
- * whether a view is important for autofill.
- *
- * <p>NOTE: the important for content capture values were the first flags added and are set in
- * the rightmost position, so we don't need to shift them
- */
- private static final int PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK =
- IMPORTANT_FOR_CONTENT_CAPTURE_AUTO | IMPORTANT_FOR_CONTENT_CAPTURE_YES
- | IMPORTANT_FOR_CONTENT_CAPTURE_NO
- | IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS
- | IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS;
-
- /*
- * Variables used to control when the IntelligenceManager.notifyNodeAdded()/removed() methods
- * should be called.
- *
- * The idea is to call notifyAppeared() after the view is layout and visible, then call
- * notifyDisappeared() when it's gone (without known when it was removed from the parent).
- */
- private static final int PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED = 0x10;
- private static final int PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED = 0x20;
-
- /*
- * Flags used to cache the value returned by isImportantForContentCapture while the view
- * hierarchy is being traversed.
- */
- private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED = 0x40;
- private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE = 0x80;
-
- private static final int PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK =
- PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED
- | PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE;
-
- /* End of masks for mPrivateFlags4 */
-
/** @hide */
protected static final int VIEW_STRUCTURE_FOR_ASSIST = 0;
/** @hide */
@@ -4074,8 +3972,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 129147060)
int mPrivateFlags3;
- private int mPrivateFlags4;
-
/**
* This view's request for the visibility of the status bar.
* @hide
@@ -5808,11 +5704,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
setImportantForAutofill(a.getInt(attr, IMPORTANT_FOR_AUTOFILL_AUTO));
}
break;
- case R.styleable.View_importantForContentCapture:
- if (a.peekValue(attr) != null) {
- setImportantForContentCapture(a.getInt(attr,
- IMPORTANT_FOR_CONTENT_CAPTURE_AUTO));
- }
case R.styleable.View_defaultFocusHighlightEnabled:
if (a.peekValue(attr) != null) {
setDefaultFocusHighlightEnabled(a.getBoolean(attr, true));
@@ -8532,62 +8423,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
onProvideStructure(structure, VIEW_STRUCTURE_FOR_AUTOFILL, flags);
}
- /**
- * Populates a {@link ViewStructure} for content capture.
- *
- * <p>This method is called after a view is that is eligible for content capture
- * (for example, if it {@link #isImportantForAutofill()}, an intelligence service is enabled for
- * the user, and the activity rendering the view is enabled for content capture) is laid out and
- * is visible.
- *
- * <p>The populated structure is then passed to the service through
- * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)}.
- *
- * <p><b>Note: </b>views that manage a virtual structure under this view must populate just
- * the node representing this view and return right away, then asynchronously report (not
- * necessarily in the UI thread) when the children nodes appear, disappear or have their text
- * changed by calling
- * {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)},
- * {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and
- * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence)}
- * respectively. The structure for the a child must be created using
- * {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, long)}, and the
- * {@code autofillId} for a child can be obtained either through
- * {@code childStructure.getAutofillId()} or
- * {@link ContentCaptureSession#newAutofillId(AutofillId, long)}.
- *
- * <p>When the virtual view hierarchy represents a web page, you should also:
- *
- * <ul>
- * <li>Call {@link ContentCaptureManager#getContentCaptureConditions()} to infer content
- * capture events should be generate for that URL.
- * <li>Create a new {@link ContentCaptureSession} child for every HTML element that
- * renders a new URL (like an {@code IFRAME}) and use that session to notify events from
- * that subtree.
- * </ul>
- *
- * <p><b>Note: </b>the following methods of the {@code structure} will be ignored:
- * <ul>
- * <li>{@link ViewStructure#setChildCount(int)}
- * <li>{@link ViewStructure#addChildCount(int)}
- * <li>{@link ViewStructure#getChildCount()}
- * <li>{@link ViewStructure#newChild(int)}
- * <li>{@link ViewStructure#asyncNewChild(int)}
- * <li>{@link ViewStructure#asyncCommit()}
- * <li>{@link ViewStructure#setWebDomain(String)}
- * <li>{@link ViewStructure#newHtmlInfoBuilder(String)}
- * <li>{@link ViewStructure#setHtmlInfo(android.view.ViewStructure.HtmlInfo)}
- * <li>{@link ViewStructure#setDataIsSensitive(boolean)}
- * <li>{@link ViewStructure#setAlpha(float)}
- * <li>{@link ViewStructure#setElevation(float)}
- * <li>{@link ViewStructure#setTransformation(Matrix)}
- *
- * </ul>
- */
- public void onProvideContentCaptureStructure(@NonNull ViewStructure structure, int flags) {
- onProvideStructure(structure, VIEW_STRUCTURE_FOR_CONTENT_CAPTURE, flags);
- }
-
/** @hide */
protected void onProvideStructure(@NonNull ViewStructure structure,
@ViewStructureType int viewFor, int flags) {
@@ -9225,265 +9060,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * Gets the mode for determining whether this view is important for content capture.
- *
- * <p>See {@link #setImportantForContentCapture(int)} and
- * {@link #isImportantForContentCapture()} for more info about this mode.
- *
- * @return {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO} by default, or value passed to
- * {@link #setImportantForContentCapture(int)}.
- *
- * @attr ref android.R.styleable#View_importantForContentCapture
- */
- @ViewDebug.ExportedProperty(mapping = {
- @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to = "auto"),
- @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_YES, to = "yes"),
- @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_NO, to = "no"),
- @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS,
- to = "yesExcludeDescendants"),
- @ViewDebug.IntToString(from = IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS,
- to = "noExcludeDescendants")})
- @InspectableProperty(enumMapping = {
- @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, name = "auto"),
- @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_YES, name = "yes"),
- @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_NO, name = "no"),
- @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS,
- name = "yesExcludeDescendants"),
- @EnumEntry(value = IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS,
- name = "noExcludeDescendants"),
- })
- public @ContentCaptureImportance int getImportantForContentCapture() {
- // NOTE: the important for content capture values were the first flags added and are set in
- // the rightmost position, so we don't need to shift them
- return mPrivateFlags4 & PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK;
- }
-
- /**
- * Sets the mode for determining whether this view is considered important for content capture.
- *
- * <p>The platform determines the importance for autofill automatically but you
- * can use this method to customize the behavior. Typically, a view that provides text should
- * be marked as {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES}.
- *
- * @param mode {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO},
- * {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES}, {@link #IMPORTANT_FOR_CONTENT_CAPTURE_NO},
- * {@link #IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS},
- * or {@link #IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS}.
- *
- * @attr ref android.R.styleable#View_importantForContentCapture
- */
- public void setImportantForContentCapture(@ContentCaptureImportance int mode) {
- // Reset first
- mPrivateFlags4 &= ~PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK;
- // Then set again
- // NOTE: the important for content capture values were the first flags added and are set in
- // the rightmost position, so we don't need to shift them
- mPrivateFlags4 |= (mode & PFLAG4_IMPORTANT_FOR_CONTENT_CAPTURE_MASK);
- }
-
- /**
- * Hints the Android System whether this view is considered important for content capture, based
- * on the value explicitly set by {@link #setImportantForContentCapture(int)} and heuristics
- * when it's {@link #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO}.
- *
- * <p>See {@link ContentCaptureManager} for more info about content capture.
- *
- * @return whether the view is considered important for content capture.
- *
- * @see #setImportantForContentCapture(int)
- * @see #IMPORTANT_FOR_CONTENT_CAPTURE_AUTO
- * @see #IMPORTANT_FOR_CONTENT_CAPTURE_YES
- * @see #IMPORTANT_FOR_CONTENT_CAPTURE_NO
- * @see #IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS
- * @see #IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS
- */
- public final boolean isImportantForContentCapture() {
- boolean isImportant;
- if ((mPrivateFlags4 & PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED) != 0) {
- isImportant = (mPrivateFlags4 & PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE) != 0;
- return isImportant;
- }
-
- isImportant = calculateIsImportantForContentCapture();
-
- mPrivateFlags4 &= ~PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE;
- if (isImportant) {
- mPrivateFlags4 |= PFLAG4_CONTENT_CAPTURE_IMPORTANCE_CACHED_VALUE;
- }
- mPrivateFlags4 |= PFLAG4_CONTENT_CAPTURE_IMPORTANCE_IS_CACHED;
- return isImportant;
- }
-
- /**
- * Calculates whether the flag is important for content capture so it can be used by
- * {@link #isImportantForContentCapture()} while the tree is traversed.
- */
- private boolean calculateIsImportantForContentCapture() {
- // Check parent mode to ensure we're important
- ViewParent parent = mParent;
- while (parent instanceof View) {
- final int parentImportance = ((View) parent).getImportantForContentCapture();
- if (parentImportance == IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS
- || parentImportance == IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS) {
- if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) {
- Log.v(CONTENT_CAPTURE_LOG_TAG, "View (" + this + ") is not important for "
- + "content capture because parent " + parent + "'s importance is "
- + parentImportance);
- }
- return false;
- }
- parent = parent.getParent();
- }
-
- final int importance = getImportantForContentCapture();
-
- // First, check the explicit states.
- if (importance == IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS
- || importance == IMPORTANT_FOR_CONTENT_CAPTURE_YES) {
- return true;
- }
- if (importance == IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS
- || importance == IMPORTANT_FOR_CONTENT_CAPTURE_NO) {
- if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.VERBOSE)) {
- Log.v(CONTENT_CAPTURE_LOG_TAG, "View (" + this + ") is not important for content "
- + "capture because its importance is " + importance);
- }
- return false;
- }
-
- // Then use some heuristics to handle AUTO.
- if (importance != IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) {
- Log.w(CONTENT_CAPTURE_LOG_TAG, "invalid content capture importance (" + importance
- + " on view " + this);
- return false;
- }
-
- // View group is important if at least one children also is
- if (this instanceof ViewGroup) {
- final ViewGroup group = (ViewGroup) this;
- for (int i = 0; i < group.getChildCount(); i++) {
- final View child = group.getChildAt(i);
- if (child.isImportantForContentCapture()) {
- return true;
- }
- }
- }
-
- // If the app developer explicitly set hints or autofill hintsfor it, it's important.
- if (getAutofillHints() != null) {
- return true;
- }
-
- // Otherwise, assume it's not important...
- return false;
- }
-
- /**
- * Helper used to notify the {@link ContentCaptureManager} when the view is removed or
- * added, based on whether it's laid out and visible, and without knowing if the parent removed
- * it from the view hierarchy.
- *
- * <p>This method is called from many places (visibility changed, view laid out, view attached
- * or detached to/from window, etc...) and hence must contain the logic to call the manager, as
- * described below:
- *
- * <ol>
- * <li>It should only be called when content capture is enabled for the view.
- * <li>It must call viewAppeared() before viewDisappeared()
- * <li>viewAppearead() can only be called when the view is visible and laidout
- * <li>It should not call the same event twice.
- * </ol>
- */
- private void notifyAppearedOrDisappearedForContentCaptureIfNeeded(boolean appeared) {
- AttachInfo ai = mAttachInfo;
- // Skip it while the view is being laided out for the first time
- if (ai != null && !ai.mReadyForContentCaptureUpdates) return;
-
- if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
- Trace.traceBegin(Trace.TRACE_TAG_VIEW,
- "notifyContentCapture(" + appeared + ") for " + getClass().getSimpleName());
- }
- try {
- notifyAppearedOrDisappearedForContentCaptureIfNeededNoTrace(appeared);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIEW);
- }
- }
-
- private void notifyAppearedOrDisappearedForContentCaptureIfNeededNoTrace(boolean appeared) {
- AttachInfo ai = mAttachInfo;
-
- // First check if context has client, so it saves a service lookup when it doesn't
- if (mContext.getContentCaptureOptions() == null) return;
-
- // Then check if it's enabled in the context...
- final ContentCaptureManager ccm = ai != null ? ai.getContentCaptureManager(mContext)
- : mContext.getSystemService(ContentCaptureManager.class);
- if (ccm == null || !ccm.isContentCaptureEnabled()) return;
-
- // ... and finally at the view level
- // NOTE: isImportantForContentCapture() is more expensive than cm.isContentCaptureEnabled()
- if (!isImportantForContentCapture()) return;
-
- ContentCaptureSession session = getContentCaptureSession();
- if (session == null) return;
-
- if (appeared) {
- if (!isLaidOut() || getVisibility() != VISIBLE
- || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0) {
- if (DEBUG_CONTENT_CAPTURE) {
- Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'appeared' on " + this + ": laid="
- + isLaidOut() + ", visibleToUser=" + isVisibleToUser()
- + ", visible=" + (getVisibility() == VISIBLE)
- + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4
- & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0)
- + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4
- & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0));
- }
- return;
- }
- setNotifiedContentCaptureAppeared();
-
- if (ai != null) {
- ai.delayNotifyContentCaptureEvent(session, this, appeared);
- } else {
- if (DEBUG_CONTENT_CAPTURE) {
- Log.w(CONTENT_CAPTURE_LOG_TAG, "no AttachInfo on appeared for " + this);
- }
- }
- } else {
- if ((mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) == 0
- || (mPrivateFlags4 & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0) {
- if (DEBUG_CONTENT_CAPTURE) {
- Log.v(CONTENT_CAPTURE_LOG_TAG, "Ignoring 'disappeared' on " + this + ": laid="
- + isLaidOut() + ", visibleToUser=" + isVisibleToUser()
- + ", visible=" + (getVisibility() == VISIBLE)
- + ": alreadyNotifiedAppeared=" + ((mPrivateFlags4
- & PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED) != 0)
- + ", alreadyNotifiedDisappeared=" + ((mPrivateFlags4
- & PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED) != 0));
- }
- return;
- }
- mPrivateFlags4 |= PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED;
- mPrivateFlags4 &= ~PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED;
-
- if (ai != null) {
- ai.delayNotifyContentCaptureEvent(session, this, appeared);
- } else {
- if (DEBUG_CONTENT_CAPTURE) {
- Log.v(CONTENT_CAPTURE_LOG_TAG, "no AttachInfo on disappeared for " + this);
- }
- }
- }
- }
-
- private void setNotifiedContentCaptureAppeared() {
- mPrivateFlags4 |= PFLAG4_NOTIFIED_CONTENT_CAPTURE_APPEARED;
- mPrivateFlags4 &= ~PFLAG4_NOTIFIED_CONTENT_CAPTURE_DISAPPEARED;
- }
-
- /**
* Sets the (optional) {@link ContentCaptureSession} associated with this view.
*
* <p>This method should be called when you need to associate a {@link ContentCaptureContext} to
@@ -9739,68 +9315,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
- * Dispatches the initial content capture events for a view structure.
- *
- * @hide
- */
- public void dispatchInitialProvideContentCaptureStructure() {
- AttachInfo ai = mAttachInfo;
- if (ai == null) {
- Log.w(CONTENT_CAPTURE_LOG_TAG,
- "dispatchProvideContentCaptureStructure(): no AttachInfo for " + this);
- return;
- }
- ContentCaptureManager ccm = ai.mContentCaptureManager;
- if (ccm == null) {
- Log.w(CONTENT_CAPTURE_LOG_TAG, "dispatchProvideContentCaptureStructure(): "
- + "no ContentCaptureManager for " + this);
- return;
- }
-
- // We must set it before checkign if the view itself is important, because it might
- // initially not be (for example, if it's empty), although that might change later (for
- // example, if important views are added)
- ai.mReadyForContentCaptureUpdates = true;
-
- if (!isImportantForContentCapture()) {
- if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.DEBUG)) {
- Log.d(CONTENT_CAPTURE_LOG_TAG,
- "dispatchProvideContentCaptureStructure(): decorView is not important");
- }
- return;
- }
-
- ai.mContentCaptureManager = ccm;
-
- ContentCaptureSession session = getContentCaptureSession();
- if (session == null) {
- if (Log.isLoggable(CONTENT_CAPTURE_LOG_TAG, Log.DEBUG)) {
- Log.d(CONTENT_CAPTURE_LOG_TAG,
- "dispatchProvideContentCaptureStructure(): no session for " + this);
- }
- return;
- }
-
- session.internalNotifyViewTreeEvent(/* started= */ true);
- try {
- dispatchProvideContentCaptureStructure();
- } finally {
- session.internalNotifyViewTreeEvent(/* started= */ false);
- }
- }
-
- /** @hide */
- void dispatchProvideContentCaptureStructure() {
- ContentCaptureSession session = getContentCaptureSession();
- if (session != null) {
- ViewStructure structure = session.newViewStructure(this);
- onProvideContentCaptureStructure(structure, /* flags= */ 0);
- setNotifiedContentCaptureAppeared();
- session.notifyViewAppeared(structure);
- }
- }
-
- /**
* @see #onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
*
* Note: Called from the default {@link AccessibilityDelegate}.
@@ -13753,7 +13267,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public void dispatchStartTemporaryDetach() {
mPrivateFlags3 |= PFLAG3_TEMPORARY_DETACH;
notifyEnterOrExitForAutoFillIfNeeded(false);
- notifyAppearedOrDisappearedForContentCaptureIfNeeded(false);
onStartTemporaryDetach();
}
@@ -13780,7 +13293,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
notifyFocusChangeToInputMethodManager(true /* hasFocus */);
}
notifyEnterOrExitForAutoFillIfNeeded(true);
- notifyAppearedOrDisappearedForContentCaptureIfNeeded(true);
}
/**
@@ -14372,8 +13884,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
: AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED);
}
}
-
- notifyAppearedOrDisappearedForContentCaptureIfNeeded(isVisible);
}
/**
@@ -18069,7 +17579,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
// Reset content capture caches
- mPrivateFlags4 &= ~PFLAG4_CONTENT_CAPTURE_IMPORTANCE_MASK;
mCachedContentCaptureSession = null;
if ((mPrivateFlags & (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)) == (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)
@@ -20079,7 +19588,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
needGlobalAttributesUpdate(false);
notifyEnterOrExitForAutoFillIfNeeded(true);
- notifyAppearedOrDisappearedForContentCaptureIfNeeded(true);
}
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P)
@@ -20129,7 +19637,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
notifyEnterOrExitForAutoFillIfNeeded(false);
- notifyAppearedOrDisappearedForContentCaptureIfNeeded(false);
}
/**
@@ -22442,8 +21949,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mPrivateFlags3 &= ~PFLAG3_NOTIFY_AUTOFILL_ENTER_ON_LAYOUT;
notifyEnterOrExitForAutoFillIfNeeded(true);
}
-
- notifyAppearedOrDisappearedForContentCaptureIfNeeded(true);
}
private boolean hasParentWantsFocus() {
@@ -28650,23 +28155,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
View mTooltipHost;
/**
- * The initial structure has been reported so the view is ready to report updates.
- */
- boolean mReadyForContentCaptureUpdates;
-
- /**
- * Map(keyed by session) of content capture events that need to be notified after the view
- * hierarchy is traversed: value is either the view itself for appearead events, or its
- * autofill id for disappeared.
- */
- SparseArray<ArrayList<Object>> mContentCaptureEvents;
-
- /**
- * Cached reference to the {@link ContentCaptureManager}.
- */
- ContentCaptureManager mContentCaptureManager;
-
- /**
* Creates a new set of attachment information with the specified
* events handler and thread.
*
@@ -28684,31 +28172,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mRootCallbacks = effectPlayer;
mTreeObserver = new ViewTreeObserver(context);
}
-
- private void delayNotifyContentCaptureEvent(@NonNull ContentCaptureSession session,
- @NonNull View view, boolean appeared) {
- if (mContentCaptureEvents == null) {
- // Most of the time there will be just one session, so intial capacity is 1
- mContentCaptureEvents = new SparseArray<>(1);
- }
- int sessionId = session.getId();
- // TODO: life would be much easier if we provided a MultiMap implementation somwhere...
- ArrayList<Object> events = mContentCaptureEvents.get(sessionId);
- if (events == null) {
- events = new ArrayList<>();
- mContentCaptureEvents.put(sessionId, events);
- }
- events.add(appeared ? view : view.getAutofillId());
- }
-
- @Nullable
- ContentCaptureManager getContentCaptureManager(@NonNull Context context) {
- if (mContentCaptureManager != null) {
- return mContentCaptureManager;
- }
- mContentCaptureManager = context.getSystemService(ContentCaptureManager.class);
- return mContentCaptureManager;
- }
}
/**
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 937bd1b34e61..d362024ed525 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3606,7 +3606,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
return;
}
- final ChildListForAutoFillOrContentCapture children = getChildrenForAutofill(flags);
+ final ChildListForAutofill children = getChildrenForAutofill(flags);
final int childrenCount = children.size();
structure.setChildCount(childrenCount);
for (int i = 0; i < childrenCount; i++) {
@@ -3617,30 +3617,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
children.recycle();
}
- /** @hide */
- @Override
- public void dispatchProvideContentCaptureStructure() {
- super.dispatchProvideContentCaptureStructure();
-
- if (!isLaidOut()) return;
-
- final ChildListForAutoFillOrContentCapture children = getChildrenForContentCapture();
- final int childrenCount = children.size();
- for (int i = 0; i < childrenCount; i++) {
- final View child = children.get(i);
- child.dispatchProvideContentCaptureStructure();
- }
- children.recycle();
- }
-
/**
* Gets the children for autofill. Children for autofill are the first
* level descendants that are important for autofill. The returned
* child list object is pooled and the caller must recycle it once done.
* @hide */
- private @NonNull ChildListForAutoFillOrContentCapture getChildrenForAutofill(
+ private @NonNull ChildListForAutofill getChildrenForAutofill(
@AutofillFlags int flags) {
- final ChildListForAutoFillOrContentCapture children = ChildListForAutoFillOrContentCapture
+ final ChildListForAutofill children = ChildListForAutofill
.obtain();
populateChildrenForAutofill(children, flags);
return children;
@@ -3668,34 +3652,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
}
- private @NonNull ChildListForAutoFillOrContentCapture getChildrenForContentCapture() {
- final ChildListForAutoFillOrContentCapture children = ChildListForAutoFillOrContentCapture
- .obtain();
- populateChildrenForContentCapture(children);
- return children;
- }
-
- /** @hide */
- private void populateChildrenForContentCapture(ArrayList<View> list) {
- final int childrenCount = mChildrenCount;
- if (childrenCount <= 0) {
- return;
- }
- final ArrayList<View> preorderedList = buildOrderedChildList();
- final boolean customOrder = preorderedList == null
- && isChildrenDrawingOrderEnabled();
- for (int i = 0; i < childrenCount; i++) {
- final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder);
- final View child = (preorderedList == null)
- ? mChildren[childIndex] : preorderedList.get(childIndex);
- if (child.isImportantForContentCapture()) {
- list.add(child);
- } else if (child instanceof ViewGroup) {
- ((ViewGroup) child).populateChildrenForContentCapture(list);
- }
- }
- }
-
private static View getAndVerifyPreorderedView(ArrayList<View> preorderedList, View[] children,
int childIndex) {
final View child;
@@ -8678,16 +8634,16 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
/**
* Pooled class that to hold the children for autifill.
*/
- private static class ChildListForAutoFillOrContentCapture extends ArrayList<View> {
+ private static class ChildListForAutofill extends ArrayList<View> {
private static final int MAX_POOL_SIZE = 32;
- private static final Pools.SimplePool<ChildListForAutoFillOrContentCapture> sPool =
+ private static final Pools.SimplePool<ChildListForAutofill> sPool =
new Pools.SimplePool<>(MAX_POOL_SIZE);
- public static ChildListForAutoFillOrContentCapture obtain() {
- ChildListForAutoFillOrContentCapture list = sPool.acquire();
+ public static ChildListForAutofill obtain() {
+ ChildListForAutofill list = sPool.acquire();
if (list == null) {
- list = new ChildListForAutoFillOrContentCapture();
+ list = new ChildListForAutofill();
}
return list;
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index f3b7ad5e557c..5ca70ba9a575 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -105,11 +105,7 @@ import android.view.accessibility.IAccessibilityInteractionConnection;
import android.view.accessibility.IAccessibilityInteractionConnectionCallback;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Interpolator;
-import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
-import android.view.contentcapture.ContentCaptureManager;
-import android.view.contentcapture.ContentCaptureSession;
-import android.view.contentcapture.MainContentCaptureSession;
import android.view.inputmethod.InputMethodManager;
import android.widget.Scroller;
@@ -224,21 +220,6 @@ public final class ViewRootImpl implements ViewParent,
*/
static final int MAX_TRACKBALL_DELAY = 250;
- /**
- * Initial value for {@link #mContentCaptureEnabled}.
- */
- private static final int CONTENT_CAPTURE_ENABLED_NOT_CHECKED = 0;
-
- /**
- * Value for {@link #mContentCaptureEnabled} when it was checked and set to {@code true}.
- */
- private static final int CONTENT_CAPTURE_ENABLED_TRUE = 1;
-
- /**
- * Value for {@link #mContentCaptureEnabled} when it was checked and set to {@code false}.
- */
- private static final int CONTENT_CAPTURE_ENABLED_FALSE = 2;
-
@UnsupportedAppUsage
static final ThreadLocal<HandlerActionQueue> sRunQueues = new ThreadLocal<HandlerActionQueue>();
@@ -435,10 +416,6 @@ public final class ViewRootImpl implements ViewParent,
boolean mLayoutRequested;
boolean mFirst;
- @Nullable
- int mContentCaptureEnabled = CONTENT_CAPTURE_ENABLED_NOT_CHECKED;
- boolean mPerformContentCapture;
-
boolean mReportNextDraw;
boolean mFullRedrawNeeded;
boolean mNewSurfaceNeeded;
@@ -637,7 +614,6 @@ public final class ViewRootImpl implements ViewParent,
mTransparentRegion = new Region();
mPreviousTransparentRegion = new Region();
mFirst = true; // true for the first time the view is added
- mPerformContentCapture = true; // also true for the first time the view is added
mAdded = false;
mAttachInfo = new View.AttachInfo(mWindowSession, mWindow, display, this, mHandler, this,
context);
@@ -2787,55 +2763,9 @@ public final class ViewRootImpl implements ViewParent,
}
}
- if (mAttachInfo.mContentCaptureEvents != null) {
- notifyContentCatpureEvents();
- }
-
mIsInTraversal = false;
}
- private void notifyContentCatpureEvents() {
- Trace.traceBegin(Trace.TRACE_TAG_VIEW, "notifyContentCaptureEvents");
- try {
- MainContentCaptureSession mainSession = mAttachInfo.mContentCaptureManager
- .getMainContentCaptureSession();
- for (int i = 0; i < mAttachInfo.mContentCaptureEvents.size(); i++) {
- int sessionId = mAttachInfo.mContentCaptureEvents.keyAt(i);
- mainSession.notifyViewTreeEvent(sessionId, /* started= */ true);
- ArrayList<Object> events = mAttachInfo.mContentCaptureEvents
- .valueAt(i);
- for_each_event: for (int j = 0; j < events.size(); j++) {
- Object event = events.get(j);
- if (event instanceof AutofillId) {
- mainSession.notifyViewDisappeared(sessionId, (AutofillId) event);
- } else if (event instanceof View) {
- View view = (View) event;
- ContentCaptureSession session = view.getContentCaptureSession();
- if (session == null) {
- Log.w(mTag, "no content capture session on view: " + view);
- continue for_each_event;
- }
- int actualId = session.getId();
- if (actualId != sessionId) {
- Log.w(mTag, "content capture session mismatch for view (" + view
- + "): was " + sessionId + " before, it's " + actualId + " now");
- continue for_each_event;
- }
- ViewStructure structure = session.newViewStructure(view);
- view.onProvideContentCaptureStructure(structure, /* flags= */ 0);
- session.notifyViewAppeared(structure);
- } else {
- Log.w(mTag, "invalid content capture event: " + event);
- }
- }
- mainSession.notifyViewTreeEvent(sessionId, /* started= */ false);
- }
- mAttachInfo.mContentCaptureEvents = null;
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIEW);
- }
- }
-
private void notifySurfaceDestroyed() {
mSurfaceHolder.ungetCallbacks();
SurfaceHolder.Callback[] callbacks = mSurfaceHolder.getCallbacks();
@@ -2966,13 +2896,6 @@ public final class ViewRootImpl implements ViewParent,
}
}
mFirstInputStage.onWindowFocusChanged(hasWindowFocus);
-
- // NOTE: there's no view visibility (appeared / disapparead) events when the windows focus
- // is lost, so we don't need to to force a flush - there might be other events such as
- // text changes, but these should be flushed independently.
- if (hasWindowFocus) {
- handleContentCaptureFlush();
- }
}
private void fireAccessibilityFocusEventIfHasFocusedNode() {
@@ -3539,86 +3462,6 @@ public final class ViewRootImpl implements ViewParent,
pendingDrawFinished();
}
}
- if (mPerformContentCapture) {
- performContentCaptureInitialReport();
- }
- }
-
- /**
- * Checks (and caches) if content capture is enabled for this context.
- */
- private boolean isContentCaptureEnabled() {
- switch (mContentCaptureEnabled) {
- case CONTENT_CAPTURE_ENABLED_TRUE:
- return true;
- case CONTENT_CAPTURE_ENABLED_FALSE:
- return false;
- case CONTENT_CAPTURE_ENABLED_NOT_CHECKED:
- final boolean reallyEnabled = isContentCaptureReallyEnabled();
- mContentCaptureEnabled = reallyEnabled ? CONTENT_CAPTURE_ENABLED_TRUE
- : CONTENT_CAPTURE_ENABLED_FALSE;
- return reallyEnabled;
- default:
- Log.w(TAG, "isContentCaptureEnabled(): invalid state " + mContentCaptureEnabled);
- return false;
- }
-
- }
-
- /**
- * Checks (without caching) if content capture is enabled for this context.
- */
- private boolean isContentCaptureReallyEnabled() {
- // First check if context supports it, so it saves a service lookup when it doesn't
- if (mContext.getContentCaptureOptions() == null) return false;
-
- final ContentCaptureManager ccm = mAttachInfo.getContentCaptureManager(mContext);
- // Then check if it's enabled in the contex itself.
- if (ccm == null || !ccm.isContentCaptureEnabled()) return false;
-
- return true;
- }
-
- private void performContentCaptureInitialReport() {
- mPerformContentCapture = false; // One-time offer!
- final View rootView = mView;
- if (DEBUG_CONTENT_CAPTURE) {
- Log.v(mTag, "performContentCaptureInitialReport() on " + rootView);
- }
- if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
- Trace.traceBegin(Trace.TRACE_TAG_VIEW, "dispatchContentCapture() for "
- + getClass().getSimpleName());
- }
- try {
- if (!isContentCaptureEnabled()) return;
-
- // Content capture is a go!
- rootView.dispatchInitialProvideContentCaptureStructure();
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIEW);
- }
- }
-
- private void handleContentCaptureFlush() {
- if (DEBUG_CONTENT_CAPTURE) {
- Log.v(mTag, "handleContentCaptureFlush()");
- }
- if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
- Trace.traceBegin(Trace.TRACE_TAG_VIEW, "flushContentCapture for "
- + getClass().getSimpleName());
- }
- try {
- if (!isContentCaptureEnabled()) return;
-
- final ContentCaptureManager ccm = mAttachInfo.mContentCaptureManager;
- if (ccm == null) {
- Log.w(TAG, "No ContentCapture on AttachInfo");
- return;
- }
- ccm.flush(ContentCaptureSession.FLUSH_REASON_VIEW_ROOT_ENTERED);
- } finally {
- Trace.traceEnd(Trace.TRACE_TAG_VIEW);
- }
}
private boolean draw(boolean fullRedrawNeeded) {
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index 253935680cb8..7a6e2adfcaa4 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -191,8 +191,8 @@ import java.util.Set;
*
* <p>If your view provides its own virtual hierarchy (for example, if it's a browser that draws
* the HTML using {@link Canvas} or native libraries in a different render process), then the view
- * is also responsible to notify the session when the virtual elements appear and disappear - see
- * {@link View#onProvideContentCaptureStructure(ViewStructure, int)} for more info.
+ * is also responsible to notify the session when the virtual elements appear and disappear -
+ * see {@link ContentCaptureSession#newViewStructure(View)} for more info.
*/
@SystemService(Context.CONTENT_CAPTURE_MANAGER_SERVICE)
public final class ContentCaptureManager {
@@ -578,16 +578,15 @@ public final class ContentCaptureManager {
}
/**
- * Called by the app to request the content capture service to remove user-data associated with
- * some context.
+ * Called by the app to remove content capture data associated with some context.
*
- * @param request object specifying what user data should be removed.
+ * @param request object specifying what data should be removed.
*/
- public void removeUserData(@NonNull UserDataRemovalRequest request) {
+ public void removeData(@NonNull DataRemovalRequest request) {
Preconditions.checkNotNull(request);
try {
- mService.removeUserData(request);
+ mService.removeData(request);
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java
index 7761038f8af1..17a1fb405321 100644
--- a/core/java/android/view/contentcapture/ContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ContentCaptureSession.java
@@ -356,10 +356,6 @@ public abstract class ContentCaptureSession implements AutoCloseable {
/**
* Notifies the Content Capture Service that a node has been added to the view structure.
*
- * <p>Typically called "manually" by views that handle their own virtual view hierarchy, or
- * automatically by the Android System for views that return {@code true} on
- * {@link View#onProvideContentCaptureStructure(ViewStructure, int)}.
- *
* @param node node that has been added.
*/
public final void notifyViewAppeared(@NonNull ViewStructure node) {
@@ -378,9 +374,6 @@ public abstract class ContentCaptureSession implements AutoCloseable {
/**
* Notifies the Content Capture Service that a node has been removed from the view structure.
*
- * <p>Typically called "manually" by views that handle their own virtual view hierarchy, or
- * automatically by the Android System for standard views.
- *
* @param id id of the node that has been removed.
*/
public final void notifyViewDisappeared(@NonNull AutofillId id) {
@@ -441,7 +434,46 @@ public abstract class ContentCaptureSession implements AutoCloseable {
/**
* Creates a {@link ViewStructure} for a "standard" view.
*
- * @hide
+ * <p>This method should be called after a visible view is laid out; the view then must populate
+ * the structure and pass it to {@link #notifyViewAppeared(ViewStructure)}.
+ *
+ * <b>Note: </b>views that manage a virtual structure under this view must populate just the
+ * node representing this view and return right away, then asynchronously report (not
+ * necessarily in the UI thread) when the children nodes appear, disappear or have their text
+ * changed by calling {@link ContentCaptureSession#notifyViewAppeared(ViewStructure)},
+ * {@link ContentCaptureSession#notifyViewDisappeared(AutofillId)}, and
+ * {@link ContentCaptureSession#notifyViewTextChanged(AutofillId, CharSequence)} respectively.
+ * The structure for the a child must be created using
+ * {@link ContentCaptureSession#newVirtualViewStructure(AutofillId, long)}, and the
+ * {@code autofillId} for a child can be obtained either through
+ * {@code childStructure.getAutofillId()} or
+ * {@link ContentCaptureSession#newAutofillId(AutofillId, long)}.
+ *
+ * <p>When the virtual view hierarchy represents a web page, you should also:
+ *
+ * <ul>
+ * <li>Call {@link ContentCaptureManager#getContentCaptureConditions()} to infer content capture
+ * events should be generate for that URL.
+ * <li>Create a new {@link ContentCaptureSession} child for every HTML element that renders a
+ * new URL (like an {@code IFRAME}) and use that session to notify events from that subtree.
+ * </ul>
+ *
+ * <p><b>Note: </b>the following methods of the {@code structure} will be ignored:
+ * <ul>
+ * <li>{@link ViewStructure#setChildCount(int)}
+ * <li>{@link ViewStructure#addChildCount(int)}
+ * <li>{@link ViewStructure#getChildCount()}
+ * <li>{@link ViewStructure#newChild(int)}
+ * <li>{@link ViewStructure#asyncNewChild(int)}
+ * <li>{@link ViewStructure#asyncCommit()}
+ * <li>{@link ViewStructure#setWebDomain(String)}
+ * <li>{@link ViewStructure#newHtmlInfoBuilder(String)}
+ * <li>{@link ViewStructure#setHtmlInfo(android.view.ViewStructure.HtmlInfo)}
+ * <li>{@link ViewStructure#setDataIsSensitive(boolean)}
+ * <li>{@link ViewStructure#setAlpha(float)}
+ * <li>{@link ViewStructure#setElevation(float)}
+ * <li>{@link ViewStructure#setTransformation(android.graphics.Matrix)}
+ * </ul>
*/
@NonNull
public final ViewStructure newViewStructure(@NonNull View view) {
diff --git a/core/java/android/view/contentcapture/UserDataRemovalRequest.aidl b/core/java/android/view/contentcapture/DataRemovalRequest.aidl
index fbe47e08ea7c..c89d222d159f 100644
--- a/core/java/android/view/contentcapture/UserDataRemovalRequest.aidl
+++ b/core/java/android/view/contentcapture/DataRemovalRequest.aidl
@@ -16,4 +16,4 @@
package android.view.contentcapture;
-parcelable UserDataRemovalRequest;
+parcelable DataRemovalRequest;
diff --git a/core/java/android/view/contentcapture/UserDataRemovalRequest.java b/core/java/android/view/contentcapture/DataRemovalRequest.java
index 3e1e4abaa84c..3792846bea71 100644
--- a/core/java/android/view/contentcapture/UserDataRemovalRequest.java
+++ b/core/java/android/view/contentcapture/DataRemovalRequest.java
@@ -31,14 +31,12 @@ import java.util.ArrayList;
import java.util.List;
/**
- * Class used by apps to request the Content Capture service to remove user-data associated with
- * some context.
+ * Class used by apps to remove content capture data associated with {@link LocusId LocusIds}.
*/
-public final class UserDataRemovalRequest implements Parcelable {
+public final class DataRemovalRequest implements Parcelable {
/**
- * When set, service should use the {@link LocusId#getId()} as prefix for the data to be
- * removed.
+ * When set, the {@link LocusId#getId()} is the prefix for the data to be removed.
*/
public static final int FLAG_IS_PREFIX = 0x1;
@@ -54,7 +52,7 @@ public final class UserDataRemovalRequest implements Parcelable {
private final boolean mForEverything;
private ArrayList<LocusIdRequest> mLocusIdRequests;
- private UserDataRemovalRequest(@NonNull Builder builder) {
+ private DataRemovalRequest(@NonNull Builder builder) {
mPackageName = ActivityThread.currentActivityThread().getApplication().getPackageName();
mForEverything = builder.mForEverything;
if (builder.mLocusIds != null) {
@@ -67,7 +65,7 @@ public final class UserDataRemovalRequest implements Parcelable {
}
}
- private UserDataRemovalRequest(@NonNull Parcel parcel) {
+ private DataRemovalRequest(@NonNull Parcel parcel) {
mPackageName = parcel.readString();
mForEverything = parcel.readBoolean();
if (!mForEverything) {
@@ -89,7 +87,7 @@ public final class UserDataRemovalRequest implements Parcelable {
}
/**
- * Checks if app is requesting to remove all user data associated with its package.
+ * Checks if app is requesting to remove content capture data associated with its package.
*/
public boolean isForEverything() {
return mForEverything;
@@ -104,7 +102,7 @@ public final class UserDataRemovalRequest implements Parcelable {
}
/**
- * Builder for {@link UserDataRemovalRequest} objects.
+ * Builder for {@link DataRemovalRequest} objects.
*/
public static final class Builder {
@@ -115,7 +113,7 @@ public final class UserDataRemovalRequest implements Parcelable {
private boolean mDestroyed;
/**
- * Requests servive to remove all user data associated with the app's package.
+ * Requests to remove all content capture data associated with the app's package.
*
* @return this builder
*/
@@ -132,7 +130,7 @@ public final class UserDataRemovalRequest implements Parcelable {
* Request service to remove data associated with a given {@link LocusId}.
*
* @param locusId the {@link LocusId} being requested to be removed.
- * @param flags either {@link UserDataRemovalRequest#FLAG_IS_PREFIX} or {@code 0}
+ * @param flags either {@link DataRemovalRequest#FLAG_IS_PREFIX} or {@code 0}
*
* @return this builder
*/
@@ -154,17 +152,17 @@ public final class UserDataRemovalRequest implements Parcelable {
}
/**
- * Builds the {@link UserDataRemovalRequest}.
+ * Builds the {@link DataRemovalRequest}.
*/
@NonNull
- public UserDataRemovalRequest build() {
+ public DataRemovalRequest build() {
throwIfDestroyed();
Preconditions.checkState(mForEverything || mLocusIds != null,
"must call either #forEverything() or add one #addLocusId()");
mDestroyed = true;
- return new UserDataRemovalRequest(this);
+ return new DataRemovalRequest(this);
}
private void throwIfDestroyed() {
@@ -192,19 +190,19 @@ public final class UserDataRemovalRequest implements Parcelable {
}
}
- public static final @android.annotation.NonNull Parcelable.Creator<UserDataRemovalRequest> CREATOR =
- new Parcelable.Creator<UserDataRemovalRequest>() {
+ public static final @android.annotation.NonNull Parcelable.Creator<DataRemovalRequest> CREATOR =
+ new Parcelable.Creator<DataRemovalRequest>() {
@Override
@NonNull
- public UserDataRemovalRequest createFromParcel(Parcel parcel) {
- return new UserDataRemovalRequest(parcel);
+ public DataRemovalRequest createFromParcel(Parcel parcel) {
+ return new DataRemovalRequest(parcel);
}
@Override
@NonNull
- public UserDataRemovalRequest[] newArray(int size) {
- return new UserDataRemovalRequest[size];
+ public DataRemovalRequest[] newArray(int size) {
+ return new DataRemovalRequest[size];
}
};
@@ -231,7 +229,7 @@ public final class UserDataRemovalRequest implements Parcelable {
/**
* Gets the flags associates with request.
*
- * @return either {@link UserDataRemovalRequest#FLAG_IS_PREFIX} or {@code 0}.
+ * @return either {@link DataRemovalRequest#FLAG_IS_PREFIX} or {@code 0}.
*/
@NonNull
public @Flags int getFlags() {
diff --git a/core/java/android/view/contentcapture/IContentCaptureManager.aidl b/core/java/android/view/contentcapture/IContentCaptureManager.aidl
index 7335073c59e0..ced941744387 100644
--- a/core/java/android/view/contentcapture/IContentCaptureManager.aidl
+++ b/core/java/android/view/contentcapture/IContentCaptureManager.aidl
@@ -19,7 +19,7 @@ package android.view.contentcapture;
import android.content.ComponentName;
import android.view.contentcapture.ContentCaptureContext;
import android.view.contentcapture.ContentCaptureEvent;
-import android.view.contentcapture.UserDataRemovalRequest;
+import android.view.contentcapture.DataRemovalRequest;
import android.os.IBinder;
import com.android.internal.os.IResultReceiver;
@@ -59,9 +59,9 @@ oneway interface IContentCaptureManager {
void getServiceComponentName(in IResultReceiver result);
/**
- * Requests the removal of user data for the calling user.
+ * Requests the removal of content capture data for the calling user.
*/
- void removeUserData(in UserDataRemovalRequest request);
+ void removeData(in DataRemovalRequest request);
/**
* Returns whether the content capture feature is enabled for the calling user.
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 26dba45666fc..137b67c6e63e 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -413,9 +413,6 @@ public class WebView extends AbsoluteLayout
if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) {
setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES);
}
- if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) {
- setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES);
- }
if (context == null) {
throw new IllegalArgumentException("Invalid context argument");
@@ -2799,11 +2796,6 @@ public class WebView extends AbsoluteLayout
}
@Override
- public void onProvideContentCaptureStructure(ViewStructure structure, int flags) {
- mProvider.getViewDelegate().onProvideContentCaptureStructure(structure, flags);
- }
-
- @Override
public void autofill(SparseArray<AutofillValue>values) {
mProvider.getViewDelegate().autofill(values);
}
diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java
index c55f7d654548..c3bb9a0201d0 100644
--- a/core/java/android/widget/AdapterView.java
+++ b/core/java/android/widget/AdapterView.java
@@ -1318,8 +1318,7 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
@ViewStructureType int viewFor, int flags) {
super.onProvideStructure(structure, viewFor, flags);
- if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL
- || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
+ if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) {
final Adapter adapter = getAdapter();
if (adapter == null) return;
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index a961783dab7c..618b05f8cb00 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -161,8 +161,6 @@ import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.AnimationUtils;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
-import android.view.contentcapture.ContentCaptureManager;
-import android.view.contentcapture.ContentCaptureSession;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.CorrectionInfo;
@@ -978,9 +976,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
if (getImportantForAutofill() == IMPORTANT_FOR_AUTOFILL_AUTO) {
setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_YES);
}
- if (getImportantForContentCapture() == IMPORTANT_FOR_CONTENT_CAPTURE_AUTO) {
- setImportantForContentCapture(IMPORTANT_FOR_CONTENT_CAPTURE_YES);
- }
setTextInternal("");
@@ -10520,8 +10515,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
- * Notify managers (such as {@link AutofillManager} and {@link ContentCaptureManager}) that are
- * interested on text changes.
+ * Notify managers (such as {@link AutofillManager}) that are interested in text changes.
*/
private void notifyListeningManagersAfterTextChanged() {
@@ -10537,22 +10531,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
afm.notifyValueChanged(TextView.this);
}
}
-
- // TODO(b/121045053): should use a flag / boolean to keep status of SHOWN / HIDDEN instead
- // of using isLaidout(), so it's not called in cases where it's laid out but a
- // notifyAppeared was not sent.
-
- // ContentCapture
- if (isLaidOut() && isImportantForContentCapture() && isTextEditable()) {
- final ContentCaptureManager cm = mContext.getSystemService(ContentCaptureManager.class);
- if (cm != null && cm.isContentCaptureEnabled()) {
- final ContentCaptureSession session = getContentCaptureSession();
- if (session != null) {
- // TODO(b/111276913): pass flags when edited by user / add CTS test
- session.notifyViewTextChanged(getAutofillId(), getText());
- }
- }
- }
}
private boolean isAutofillable() {
@@ -11386,8 +11364,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
final boolean isPassword = hasPasswordTransformationMethod()
|| isPasswordInputType(getInputType());
- if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL
- || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
+ if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) {
if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) {
structure.setDataIsSensitive(!mTextSetFromXmlOrResourceId);
}
@@ -11403,12 +11380,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
- if (!isPassword || viewFor == VIEW_STRUCTURE_FOR_AUTOFILL
- || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
+ if (!isPassword || viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) {
if (mLayout == null) {
- if (viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
- Log.w(LOG_TAG, "onProvideContentCaptureStructure(): calling assumeLayout()");
- }
assumeLayout();
}
Layout layout = mLayout;
@@ -11496,8 +11469,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
}
- if (viewFor == VIEW_STRUCTURE_FOR_ASSIST
- || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
+ if (viewFor == VIEW_STRUCTURE_FOR_ASSIST) {
// Extract style information that applies to the TextView as a whole.
int style = 0;
int typefaceStyle = getTypefaceStyle();
@@ -11525,8 +11497,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
structure.setTextStyle(getTextSize(), getCurrentTextColor(),
AssistStructure.ViewNode.TEXT_COLOR_UNDEFINED /* bgColor */, style);
}
- if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL
- || viewFor == VIEW_STRUCTURE_FOR_CONTENT_CAPTURE) {
+ if (viewFor == VIEW_STRUCTURE_FOR_AUTOFILL) {
structure.setMinTextEms(getMinEms());
structure.setMaxTextEms(getMaxEms());
int maxLength = -1;
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index ed8f2c196b72..ab9a298f3060 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2485,24 +2485,7 @@
<flag name="noExcludeDescendants" value="0x8" />
</attr>
- <!-- Hints the Android System whether the view node associated with this View should be
- use for content capture purposes. -->
- <attr name="importantForContentCapture">
- <!-- Let the Android System use its heuristics to determine if the view is important for content capture. -->
- <flag name="auto" value="0" />
- <!-- Hint the Android System that this view is important for content capture,
- and its children (if any) will be traversed.. -->
- <flag name="yes" value="0x1" />
- <!-- Hint the Android System that this view is *not* important for content capture,
- but its children (if any) will be traversed.. -->
- <flag name="no" value="0x2" />
- <!-- Hint the Android System that this view is important for content capture,
- but its children (if any) will not be traversed. -->
- <flag name="yesExcludeDescendants" value="0x4" />
- <!-- Hint the Android System that this view is *not* important for content capture,
- and its children (if any) will not be traversed. -->
- <flag name="noExcludeDescendants" value="0x8" />
- </attr>
+ <attr name="__removed6" />
<!-- Boolean that controls whether a view can take focus while in touch mode.
If this is true for a view, that view can gain focus when clicked on, and can keep
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 9a8c754cf197..b7d61c8f8d39 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2922,7 +2922,7 @@
<public name="settingsSliceUri" />
<public name="shell" />
<public name="interactiveUiTimeout" />
- <public name="importantForContentCapture" />
+ <public name="__removed6" />
<public name="supportsMultipleDisplays" />
<public name="useAppZygote" />
<public name="__removed1" />
diff --git a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java
index cd885e0b9bcf..7c255c9168cc 100644
--- a/core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java
+++ b/core/tests/coretests/src/android/view/contentcapture/ContentCaptureManagerTest.java
@@ -47,6 +47,6 @@ public class ContentCaptureManagerTest {
@Test
public void testRemoveUserData_invalid() {
- assertThrows(NullPointerException.class, () -> mManager.removeUserData(null));
+ assertThrows(NullPointerException.class, () -> mManager.removeData(null));
}
}
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
index 757c2dc7f6f1..7f411d83b34b 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerService.java
@@ -60,8 +60,8 @@ import android.util.SparseBooleanArray;
import android.view.contentcapture.ContentCaptureCondition;
import android.view.contentcapture.ContentCaptureHelper;
import android.view.contentcapture.ContentCaptureManager;
+import android.view.contentcapture.DataRemovalRequest;
import android.view.contentcapture.IContentCaptureManager;
-import android.view.contentcapture.UserDataRemovalRequest;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.infra.AbstractRemoteService;
@@ -583,14 +583,14 @@ public final class ContentCaptureManagerService extends
}
@Override
- public void removeUserData(@NonNull UserDataRemovalRequest request) {
+ public void removeData(@NonNull DataRemovalRequest request) {
Preconditions.checkNotNull(request);
assertCalledByPackageOwner(request.getPackageName());
final int userId = UserHandle.getCallingUserId();
synchronized (mLock) {
final ContentCapturePerUserService service = getServiceForUserLocked(userId);
- service.removeUserDataLocked(request);
+ service.removeDataLocked(request);
}
}
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
index 564952697250..b4a1f381f7ff 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCapturePerUserService.java
@@ -57,7 +57,7 @@ import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import android.view.contentcapture.ContentCaptureCondition;
-import android.view.contentcapture.UserDataRemovalRequest;
+import android.view.contentcapture.DataRemovalRequest;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.infra.WhitelistHelper;
@@ -343,12 +343,12 @@ final class ContentCapturePerUserService
}
@GuardedBy("mLock")
- public void removeUserDataLocked(@NonNull UserDataRemovalRequest request) {
+ public void removeDataLocked(@NonNull DataRemovalRequest request) {
if (!isEnabledLocked()) {
return;
}
assertCallerLocked(request.getPackageName());
- mRemoteService.onUserDataRemovalRequest(request);
+ mRemoteService.onDataRemovalRequest(request);
}
@GuardedBy("mLock")
diff --git a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
index 3fa3fdf6d36e..2171033c5a28 100644
--- a/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
+++ b/services/contentcapture/java/com/android/server/contentcapture/RemoteContentCaptureService.java
@@ -29,7 +29,7 @@ import android.service.contentcapture.IContentCaptureServiceCallback;
import android.service.contentcapture.SnapshotData;
import android.util.Slog;
import android.view.contentcapture.ContentCaptureContext;
-import android.view.contentcapture.UserDataRemovalRequest;
+import android.view.contentcapture.DataRemovalRequest;
import com.android.internal.infra.AbstractMultiplePendingRequestsRemoteService;
import com.android.internal.os.IResultReceiver;
@@ -120,10 +120,10 @@ final class RemoteContentCaptureService
}
/**
- * Called by {@link ContentCaptureServerSession} to request removal of user data.
+ * Called by {@link ContentCaptureServerSession} to request removal of content capture data.
*/
- public void onUserDataRemovalRequest(@NonNull UserDataRemovalRequest request) {
- scheduleAsyncRequest((s) -> s.onUserDataRemovalRequest(request));
+ public void onDataRemovalRequest(@NonNull DataRemovalRequest request) {
+ scheduleAsyncRequest((s) -> s.onDataRemovalRequest(request));
}
/**