SurfaceFlinger: send VSYNC power hints to IPowerManager

VSYNC power hints are now sent via binder to IPowerManager.
SurfaceFlinger no longer loads a second copy of the PowerHAL.
VSYNC power hints are sent in batches and not on per frame basis.

Change-Id: Ia5a839ab3c857cffae7089f810b4315d4ed23fcf
diff --git a/services/surfaceflinger/DisplayHardware/PowerHAL.cpp b/services/surfaceflinger/DisplayHardware/PowerHAL.cpp
index e41fbbc..bd50b4a 100644
--- a/services/surfaceflinger/DisplayHardware/PowerHAL.cpp
+++ b/services/surfaceflinger/DisplayHardware/PowerHAL.cpp
@@ -20,38 +20,30 @@
 #include <cutils/log.h>
 #include <utils/Errors.h>
 
+#include <binder/IServiceManager.h>
+#include <powermanager/IPowerManager.h>
+#include <powermanager/PowerManager.h>
+
 #include "PowerHAL.h"
 
 namespace android {
 // ---------------------------------------------------------------------------
 
-PowerHAL::PowerHAL() : mPowerModule(0), mVSyncHintEnabled(false) {
-    int err = hw_get_module(POWER_HARDWARE_MODULE_ID,
-            (const hw_module_t **)&mPowerModule);
-    ALOGW_IF(err, "%s module not found", POWER_HARDWARE_MODULE_ID);
-}
-
-PowerHAL::~PowerHAL() {
-}
-
-status_t PowerHAL::initCheck() const {
-    return mPowerModule ? NO_ERROR : NO_INIT;
-}
-
 status_t PowerHAL::vsyncHint(bool enabled) {
-    if (!mPowerModule) {
-        return NO_INIT;
-    }
-    if (mPowerModule->common.module_api_version >= POWER_MODULE_API_VERSION_0_2) {
-        if (mPowerModule->powerHint) {
-            if (mVSyncHintEnabled != bool(enabled)) {
-                mPowerModule->powerHint(mPowerModule,
-                        POWER_HINT_VSYNC, (void*)enabled);
-                mVSyncHintEnabled = bool(enabled);
-            }
+    Mutex::Autolock _l(mlock);
+    if (mPowerManager == NULL) {
+        const String16 serviceName("power");
+        sp<IBinder> bs = defaultServiceManager()->checkService(serviceName);
+        if (bs == NULL) {
+            return NAME_NOT_FOUND;
         }
+        mPowerManager = interface_cast<IPowerManager>(bs);
     }
-    return NO_ERROR;
+    status_t status = mPowerManager->powerHint(POWER_HINT_VSYNC, enabled ? 1 : 0);
+    if(status == DEAD_OBJECT) {
+        mPowerManager = NULL;
+    }
+    return status;
 }
 
 // ---------------------------------------------------------------------------