SF: Separate EventThread into interface and impl
This allows the normal EventThread to be substituted by a GMock for unit
tests.
The EventThread is now the abstract interface. impl::EventThread is the
normal implementation.
Test: Builds
Bug: None
Change-Id: I2c6234a10849f7d34a215d53e5f601895738a5ae
diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp
index 53d95e2..90aab50 100644
--- a/services/surfaceflinger/EventThread.cpp
+++ b/services/surfaceflinger/EventThread.cpp
@@ -43,6 +43,10 @@
// ---------------------------------------------------------------------------
+EventThread::~EventThread() = default;
+
+namespace impl {
+
EventThread::EventThread(VSyncSource* src, SurfaceFlinger& flinger, bool interceptVSyncs,
const char* threadName)
: mVSyncSource(src), mFlinger(flinger), mInterceptVSyncs(interceptVSyncs) {
@@ -84,7 +88,7 @@
mVSyncSource->setPhaseOffset(phaseOffset);
}
-sp<EventThread::Connection> EventThread::createEventConnection() const {
+sp<BnDisplayEventConnection> EventThread::createEventConnection() const {
return new Connection(const_cast<EventThread*>(this));
}
@@ -404,4 +408,5 @@
// ---------------------------------------------------------------------------
+} // namespace impl
} // namespace android
diff --git a/services/surfaceflinger/EventThread.h b/services/surfaceflinger/EventThread.h
index 9ae8fb2..708806a 100644
--- a/services/surfaceflinger/EventThread.h
+++ b/services/surfaceflinger/EventThread.h
@@ -56,7 +56,29 @@
virtual void setPhaseOffset(nsecs_t phaseOffset) = 0;
};
-class EventThread : private VSyncSource::Callback {
+class EventThread {
+public:
+ virtual ~EventThread();
+
+ virtual sp<BnDisplayEventConnection> createEventConnection() const = 0;
+
+ // called before the screen is turned off from main thread
+ virtual void onScreenReleased() = 0;
+
+ // called after the screen is turned on from main thread
+ virtual void onScreenAcquired() = 0;
+
+ // called when receiving a hotplug event
+ virtual void onHotplugReceived(int type, bool connected) = 0;
+
+ virtual void dump(String8& result) const = 0;
+
+ virtual void setPhaseOffset(nsecs_t phaseOffset) = 0;
+};
+
+namespace impl {
+
+class EventThread : public android::EventThread, private VSyncSource::Callback {
class Connection : public BnDisplayEventConnection {
public:
explicit Connection(EventThread* eventThread);
@@ -82,24 +104,24 @@
const char* threadName);
~EventThread();
- sp<Connection> createEventConnection() const;
+ sp<BnDisplayEventConnection> createEventConnection() const override;
status_t registerDisplayEventConnection(const sp<Connection>& connection);
void setVsyncRate(uint32_t count, const sp<Connection>& connection);
void requestNextVsync(const sp<Connection>& connection);
// called before the screen is turned off from main thread
- void onScreenReleased();
+ void onScreenReleased() override;
// called after the screen is turned on from main thread
- void onScreenAcquired();
+ void onScreenAcquired() override;
// called when receiving a hotplug event
- void onHotplugReceived(int type, bool connected);
+ void onHotplugReceived(int type, bool connected) override;
- void dump(String8& result) const;
+ void dump(String8& result) const override;
- void setPhaseOffset(nsecs_t phaseOffset);
+ void setPhaseOffset(nsecs_t phaseOffset) override;
private:
void threadMain();
@@ -139,4 +161,5 @@
// ---------------------------------------------------------------------------
-}; // namespace android
+} // namespace impl
+} // namespace android
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 7ad13e3..03f6bdc 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -574,15 +574,16 @@
Mutex::Autolock _l(mStateLock);
// start the EventThread
-
- mEventThreadSource = std::make_unique<DispSyncSource>(
- &mPrimaryDispSync, SurfaceFlinger::vsyncPhaseOffsetNs, true, "app");
- mEventThread = std::make_unique<EventThread>(
- mEventThreadSource.get(), *this, false, "sfEventThread");
- mSfEventThreadSource = std::make_unique<DispSyncSource>(
- &mPrimaryDispSync, SurfaceFlinger::sfVsyncPhaseOffsetNs, true, "sf");
- mSFEventThread = std::make_unique<EventThread>(
- mSfEventThreadSource.get(), *this, true, "appEventThread");
+ mEventThreadSource =
+ std::make_unique<DispSyncSource>(&mPrimaryDispSync, SurfaceFlinger::vsyncPhaseOffsetNs,
+ true, "app");
+ mEventThread = std::make_unique<impl::EventThread>(mEventThreadSource.get(), *this, false,
+ "appEventThread");
+ mSfEventThreadSource =
+ std::make_unique<DispSyncSource>(&mPrimaryDispSync,
+ SurfaceFlinger::sfVsyncPhaseOffsetNs, true, "sf");
+ mSFEventThread = std::make_unique<impl::EventThread>(mSfEventThreadSource.get(), *this, true,
+ "sfEventThread");
mEventQueue.setEventThread(mSFEventThread.get());
// Get a RenderEngine for the given display / config (can't fail)
@@ -1068,8 +1069,9 @@
ALOGV("VSync Injections enabled");
if (mVSyncInjector.get() == nullptr) {
mVSyncInjector = std::make_unique<InjectVSyncSource>();
- mInjectorEventThread = std::make_unique<EventThread>(
- mVSyncInjector.get(), *this, false, "injEvThread");
+ mInjectorEventThread =
+ std::make_unique<impl::EventThread>(mVSyncInjector.get(), *this, false,
+ "injEventThread");
}
mEventQueue.setEventThread(mInjectorEventThread.get());
} else {
diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h
index a17eb70..b7ebb1b 100644
--- a/services/surfaceflinger/SurfaceFlinger.h
+++ b/services/surfaceflinger/SurfaceFlinger.h
@@ -93,6 +93,10 @@
class SurfaceFlingerBE;
class VSyncSource;
+namespace impl {
+class EventThread;
+} // namespace impl
+
namespace RE {
class RenderEngine;
}
@@ -312,7 +316,7 @@
private:
friend class Client;
friend class DisplayEventConnection;
- friend class EventThread;
+ friend class impl::EventThread;
friend class Layer;
friend class BufferLayer;
friend class MonitoredProducer;