diff options
| author | Adam He <adamhe@google.com> | 2019-03-08 14:21:28 -0800 |
|---|---|---|
| committer | Adam He <adamhe@google.com> | 2019-03-14 13:27:35 -0700 |
| commit | ba9f64d46e7c8d8fd4bb64f618c65375b6b667e0 (patch) | |
| tree | e9f9000319fb92f295a9ad2f9d5100ad2365caf0 /core/java | |
| parent | 463b5d191b3501d039a937a1efec3552610aaf65 (diff) | |
Push buffer with TEXT_CHANGE_TIMEOUT from
device_config_text_change_flush_frequency if text_change event received.
Fixes: 124398961
Test: atest CtsContentCaptureServiceTestCases
Change-Id: I9c90cdf6ae9fbf27a66c761828b84b7b0c3b4f9d
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/view/contentcapture/ContentCaptureSession.java | 7 | ||||
| -rw-r--r-- | core/java/android/view/contentcapture/MainContentCaptureSession.java | 52 |
2 files changed, 52 insertions, 7 deletions
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java index 1f0971e7d6c5..5c4b71121451 100644 --- a/core/java/android/view/contentcapture/ContentCaptureSession.java +++ b/core/java/android/view/contentcapture/ContentCaptureSession.java @@ -139,6 +139,8 @@ public abstract class ContentCaptureSession implements AutoCloseable { public static final int FLUSH_REASON_SESSION_FINISHED = 4; /** @hide */ public static final int FLUSH_REASON_IDLE_TIMEOUT = 5; + /** @hide */ + public static final int FLUSH_REASON_TEXT_CHANGE_TIMEOUT = 6; /** @hide */ @IntDef(prefix = { "FLUSH_REASON_" }, value = { @@ -146,7 +148,8 @@ public abstract class ContentCaptureSession implements AutoCloseable { FLUSH_REASON_VIEW_ROOT_ENTERED, FLUSH_REASON_SESSION_STARTED, FLUSH_REASON_SESSION_FINISHED, - FLUSH_REASON_IDLE_TIMEOUT + FLUSH_REASON_IDLE_TIMEOUT, + FLUSH_REASON_TEXT_CHANGE_TIMEOUT }) @Retention(RetentionPolicy.SOURCE) public @interface FlushReason{} @@ -510,6 +513,8 @@ public abstract class ContentCaptureSession implements AutoCloseable { return "FINISHED"; case FLUSH_REASON_IDLE_TIMEOUT: return "IDLE"; + case FLUSH_REASON_TEXT_CHANGE_TIMEOUT: + return "TEXT_CHANGE"; default: return "UNKOWN-" + reason; } diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java index dce8ebe66111..61a2435d3cb0 100644 --- a/core/java/android/view/contentcapture/MainContentCaptureSession.java +++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java @@ -125,6 +125,11 @@ public final class MainContentCaptureSession extends ContentCaptureSession { // Used just for debugging purposes (on dump) private long mNextFlush; + /** + * Whether the next buffer flush is queued by a text changed event. + */ + private boolean mNextFlushForTextChanged = false; + @Nullable private final LocalLog mFlushHistory; @@ -323,7 +328,21 @@ public final class MainContentCaptureSession extends ContentCaptureSession { final boolean bufferEvent = numberEvents < maxBufferSize; if (bufferEvent && !forceFlush) { - scheduleFlush(FLUSH_REASON_IDLE_TIMEOUT, /* checkExisting= */ true); + final int flushReason; + if (eventType == TYPE_VIEW_TEXT_CHANGED) { + mNextFlushForTextChanged = true; + flushReason = FLUSH_REASON_TEXT_CHANGE_TIMEOUT; + } else { + if (mNextFlushForTextChanged) { + if (sVerbose) { + Log.i(TAG, "Not scheduling flush because next flush is for text changed"); + } + return; + } + + flushReason = FLUSH_REASON_IDLE_TIMEOUT; + } + scheduleFlush(flushReason, /* checkExisting= */ true); return; } @@ -408,14 +427,25 @@ public final class MainContentCaptureSession extends ContentCaptureSession { // "Renew" the flush message by removing the previous one mHandler.removeMessages(MSG_FLUSH); } - final int idleFlushingFrequencyMs = mManager.mOptions.idleFlushingFrequencyMs; - mNextFlush = System.currentTimeMillis() + idleFlushingFrequencyMs; + + final int flushFrequencyMs; + if (reason == FLUSH_REASON_IDLE_TIMEOUT) { + flushFrequencyMs = mManager.mOptions.idleFlushingFrequencyMs; + } else if (reason == FLUSH_REASON_TEXT_CHANGE_TIMEOUT) { + flushFrequencyMs = mManager.mOptions.textChangeFlushingFrequencyMs; + } else { + Log.e(TAG, "handleScheduleFlush(" + getDebugState(reason) + "): not called with a " + + "timeout reason."); + return; + } + + mNextFlush = System.currentTimeMillis() + flushFrequencyMs; if (sVerbose) { Log.v(TAG, "handleScheduleFlush(): scheduled to flush in " - + idleFlushingFrequencyMs + "ms: " + TimeUtils.logTimeOfDay(mNextFlush)); + + flushFrequencyMs + "ms: " + TimeUtils.logTimeOfDay(mNextFlush)); } // Post using a Runnable directly to trim a few μs from PooledLambda.obtainMessage() - mHandler.postDelayed(() -> flushIfNeeded(reason), MSG_FLUSH, idleFlushingFrequencyMs); + mHandler.postDelayed(() -> flushIfNeeded(reason), MSG_FLUSH, flushFrequencyMs); } @UiThread @@ -464,6 +494,10 @@ public final class MainContentCaptureSession extends ContentCaptureSession { try { mHandler.removeMessages(MSG_FLUSH); + if (reason == FLUSH_REASON_TEXT_CHANGE_TIMEOUT) { + mNextFlushForTextChanged = false; + } + final ParceledListSlice<ContentCaptureEvent> events = clearEvents(); mDirectServiceInterface.sendEvents(events); } catch (RemoteException e) { @@ -641,8 +675,14 @@ public final class MainContentCaptureSession extends ContentCaptureSession { pw.println(); } } + pw.print(prefix); pw.print("mNextFlushForTextChanged: "); + pw.println(mNextFlushForTextChanged); pw.print(prefix); pw.print("flush frequency: "); - pw.println(mManager.mOptions.idleFlushingFrequencyMs); + if (mNextFlushForTextChanged) { + pw.println(mManager.mOptions.textChangeFlushingFrequencyMs); + } else { + pw.println(mManager.mOptions.idleFlushingFrequencyMs); + } pw.print(prefix); pw.print("next flush: "); TimeUtils.formatDuration(mNextFlush - System.currentTimeMillis(), pw); pw.print(" ("); pw.print(TimeUtils.logTimeOfDay(mNextFlush)); pw.println(")"); |
