diff options
| author | Wale Ogunwale <ogunwale@google.com> | 2015-09-24 13:47:31 -0700 |
|---|---|---|
| committer | Wale Ogunwale <ogunwale@google.com> | 2015-09-24 14:31:11 -0700 |
| commit | 4f52bc6f78085bc40110bce5cc485f715223556e (patch) | |
| tree | baa91597f32362cea03f1bd6862a95fce7cdbdf3 /core/java/android/view/BatchedInputEventReceiver.java | |
| parent | 6e3cc291ea698d63f9eced987c0697b1745c6da8 (diff) | |
Batch ACTION_MOVE events to vsync boundries when resizing task
- Created helper class BatchedInputEventReceiver for batching
ACTION_MOVE events to vsync boundries.
- Switched TaskPositioner to use new helper class for input events
so we reduce the number of input events we process per vsync.
Bug: 24375616
Change-Id: I4ee27949b956784fb89d8f190497e4765522c9d3
Diffstat (limited to 'core/java/android/view/BatchedInputEventReceiver.java')
| -rw-r--r-- | core/java/android/view/BatchedInputEventReceiver.java | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/core/java/android/view/BatchedInputEventReceiver.java b/core/java/android/view/BatchedInputEventReceiver.java new file mode 100644 index 000000000000..b1d28e000bc8 --- /dev/null +++ b/core/java/android/view/BatchedInputEventReceiver.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package android.view; + +import android.os.Looper; + +/** + * Similar to {@link InputEventReceiver}, but batches events to vsync boundaries when possible. + * @hide + */ +public class BatchedInputEventReceiver extends InputEventReceiver { + Choreographer mChoreographer; + private boolean mBatchedInputScheduled; + + public BatchedInputEventReceiver( + InputChannel inputChannel, Looper looper, Choreographer choreographer) { + super(inputChannel, looper); + mChoreographer = choreographer; + } + + @Override + public void onBatchedInputEventPending() { + scheduleBatchedInput(); + } + + @Override + public void dispose() { + unscheduleBatchedInput(); + super.dispose(); + } + + void doConsumeBatchedInput(long frameTimeNanos) { + if (mBatchedInputScheduled) { + mBatchedInputScheduled = false; + if (consumeBatchedInputEvents(frameTimeNanos) && frameTimeNanos != -1) { + // If we consumed a batch here, we want to go ahead and schedule the + // consumption of batched input events on the next frame. Otherwise, we would + // wait until we have more input events pending and might get starved by other + // things occurring in the process. If the frame time is -1, however, then + // we're in a non-batching mode, so there's no need to schedule this. + scheduleBatchedInput(); + } + } + } + + private void scheduleBatchedInput() { + if (!mBatchedInputScheduled) { + mBatchedInputScheduled = true; + mChoreographer.postCallback(Choreographer.CALLBACK_INPUT, mBatchedInputRunnable, null); + } + } + + private void unscheduleBatchedInput() { + if (mBatchedInputScheduled) { + mBatchedInputScheduled = false; + mChoreographer.removeCallbacks( + Choreographer.CALLBACK_INPUT, mBatchedInputRunnable, null); + } + } + + private final class BatchedInputRunnable implements Runnable { + @Override + public void run() { + doConsumeBatchedInput(mChoreographer.getFrameTimeNanos()); + } + } + private final BatchedInputRunnable mBatchedInputRunnable = new BatchedInputRunnable(); +} |
