SurfaceFlinger: Adds the functionality to reduce refresh rate to half of
the default.

Feature added for the low power mode.

Change-Id: I2849e5ea335c0d2509fea1c315392bce7f20451d
Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
diff --git a/services/surfaceflinger/DispSync.cpp b/services/surfaceflinger/DispSync.cpp
index 602f20a..a00ccdb 100644
--- a/services/surfaceflinger/DispSync.cpp
+++ b/services/surfaceflinger/DispSync.cpp
@@ -61,7 +61,10 @@
 public:
 
     DispSyncThread():
+            mLowPowerMode(false),
             mStop(false),
+            mLastVsyncSent(false),
+            mLastBufferFull(false),
             mPeriod(0),
             mPhase(0),
             mWakeupLatency(0) {
@@ -145,7 +148,18 @@
             }
 
             if (callbackInvocations.size() > 0) {
-                fireCallbackInvocations(callbackInvocations);
+                if (mLowPowerMode) {
+                    if (!mLastVsyncSent || !mLastBufferFull) {
+                        fireCallbackInvocations(callbackInvocations);
+                        mLastVsyncSent = true;
+                    } else
+                        mLastVsyncSent = false;
+                } else {
+                    fireCallbackInvocations(callbackInvocations);
+                }
+                mLastBufferFull = true;
+            } else {
+                mLastBufferFull = false;
             }
         }
 
@@ -200,6 +214,7 @@
         return !mEventListeners.empty();
     }
 
+    bool mLowPowerMode;
 private:
 
     struct EventListener {
@@ -272,6 +287,8 @@
     }
 
     bool mStop;
+    bool mLastVsyncSent;
+    bool mLastBufferFull;
 
     nsecs_t mPeriod;
     nsecs_t mPhase;
@@ -395,6 +412,10 @@
     return mThread->addEventListener(phase, callback);
 }
 
+void DispSync::setLowPowerMode(bool enabled) {
+    mThread->mLowPowerMode = enabled;
+}
+
 status_t DispSync::removeEventListener(const sp<Callback>& callback) {
     Mutex::Autolock lock(mMutex);
     return mThread->removeEventListener(callback);