Added ContentCaptureEvents for session resumed and paused.
Test: atest CtsContentCaptureServiceTestCases # which was updated to listen to the new events
Test: m update-api
Fixes: 125395044
Change-Id: Ie1ed5d9badaa64ff0921226a1c08bd5e3cbf07d8
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 77aaee4..3d9aab2 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -9732,11 +9732,11 @@
return;
}
- session.internalNotifyViewHierarchyEvent(/* started= */ true);
+ session.internalNotifyViewTreeEvent(/* started= */ true);
try {
dispatchProvideContentCaptureStructure();
} finally {
- session.internalNotifyViewHierarchyEvent(/* started= */ false);
+ session.internalNotifyViewTreeEvent(/* started= */ false);
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 33795e5..e41b1b3 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2808,14 +2808,10 @@
try {
MainContentCaptureSession mainSession = mAttachInfo.mContentCaptureManager
.getMainContentCaptureSession();
- if (mainSession == null) {
- Log.w(mTag, "no MainContentCaptureSession on AttachInfo");
- return;
- }
for (int i = 0; i < mAttachInfo.mContentCaptureEvents.size(); i++) {
String sessionId = mAttachInfo.mContentCaptureEvents
.keyAt(i);
- mainSession.notifyViewHierarchyEvent(sessionId, /* started = */ true);
+ mainSession.notifyViewTreeEvent(sessionId, /* started= */ true);
ArrayList<Object> events = mAttachInfo.mContentCaptureEvents
.valueAt(i);
for_each_event: for (int j = 0; j < events.size(); j++) {
@@ -2842,7 +2838,7 @@
Log.w(mTag, "invalid content capture event: " + event);
}
}
- mainSession.notifyViewHierarchyEvent(sessionId, /* started = */ false);
+ mainSession.notifyViewTreeEvent(sessionId, /* started= */ false);
}
mAttachInfo.mContentCaptureEvents = null;
} finally {
@@ -2980,12 +2976,12 @@
}
}
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) {
- performContentCaptureFlushIfNecessary(
- ContentCaptureSession.FLUSH_REASON_VIEW_ROOT_ENTERED);
+ handleContentCaptureFlush();
}
}
@@ -3613,11 +3609,9 @@
}
}
- private void performContentCaptureFlushIfNecessary(
- @ContentCaptureSession.FlushReason int flushReason) {
+ private void handleContentCaptureFlush() {
if (DEBUG_CONTENT_CAPTURE) {
- Log.v(mTag, "performContentCaptureFlushIfNecessary("
- + ContentCaptureSession.getFlushReasonAsString(flushReason) + ")");
+ Log.v(mTag, "handleContentCaptureFlush()");
}
if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) {
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "flushContentCapture for "
@@ -3628,16 +3622,15 @@
final ContentCaptureManager ccm = mAttachInfo.mContentCaptureManager;
if (ccm == null) {
- Log.w(TAG, "flush content capture: no ContentCapture on AttachInfo");
+ Log.w(TAG, "No ContentCapture on AttachInfo");
return;
}
- ccm.flush(flushReason);
+ ccm.flush(ContentCaptureSession.FLUSH_REASON_VIEW_ROOT_ENTERED);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
}
}
-
private boolean draw(boolean fullRedrawNeeded) {
Surface surface = mSurface;
if (!surface.isValid()) {
diff --git a/core/java/android/view/contentcapture/ChildContentCaptureSession.java b/core/java/android/view/contentcapture/ChildContentCaptureSession.java
index 03eef5e..b3b0b72 100644
--- a/core/java/android/view/contentcapture/ChildContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ChildContentCaptureSession.java
@@ -84,8 +84,8 @@
}
@Override
- public void internalNotifyViewHierarchyEvent(boolean started) {
- getMainCaptureSession().notifyViewHierarchyEvent(mId, started);
+ public void internalNotifyViewTreeEvent(boolean started) {
+ getMainCaptureSession().notifyViewTreeEvent(mId, started);
}
@Override
diff --git a/core/java/android/view/contentcapture/ContentCaptureEvent.java b/core/java/android/view/contentcapture/ContentCaptureEvent.java
index 1dd1bee..2585b74 100644
--- a/core/java/android/view/contentcapture/ContentCaptureEvent.java
+++ b/core/java/android/view/contentcapture/ContentCaptureEvent.java
@@ -79,8 +79,7 @@
* if the initial view hierarchy doesn't initially have any view that's important for content
* capture.
*/
- // TODO(b/125395044): change to TYPE_VIEW_TREE_APPEARING
- public static final int TYPE_INITIAL_VIEW_TREE_APPEARING = 4;
+ public static final int TYPE_VIEW_TREE_APPEARING = 4;
/**
* Called after events (such as {@link #TYPE_VIEW_APPEARED} and/or
@@ -90,8 +89,7 @@
* if the initial view hierarchy doesn't initially have any view that's important for content
* capture.
*/
- // TODO(b/125395044): change to TYPE_VIEW_TREE_APPEARED
- public static final int TYPE_INITIAL_VIEW_TREE_APPEARED = 5;
+ public static final int TYPE_VIEW_TREE_APPEARED = 5;
/**
* Called after a call to
@@ -101,14 +99,29 @@
*/
public static final int TYPE_CONTEXT_UPDATED = 6;
+ /**
+ * Called after the session is ready, typically after the activity resumed and the
+ * initial views appeared
+ */
+ public static final int TYPE_SESSION_RESUMED = 7;
+
+ /**
+ * Called after the session is paused, typically after the activity paused and the
+ * views disappeared.
+ */
+ public static final int TYPE_SESSION_PAUSED = 8;
+
+
/** @hide */
@IntDef(prefix = { "TYPE_" }, value = {
TYPE_VIEW_APPEARED,
TYPE_VIEW_DISAPPEARED,
TYPE_VIEW_TEXT_CHANGED,
- TYPE_INITIAL_VIEW_TREE_APPEARING,
- TYPE_INITIAL_VIEW_TREE_APPEARED,
- TYPE_CONTEXT_UPDATED
+ TYPE_VIEW_TREE_APPEARING,
+ TYPE_VIEW_TREE_APPEARED,
+ TYPE_CONTEXT_UPDATED,
+ TYPE_SESSION_PAUSED,
+ TYPE_SESSION_RESUMED
})
@Retention(RetentionPolicy.SOURCE)
public @interface EventType{}
@@ -232,8 +245,9 @@
* Gets the type of the event.
*
* @return one of {@link #TYPE_VIEW_APPEARED}, {@link #TYPE_VIEW_DISAPPEARED},
- * {@link #TYPE_VIEW_TEXT_CHANGED}, {@link #TYPE_INITIAL_VIEW_TREE_APPEARING},
- * {@link #TYPE_INITIAL_VIEW_TREE_APPEARED}, or {@link #TYPE_CONTEXT_UPDATED}.
+ * {@link #TYPE_VIEW_TEXT_CHANGED}, {@link #TYPE_VIEW_TREE_APPEARING},
+ * {@link #TYPE_VIEW_TREE_APPEARED}, {@link #TYPE_CONTEXT_UPDATED},
+ * {@link #TYPE_SESSION_RESUMED}, or {@link #TYPE_SESSION_PAUSED}.
*/
public @EventType int getType() {
return mType;
@@ -413,15 +427,19 @@
return "SESSION_STARTED";
case TYPE_SESSION_FINISHED:
return "SESSION_FINISHED";
+ case TYPE_SESSION_RESUMED:
+ return "SESSION_RESUMED";
+ case TYPE_SESSION_PAUSED:
+ return "SESSION_PAUSED";
case TYPE_VIEW_APPEARED:
return "VIEW_APPEARED";
case TYPE_VIEW_DISAPPEARED:
return "VIEW_DISAPPEARED";
case TYPE_VIEW_TEXT_CHANGED:
return "VIEW_TEXT_CHANGED";
- case TYPE_INITIAL_VIEW_TREE_APPEARING:
+ case TYPE_VIEW_TREE_APPEARING:
return "VIEW_TREE_APPEARING";
- case TYPE_INITIAL_VIEW_TREE_APPEARED:
+ case TYPE_VIEW_TREE_APPEARED:
return "VIEW_TREE_APPEARED";
case TYPE_CONTEXT_UPDATED:
return "CONTEXT_UPDATED";
diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java
index 336d997..1fab0de 100644
--- a/core/java/android/view/contentcapture/ContentCaptureManager.java
+++ b/core/java/android/view/contentcapture/ContentCaptureManager.java
@@ -224,7 +224,7 @@
/** @hide */
@UiThread
- public void onActivityStarted(@NonNull IBinder applicationToken,
+ public void onActivityCreated(@NonNull IBinder applicationToken,
@NonNull ComponentName activityComponent, int flags) {
synchronized (mLock) {
mFlags |= flags;
@@ -234,7 +234,19 @@
/** @hide */
@UiThread
- public void onActivityStopped() {
+ public void onActivityResumed() {
+ getMainContentCaptureSession().notifySessionLifecycle(/* started= */ true);
+ }
+
+ /** @hide */
+ @UiThread
+ public void onActivityPaused() {
+ getMainContentCaptureSession().notifySessionLifecycle(/* started= */ false);
+ }
+
+ /** @hide */
+ @UiThread
+ public void onActivityDestroyed() {
getMainContentCaptureSession().destroy();
}
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java
index 544a4f6..ab8f346 100644
--- a/core/java/android/view/contentcapture/ContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/ContentCaptureSession.java
@@ -134,19 +134,19 @@
/** @hide */
public static final int FLUSH_REASON_VIEW_ROOT_ENTERED = 2;
/** @hide */
- public static final int FLUSH_REASON_SESSION_STARTED = 4;
+ public static final int FLUSH_REASON_SESSION_STARTED = 3;
/** @hide */
- public static final int FLUSH_REASON_SESSION_FINISHED = 5;
+ public static final int FLUSH_REASON_SESSION_FINISHED = 4;
/** @hide */
- public static final int FLUSH_REASON_IDLE_TIMEOUT = 6;
+ public static final int FLUSH_REASON_IDLE_TIMEOUT = 5;
/** @hide */
@IntDef(prefix = { "FLUSH_REASON_" }, value = {
FLUSH_REASON_FULL,
+ FLUSH_REASON_VIEW_ROOT_ENTERED,
FLUSH_REASON_SESSION_STARTED,
FLUSH_REASON_SESSION_FINISHED,
- FLUSH_REASON_IDLE_TIMEOUT,
- FLUSH_REASON_VIEW_ROOT_ENTERED,
+ FLUSH_REASON_IDLE_TIMEOUT
})
@Retention(RetentionPolicy.SOURCE)
public @interface FlushReason{}
@@ -411,7 +411,7 @@
@Nullable CharSequence text);
/** @hide */
- public abstract void internalNotifyViewHierarchyEvent(boolean started);
+ public abstract void internalNotifyViewTreeEvent(boolean started);
/**
* Creates a {@link ViewStructure} for a "standard" view.
@@ -501,14 +501,14 @@
switch (reason) {
case FLUSH_REASON_FULL:
return "FULL";
+ case FLUSH_REASON_VIEW_ROOT_ENTERED:
+ return "VIEW_ROOT";
case FLUSH_REASON_SESSION_STARTED:
return "STARTED";
case FLUSH_REASON_SESSION_FINISHED:
return "FINISHED";
case FLUSH_REASON_IDLE_TIMEOUT:
return "IDLE";
- case FLUSH_REASON_VIEW_ROOT_ENTERED:
- return "ENTERED";
default:
return "UNKOWN-" + reason;
}
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index 14b2b28..dce8ebe 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -16,13 +16,15 @@
package android.view.contentcapture;
import static android.view.contentcapture.ContentCaptureEvent.TYPE_CONTEXT_UPDATED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_INITIAL_VIEW_TREE_APPEARED;
-import static android.view.contentcapture.ContentCaptureEvent.TYPE_INITIAL_VIEW_TREE_APPEARING;
import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_FINISHED;
+import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_PAUSED;
+import static android.view.contentcapture.ContentCaptureEvent.TYPE_SESSION_RESUMED;
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_TEXT_CHANGED;
+import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_TREE_APPEARED;
+import static android.view.contentcapture.ContentCaptureEvent.TYPE_VIEW_TREE_APPEARING;
import static android.view.contentcapture.ContentCaptureHelper.getSanitizedString;
import static android.view.contentcapture.ContentCaptureHelper.sDebug;
import static android.view.contentcapture.ContentCaptureHelper.sVerbose;
@@ -543,8 +545,8 @@
}
@Override
- public void internalNotifyViewHierarchyEvent(boolean started) {
- notifyViewHierarchyEvent(mId, started);
+ public void internalNotifyViewTreeEvent(boolean started) {
+ notifyViewTreeEvent(mId, started);
}
@Override
@@ -590,12 +592,17 @@
}
/** Public because is also used by ViewRootImpl */
- public void notifyViewHierarchyEvent(@NonNull String sessionId, boolean started) {
- final int type = started ? TYPE_INITIAL_VIEW_TREE_APPEARING
- : TYPE_INITIAL_VIEW_TREE_APPEARED;
+ public void notifyViewTreeEvent(@NonNull String sessionId, boolean started) {
+ final int type = started ? TYPE_VIEW_TREE_APPEARING : TYPE_VIEW_TREE_APPEARED;
sendEvent(new ContentCaptureEvent(sessionId, type), FORCE_FLUSH);
}
+ /** Public because is also used by ViewRootImpl */
+ public void notifySessionLifecycle(boolean started) {
+ final int type = started ? TYPE_SESSION_RESUMED : TYPE_SESSION_PAUSED;
+ sendEvent(new ContentCaptureEvent(mId, type), FORCE_FLUSH);
+ }
+
void notifyContextUpdated(@NonNull String sessionId,
@Nullable ContentCaptureContext context) {
sendEvent(new ContentCaptureEvent(sessionId, TYPE_CONTEXT_UPDATED)