Merge "Add uhid permission to virtual_touchpad"
diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp
index 96d7568..9c311a3 100644
--- a/libs/gui/BufferQueueProducer.cpp
+++ b/libs/gui/BufferQueueProducer.cpp
@@ -886,7 +886,7 @@
item.mFence = acquireFence;
item.mFenceTime = acquireFenceTime;
item.mIsDroppable = mCore->mAsyncMode ||
- (!mCore->mLegacyBufferDrop && mConsumerIsSurfaceFlinger) ||
+ (mConsumerIsSurfaceFlinger && mCore->mQueueBufferCanDrop) ||
(mCore->mLegacyBufferDrop && mCore->mQueueBufferCanDrop) ||
(mCore->mSharedBufferMode && mCore->mSharedBufferSlot == slot);
item.mSurfaceDamage = surfaceDamage;
@@ -1497,7 +1497,9 @@
BQ_LOGV("setDequeueTimeout: %" PRId64, timeout);
std::lock_guard<std::mutex> lock(mCore->mMutex);
- int delta = mCore->getMaxBufferCountLocked(mCore->mAsyncMode, false,
+ bool dequeueBufferCannotBlock =
+ timeout >= 0 ? false : mCore->mDequeueBufferCannotBlock;
+ int delta = mCore->getMaxBufferCountLocked(mCore->mAsyncMode, dequeueBufferCannotBlock,
mCore->mMaxBufferCount) - mCore->getMaxBufferCountLocked();
if (!mCore->adjustAvailableSlotsLocked(delta)) {
BQ_LOGE("setDequeueTimeout: BufferQueue failed to adjust the number of "
@@ -1506,11 +1508,9 @@
}
mDequeueTimeout = timeout;
- if (timeout >= 0) {
- mCore->mDequeueBufferCannotBlock = false;
- if (timeout != 0) {
- mCore->mQueueBufferCanDrop = false;
- }
+ mCore->mDequeueBufferCannotBlock = dequeueBufferCannotBlock;
+ if (timeout > 0) {
+ mCore->mQueueBufferCanDrop = false;
}
VALIDATE_CONSISTENCY();
diff --git a/libs/gui/include/gui/BufferQueueCore.h b/libs/gui/include/gui/BufferQueueCore.h
index 9c0ee99..690a85f 100644
--- a/libs/gui/include/gui/BufferQueueCore.h
+++ b/libs/gui/include/gui/BufferQueueCore.h
@@ -233,7 +233,8 @@
// mLegacyBufferDrop indicates whether mQueueBufferCanDrop is in effect.
// If this flag is set mQueueBufferCanDrop is working as explained. If not
- // queueBuffer will not drop buffers unless consumer is SurfaceFlinger.
+ // queueBuffer will not drop buffers unless consumer is SurfaceFlinger and
+ // mQueueBufferCanDrop is set.
bool mLegacyBufferDrop;
// mDefaultBufferFormat can be set so it will override the buffer format
diff --git a/libs/input/InputTransport.cpp b/libs/input/InputTransport.cpp
index 2a5a604..d02cb8e 100644
--- a/libs/input/InputTransport.cpp
+++ b/libs/input/InputTransport.cpp
@@ -84,6 +84,10 @@
return a + alpha * (b - a);
}
+inline static bool isPointerEvent(int32_t source) {
+ return (source & AINPUT_SOURCE_CLASS_POINTER) == AINPUT_SOURCE_CLASS_POINTER;
+}
+
// --- InputMessage ---
bool InputMessage::isValid(size_t actualSize) const {
@@ -637,6 +641,16 @@
mChannel->getName().c_str());
#endif
break;
+ } else if (isPointerEvent(mMsg.body.motion.source) &&
+ mMsg.body.motion.action == AMOTION_EVENT_ACTION_CANCEL) {
+ // No need to process events that we are going to cancel anyways
+ const size_t count = batch.samples.size();
+ for (size_t i = 0; i < count; i++) {
+ const InputMessage& msg = batch.samples.itemAt(i);
+ sendFinishedSignal(msg.body.motion.seq, false);
+ }
+ batch.samples.removeItemsAt(0, count);
+ mBatches.removeAt(batchIndex);
} else {
// We cannot append to the batch in progress, so we need to consume
// the previous batch right now and defer the new message until later.
@@ -759,8 +773,7 @@
}
void InputConsumer::updateTouchState(InputMessage& msg) {
- if (!mResampleTouch ||
- !(msg.body.motion.source & AINPUT_SOURCE_CLASS_POINTER)) {
+ if (!mResampleTouch || !isPointerEvent(msg.body.motion.source)) {
return;
}
@@ -872,7 +885,7 @@
void InputConsumer::resampleTouchState(nsecs_t sampleTime, MotionEvent* event,
const InputMessage* next) {
if (!mResampleTouch
- || !(event->getSource() & AINPUT_SOURCE_CLASS_POINTER)
+ || !(isPointerEvent(event->getSource()))
|| event->getAction() != AMOTION_EVENT_ACTION_MOVE) {
return;
}
diff --git a/services/surfaceflinger/Scheduler/DispSync.cpp b/services/surfaceflinger/Scheduler/DispSync.cpp
index f7a30af..95ff9d0 100644
--- a/services/surfaceflinger/Scheduler/DispSync.cpp
+++ b/services/surfaceflinger/Scheduler/DispSync.cpp
@@ -79,11 +79,7 @@
Mutex::Autolock lock(mMutex);
mPhase = phase;
- if (mReferenceTime != referenceTime) {
- for (auto& eventListener : mEventListeners) {
- eventListener.mHasFired = false;
- }
- }
+ const bool referenceTimeChanged = mReferenceTime != referenceTime;
mReferenceTime = referenceTime;
if (mPeriod != 0 && mPeriod != period && mReferenceTime != 0) {
// Inflate the reference time to be the most recent predicted
@@ -94,6 +90,13 @@
mReferenceTime = mReferenceTime + (numOldPeriods)*mPeriod;
}
mPeriod = period;
+ if (!mModelLocked && referenceTimeChanged) {
+ for (auto& eventListener : mEventListeners) {
+ eventListener.mHasFired = false;
+ eventListener.mLastEventTime =
+ mReferenceTime - mPeriod + mPhase + eventListener.mPhase;
+ }
+ }
if (mTraceDetailedInfo) {
ATRACE_INT64("DispSync:Period", mPeriod);
ATRACE_INT64("DispSync:Phase", mPhase + mPeriod / 2);
@@ -120,6 +123,13 @@
void unlockModel() {
Mutex::Autolock lock(mMutex);
+ if (mModelLocked) {
+ for (auto& eventListener : mEventListeners) {
+ if (eventListener.mLastEventTime > mReferenceTime) {
+ eventListener.mHasFired = true;
+ }
+ }
+ }
mModelLocked = false;
ATRACE_INT("DispSync:ModelLocked", mModelLocked);
}
@@ -249,6 +259,10 @@
listener.mLastCallbackTime = lastCallbackTime;
}
+ if (!mModelLocked && listener.mLastEventTime > mReferenceTime) {
+ listener.mHasFired = true;
+ }
+
mEventListeners.push_back(listener);
mCond.signal();