Refactor the code

 * Split out classes for pixel buffer and virtual display
 * Move resize handling to appropriate classes
 * Use callbacks for orientation change and client resize
 * Remove unnecessary locking
diff --git a/src/AndroidDesktop.h b/src/AndroidDesktop.h
index 0d3f8e4..768c27c 100644
--- a/src/AndroidDesktop.h
+++ b/src/AndroidDesktop.h
@@ -10,20 +10,23 @@
 
 #include <gui/CpuConsumer.h>
 
+#include <ui/DisplayInfo.h>
+
 #include <rfb/PixelBuffer.h>
 #include <rfb/SDesktop.h>
 #include <rfb/VNCServerST.h>
 
+#include "AndroidPixelBuffer.h"
 #include "InputDevice.h"
-
+#include "VirtualDisplay.h"
 
 using namespace android;
 
 namespace vncflinger {
 
-static const rfb::PixelFormat pfRGBX(32, 24, false, true, 255, 255, 255, 0, 8, 16);
-
-class AndroidDesktop : public rfb::SDesktop, public RefBase {
+class AndroidDesktop : public rfb::SDesktop,
+                       public CpuConsumer::FrameAvailableListener,
+                       public AndroidPixelBuffer::BufferDimensionsListener {
   public:
     AndroidDesktop();
 
@@ -44,77 +47,35 @@
         return mEventFd;
     }
 
+    virtual void onBufferDimensionsChanged(uint32_t width, uint32_t height);
+
+    virtual void onFrameAvailable(const BufferItem& item);
+
   private:
-    class FrameListener : public CpuConsumer::FrameAvailableListener {
-      public:
-        FrameListener(AndroidDesktop* desktop) : mDesktop(desktop) {
-        }
-
-        virtual void onFrameAvailable(const BufferItem& item);
-
-      private:
-        FrameListener(FrameListener&) {
-        }
-        AndroidDesktop* mDesktop;
-    };
-
-    class AndroidPixelBuffer : public RefBase, public rfb::ManagedPixelBuffer {
-      public:
-        AndroidPixelBuffer(uint64_t width, uint64_t height)
-            : rfb::ManagedPixelBuffer(sRGBX, width, height) {
-        }
-    };
-
-    virtual status_t createVirtualDisplay();
-    virtual status_t destroyVirtualDisplay();
-
     virtual void notify();
 
-    virtual status_t updateDisplayProjection();
-    virtual bool updateFBSize(uint64_t width, uint64_t height);
-    virtual void processDesktopResize();
+    virtual status_t updateDisplayInfo();
 
-    uint64_t mSourceWidth, mSourceHeight;
-    uint64_t mWidth, mHeight;
     Rect mDisplayRect;
 
-    bool mRotated;
-
-    Mutex mMutex;
-
-    bool mFrameAvailable;
-    bool mProjectionChanged;
-    bool mRotate;
-    bool mVDSActive;
+    Mutex mLock;
 
     uint64_t mFrameNumber;
-    nsecs_t mFrameStartWhen;
 
     int mEventFd;
 
-    // Android virtual display is always 32-bit
-    static const rfb::PixelFormat sRGBX;
-
     // Server instance
     rfb::VNCServerST* mServer;
 
     // Pixel buffer
     sp<AndroidPixelBuffer> mPixels;
 
+    // Virtual display controller
+    sp<VirtualDisplay> mVirtualDisplay;
+
     // Primary display
     sp<IBinder> mMainDpy;
-
-    // Virtual display
-    sp<IBinder> mDpy;
-
-    // Producer side of queue, passed into the virtual display.
-    sp<IGraphicBufferProducer> mProducer;
-
-    // This receives frames from the virtual display and makes them available
-    sp<CpuConsumer> mCpuConsumer;
-
-    // Listener for virtual display buffers
-    sp<FrameListener> mListener;
+    DisplayInfo mDisplayInfo;
 
     // Virtual input device
     sp<InputDevice> mInputDevice;