From 4d503fd57b38318ab9076452c41c7f5e7f328b98 Mon Sep 17 00:00:00 2001
From: Schubi <schubi@erlangen.ccc.de>
Date: Tue, 29 Jul 2014 00:38:11 +0200
Subject: [PATCH] ProximityWake: Fix and bring inline with CM

PS2: Clean up commit message

Change-Id: Ib35b83b2558e7516d8e80254b6e649149f270831
---

diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index 549b4bd..62c2607 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -61,5 +61,5 @@
 
     void setKeyboardVisibility(boolean visible);
 
-    void wakeUpFromKeyEvent(long time);
+    void wakeUpWithProximityCheck(long time);
 }
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 9e04d0f..8b1380a 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -521,13 +521,14 @@
     }
 
     /**
-     * Forces the device to wake up from sleep from a key event.
+     * Forces the device to wake up from sleep only if
+     * nothing is blocking the proximity sensor
      * @see #wakeUp
      * @hide
      */
-    public void wakeUpFromKeyEvent(long time) {
+    public void wakeUpWithProximityCheck(long time) {
         try {
-            mService.wakeUpFromKeyEvent(time);
+            mService.wakeUpWithProximityCheck(time);
         } catch (RemoteException e) {
         }
     }
diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java
index 99362df..022fd2d 100644
--- a/services/java/com/android/server/power/PowerManagerService.java
+++ b/services/java/com/android/server/power/PowerManagerService.java
@@ -181,6 +181,9 @@
     // Max time (microseconds) to allow a CPU boost for
     private static final int MAX_CPU_BOOST_TIME = 5000000;
 
+    // Max time allowed for proximity check
+    private static final int MAX_PROXIMITY_WAIT = 200;
+
     private Context mContext;
     private LightsService mLightsService;
     private BatteryService mBatteryService;
@@ -419,6 +422,7 @@
     private SensorManager mSensorManager;
     private Sensor mProximitySensor;
     private boolean mProximityWake;
+
     public PowerManagerService() {
         synchronized (mLock) {
             mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks");
@@ -1147,7 +1151,7 @@
     /**
      * @hide
      */
-    private void wakeUp(Runnable r, final long eventTime, boolean wakeupFromKeyEvent) {
+    private void wakeUp(final long eventTime, boolean checkProximity) {
         if (eventTime > SystemClock.uptimeMillis()) {
             throw new IllegalArgumentException("event time must not be in the future");
         }
@@ -1162,23 +1166,7 @@
 
         mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
 
-        if (mHandler.hasMessages(MSG_WAKE_UP)) {
-            // There is already a message queued;
-            return;
-        }
-
-        if (mProximityWake && wakeupFromKeyEvent && mProximitySensor != null) {
-            Message msg = mHandler.obtainMessage(MSG_WAKE_UP);
-            msg.obj = r;
-            mHandler.sendMessageDelayed(msg, 200);
-            runPostProximityCheck(r);
-        } else {
-            r.run();
-        }
-    }
-
-    private Runnable getWakeUpRunnable(final long eventTime) {
-        return new Runnable() {
+        Runnable r = new Runnable() {
             @Override
             public void run() {
                 final long ident = Binder.clearCallingIdentity();
@@ -1189,21 +1177,30 @@
                 }
             }
         };
+        runWithProximityCheck(r);
     }
 
-    @Override // Binder call
-    public void wakeUpFromKeyEvent(long eventTime) {
-        wakeUp(getWakeUpRunnable(eventTime), eventTime, true);
-    }
-
-    @Override // Binder call
-    public void wakeUp(long eventTime) {
-        wakeUp(getWakeUpRunnable(eventTime), eventTime, false);
+    private void runWithProximityCheck(Runnable r) {
+        if (mHandler.hasMessages(MSG_WAKE_UP)) {
+            // There is already a message queued;
+            return;
+        }
+        if (mProximityWake && mProximitySensor != null) {
+            Message msg = mHandler.obtainMessage(MSG_WAKE_UP);
+            msg.obj = r;
+            mHandler.sendMessageDelayed(msg, MAX_PROXIMITY_WAIT);
+            runPostProximityCheck(r);
+        } else {
+            r.run();
+        }
     }
 
     private void runPostProximityCheck(final Runnable r) {
+        if (mSensorManager == null) {
+            r.run();
+            return;
+        }
         mSensorManager.registerListener(new SensorEventListener() {
-
             @Override
             public void onSensorChanged(SensorEvent event) {
                 mSensorManager.unregisterListener(this);
@@ -1223,6 +1220,16 @@
         }, mProximitySensor, SensorManager.SENSOR_DELAY_FASTEST);
     }
 
+    @Override // Binder call
+    public void wakeUpWithProximityCheck(long eventTime) {
+        wakeUp(eventTime, true);
+    }
+
+    @Override // Binder call
+    public void wakeUp(long eventTime) {
+        wakeUp(eventTime, false);
+    }
+
     // Called from native code.
     private void wakeUpFromNative(final long eventTime) {
         Runnable r = new Runnable() {
@@ -1231,7 +1238,7 @@
                 wakeUpInternal(eventTime);
             }
         };
-        wakeUp(r, eventTime, true);
+        runWithProximityCheck(r);
     }
 
     private void wakeUpInternal(long eventTime) {
