add/remove displays properly on hotplug events
Bug: 7191563
Change-Id: I8f0fbf3b29658c9479443141798e6f288a1f2d52
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 8164d20..8372691 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -408,10 +408,10 @@
DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
mDefaultDisplays[i] = new BBinder();
wp<IBinder> token = mDefaultDisplays[i];
- mCurrentState.displays.add(token, DisplayDeviceState(type));
// set-up the displays that are already connected
- if (mHwc->isConnected(i)) {
+ if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
+ mCurrentState.displays.add(token, DisplayDeviceState(type));
sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i);
sp<SurfaceTextureClient> stc = new SurfaceTextureClient(
static_cast< sp<ISurfaceTexture> >(fbs->getBufferQueue()));
@@ -688,7 +688,17 @@
ALOGW("WARNING: EventThread not started, ignoring hotplug");
return;
}
+
if (uint32_t(type) < DisplayDevice::NUM_DISPLAY_TYPES) {
+ Mutex::Autolock _l(mStateLock);
+ if (connected == false) {
+ mCurrentState.displays.removeItem(mDefaultDisplays[type]);
+ } else {
+ DisplayDeviceState info((DisplayDevice::DisplayType)type);
+ mCurrentState.displays.add(mDefaultDisplays[type], info);
+ }
+ setTransactionFlags(eDisplayTransactionNeeded);
+
// we should only receive DisplayDevice::DisplayType from the vsync callback
mEventThread->onHotplugReceived(type, connected);
}