diff options
| author | Mihir Patel <mkpatel@google.com> | 2020-03-04 07:54:37 -0800 |
|---|---|---|
| committer | Mihir Patel <mkpatel@google.com> | 2020-03-13 20:04:25 +0000 |
| commit | b73c42175361955765a193ca3d9b355c2816513b (patch) | |
| tree | 7a8fb895a74237e2998b5f06681224570015127e /core/java/android | |
| parent | dfde8e6aa98e75a31425a35845dcf3027e9b383e (diff) | |
Notifying the on-device intelligence service when view window insets have changed
bug:137800469
Test: manual
Change-Id: Ia69e273a6646fc15e289f75084a81193e71e1eef
Diffstat (limited to 'core/java/android')
6 files changed, 103 insertions, 11 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index e665f065d952..708a09467247 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -29099,8 +29099,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mTreeObserver = new ViewTreeObserver(context); } + @Nullable + ContentCaptureManager getContentCaptureManager(@NonNull Context context) { + if (mContentCaptureManager != null) { + return mContentCaptureManager; + } + mContentCaptureManager = context.getSystemService(ContentCaptureManager.class); + return mContentCaptureManager; + } + + void delayNotifyContentCaptureInsetsEvent(@NonNull Insets insets) { + if (mContentCaptureManager == null) { + return; + } + + ArrayList<Object> events = ensureEvents( + mContentCaptureManager.getMainContentCaptureSession()); + events.add(insets); + } + private void delayNotifyContentCaptureEvent(@NonNull ContentCaptureSession session, @NonNull View view, boolean appeared) { + ArrayList<Object> events = ensureEvents(session); + events.add(appeared ? view : view.getAutofillId()); + } + + @NonNull + private ArrayList<Object> ensureEvents(@NonNull ContentCaptureSession session) { if (mContentCaptureEvents == null) { // Most of the time there will be just one session, so intial capacity is 1 mContentCaptureEvents = new SparseArray<>(1); @@ -29112,16 +29137,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, 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; + return events; } } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 26ac4fc4ddc2..dd34bcb018b9 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -81,6 +81,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.FrameInfo; import android.graphics.HardwareRenderer.FrameDrawingCallback; +import android.graphics.Insets; import android.graphics.Matrix; import android.graphics.PixelFormat; import android.graphics.Point; @@ -2254,6 +2255,7 @@ public final class ViewRootImpl implements ViewParent, insets = insets.consumeDisplayCutout(); } host.dispatchApplyWindowInsets(insets); + mAttachInfo.delayNotifyContentCaptureInsetsEvent(insets.getInsets(Type.all())); Trace.traceEnd(Trace.TRACE_TAG_VIEW); } @@ -3118,6 +3120,8 @@ public final class ViewRootImpl implements ViewParent, ViewStructure structure = session.newViewStructure(view); view.onProvideContentCaptureStructure(structure, /* flags= */ 0); session.notifyViewAppeared(structure); + } else if (event instanceof Insets) { + mainSession.notifyViewInsetsChanged(sessionId, (Insets) event); } else { Log.w(mTag, "invalid content capture event: " + event); } diff --git a/core/java/android/view/contentcapture/ChildContentCaptureSession.java b/core/java/android/view/contentcapture/ChildContentCaptureSession.java index 7487ec4d921c..44b4353871a2 100644 --- a/core/java/android/view/contentcapture/ChildContentCaptureSession.java +++ b/core/java/android/view/contentcapture/ChildContentCaptureSession.java @@ -17,6 +17,7 @@ package android.view.contentcapture; import android.annotation.NonNull; import android.annotation.Nullable; +import android.graphics.Insets; import android.view.autofill.AutofillId; import android.view.contentcapture.ViewNode.ViewStructureImpl; @@ -84,6 +85,11 @@ final class ChildContentCaptureSession extends ContentCaptureSession { } @Override + void internalNotifyViewInsetsChanged(@NonNull Insets viewInsets) { + getMainCaptureSession().notifyViewInsetsChanged(mId, viewInsets); + } + + @Override public void internalNotifyViewTreeEvent(boolean started) { getMainCaptureSession().notifyViewTreeEvent(mId, started); } diff --git a/core/java/android/view/contentcapture/ContentCaptureEvent.java b/core/java/android/view/contentcapture/ContentCaptureEvent.java index c29d251e6535..ea34d948c91a 100644 --- a/core/java/android/view/contentcapture/ContentCaptureEvent.java +++ b/core/java/android/view/contentcapture/ContentCaptureEvent.java @@ -23,6 +23,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; +import android.graphics.Insets; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; @@ -112,6 +113,11 @@ public final class ContentCaptureEvent implements Parcelable { */ public static final int TYPE_SESSION_PAUSED = 8; + /** + * Called when the view's insets are changed. The new insets associated with the + * event may then be retrieved by calling {@link #getInsets()} + */ + public static final int TYPE_VIEW_INSETS_CHANGED = 9; /** @hide */ @IntDef(prefix = { "TYPE_" }, value = { @@ -122,7 +128,8 @@ public final class ContentCaptureEvent implements Parcelable { TYPE_VIEW_TREE_APPEARED, TYPE_CONTEXT_UPDATED, TYPE_SESSION_PAUSED, - TYPE_SESSION_RESUMED + TYPE_SESSION_RESUMED, + TYPE_VIEW_INSETS_CHANGED }) @Retention(RetentionPolicy.SOURCE) public @interface EventType{} @@ -136,6 +143,7 @@ public final class ContentCaptureEvent implements Parcelable { private @Nullable CharSequence mText; private int mParentSessionId = NO_SESSION_ID; private @Nullable ContentCaptureContext mClientContext; + private @Nullable Insets mInsets; /** @hide */ public ContentCaptureEvent(int sessionId, int type, long eventTime) { @@ -242,6 +250,13 @@ public final class ContentCaptureEvent implements Parcelable { return this; } + /** @hide */ + @NonNull + public ContentCaptureEvent setInsets(@NonNull Insets insets) { + mInsets = insets; + return this; + } + /** * Gets the type of the event. * @@ -305,6 +320,16 @@ public final class ContentCaptureEvent implements Parcelable { } /** + * Gets the rectangle of the insets associated with the event. Valid insets will only be + * returned if the type of the event is {@link #TYPE_VIEW_INSETS_CHANGED}, otherwise they + * will be null. + */ + @Nullable + public Insets getInsets() { + return mInsets; + } + + /** * Merges event of the same type, either {@link #TYPE_VIEW_TEXT_CHANGED} * or {@link #TYPE_VIEW_DISAPPEARED}. * @@ -369,7 +394,9 @@ public final class ContentCaptureEvent implements Parcelable { } if (mClientContext != null) { pw.print(", context="); mClientContext.dump(pw); pw.println(); - + } + if (mInsets != null) { + pw.print(", insets="); pw.println(mInsets); } } @@ -401,6 +428,9 @@ public final class ContentCaptureEvent implements Parcelable { if (mClientContext != null) { string.append(", context=").append(mClientContext); } + if (mInsets != null) { + string.append(", insets=").append(mInsets); + } return string.append(']').toString(); } @@ -424,6 +454,9 @@ public final class ContentCaptureEvent implements Parcelable { if (mType == TYPE_SESSION_STARTED || mType == TYPE_CONTEXT_UPDATED) { parcel.writeParcelable(mClientContext, flags); } + if (mType == TYPE_VIEW_INSETS_CHANGED) { + parcel.writeParcelable(mInsets, flags); + } } public static final @android.annotation.NonNull Parcelable.Creator<ContentCaptureEvent> CREATOR = @@ -455,6 +488,9 @@ public final class ContentCaptureEvent implements Parcelable { if (type == TYPE_SESSION_STARTED || type == TYPE_CONTEXT_UPDATED) { event.setClientContext(parcel.readParcelable(null)); } + if (type == TYPE_VIEW_INSETS_CHANGED) { + event.setInsets(parcel.readParcelable(null)); + } return event; } @@ -488,6 +524,8 @@ public final class ContentCaptureEvent implements Parcelable { return "VIEW_TREE_APPEARED"; case TYPE_CONTEXT_UPDATED: return "CONTEXT_UPDATED"; + case TYPE_VIEW_INSETS_CHANGED: + return "VIEW_INSETS_CHANGED"; default: return "UKNOWN_TYPE: " + type; } diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java index 2134dab7986b..012f5e6d3507 100644 --- a/core/java/android/view/contentcapture/ContentCaptureSession.java +++ b/core/java/android/view/contentcapture/ContentCaptureSession.java @@ -23,6 +23,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.graphics.Insets; import android.util.DebugUtils; import android.util.Log; import android.view.View; @@ -440,6 +441,19 @@ public abstract class ContentCaptureSession implements AutoCloseable { abstract void internalNotifyViewTextChanged(@NonNull AutofillId id, @Nullable CharSequence text); + /** + * Notifies the Intelligence Service that the insets of a view have changed. + */ + public final void notifyViewInsetsChanged(@NonNull Insets viewInsets) { + Preconditions.checkNotNull(viewInsets); + + if (!isContentCaptureEnabled()) return; + + internalNotifyViewInsetsChanged(viewInsets); + } + + abstract void internalNotifyViewInsetsChanged(@NonNull Insets viewInsets); + /** @hide */ public abstract void internalNotifyViewTreeEvent(boolean started); diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java index 96f224fef251..893d38dcfde7 100644 --- a/core/java/android/view/contentcapture/MainContentCaptureSession.java +++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java @@ -22,6 +22,7 @@ import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_RESUM import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_STARTED; import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_APPEARED; import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_DISAPPEARED; +import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_INSETS_CHANGED; import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_TEXT_CHANGED; import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_TREE_APPEARED; import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_TREE_APPEARING; @@ -36,6 +37,7 @@ import android.annotation.UiThread; import android.content.ComponentName; import android.content.Context; import android.content.pm.ParceledListSlice; +import android.graphics.Insets; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -578,6 +580,11 @@ public final class MainContentCaptureSession extends ContentCaptureSession { } @Override + void internalNotifyViewInsetsChanged(@NonNull Insets viewInsets) { + notifyViewInsetsChanged(mId, viewInsets); + } + + @Override public void internalNotifyViewTreeEvent(boolean started) { notifyViewTreeEvent(mId, started); } @@ -642,6 +649,12 @@ public final class MainContentCaptureSession extends ContentCaptureSession { } /** Public because is also used by ViewRootImpl */ + public void notifyViewInsetsChanged(int sessionId, @NonNull Insets viewInsets) { + sendEvent(new ContentCaptureEvent(sessionId, TYPE_VIEW_INSETS_CHANGED) + .setInsets(viewInsets)); + } + + /** Public because is also used by ViewRootImpl */ public void notifyViewTreeEvent(int sessionId, boolean started) { final int type = started ? TYPE_VIEW_TREE_APPEARING : TYPE_VIEW_TREE_APPEARED; sendEvent(new ContentCaptureEvent(sessionId, type), FORCE_FLUSH); |
