DeviceParts: KeyHandler: use ExecutorService for listener registration

Replicate what Google did for SystemUI in this commit.
aosp-mirror/platform_frameworks_base@fabc743

Registering a sensor seems to be an expensive operation,
and we do it on each screen-on event, so moving it to
an asynchronous task looks like a good idea anyway.

By moving all non-essential binder calls of the main thread or to the
next frame, we bring this down to 5ms, such that window animation
and Keyguard animation starts about at the same time.

The interesting part about the ExecutorService:
"Memory consistency effects: Actions in a thread prior to the submission
of a Runnable or Callable task to an ExecutorService happen-before any
actions taken by that task, which in turn happen-before the result is
retrieved via Future.get()."
(from https://developer.android.com/reference/java/util/concurrent/ExecutorService)

Change-Id: I4f37bb9a7dc9d7775d587d4ebd4b6619f3b77e81
diff --git a/DeviceParts/src/org/omnirom/device/KeyHandler.java b/DeviceParts/src/org/omnirom/device/KeyHandler.java
index cebbeb7..6c30550 100644
--- a/DeviceParts/src/org/omnirom/device/KeyHandler.java
+++ b/DeviceParts/src/org/omnirom/device/KeyHandler.java
@@ -65,6 +65,10 @@
 import com.android.internal.util.ScreenshotHelper;
 import com.android.internal.statusbar.IStatusBarService;
 
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
 import org.omnirom.omnilib.utils.DeviceKeyHandler;
 import org.omnirom.omnilib.utils.OmniSettings;
 import org.omnirom.omnilib.utils.OmniUtils;
@@ -161,6 +165,7 @@
     private boolean mRestoreUser;
     private boolean mDoubleTapToWake;
     private ClientPackageNameObserver mClientObserver;
+    private ExecutorService mExecutorService;
 
     private SensorEventListener mProximitySensor = new SensorEventListener() {
         @Override
@@ -297,6 +302,11 @@
             mClientObserver = new ClientPackageNameObserver(CLIENT_PACKAGE_PATH);
             mClientObserver.startWatching();
         }
+        mExecutorService = Executors.newSingleThreadExecutor();
+    }
+
+    private Future<?> submit(Runnable runnable) {
+        return mExecutorService.submit(runnable);
     }
 
     private class EventHandler extends Handler {
@@ -438,11 +448,15 @@
         if (DEBUG) Log.i(TAG, "Display on");
         if (enableProxiSensor()) {
             if (DEBUG_SENSOR) Log.i(TAG, "Unregister proxi sensor");
-            mSensorManager.unregisterListener(mProximitySensor, mPocketSensor);
+            submit(() -> {
+                mSensorManager.unregisterListener(mProximitySensor, mPocketSensor);
+            });
         }
         if (mUseTiltCheck) {
             if (DEBUG_SENSOR) Log.i(TAG, "Unregister tilt sensor");
-            mSensorManager.unregisterListener(mTiltSensorListener, mTiltSensor);
+            submit(() -> {
+                mSensorManager.unregisterListener(mTiltSensorListener, mTiltSensor);
+            });
         }
         if ((mClientObserver == null) && (isASUSCameraAvail)) {
             mClientObserver = new ClientPackageNameObserver(CLIENT_PACKAGE_PATH);
@@ -462,14 +476,18 @@
         if (enableProxiSensor()) {
             mProxyWasNear = false;
             if (DEBUG_SENSOR) Log.i(TAG, "Register proxi sensor ");
-            mSensorManager.registerListener(mProximitySensor, mPocketSensor,
-                    SensorManager.SENSOR_DELAY_NORMAL);
+            submit(() -> {
+                mSensorManager.registerListener(mProximitySensor, mPocketSensor,
+                        SensorManager.SENSOR_DELAY_NORMAL);
+            });
             mProxySensorTimestamp = SystemClock.elapsedRealtime();
         }
         if (mUseTiltCheck) {
             if (DEBUG_SENSOR) Log.i(TAG, "Register tilt sensor ");
-            mSensorManager.registerListener(mTiltSensorListener, mTiltSensor,
-                    SensorManager.SENSOR_DELAY_NORMAL);
+            submit(() -> {
+                mSensorManager.registerListener(mTiltSensorListener, mTiltSensor,
+                        SensorManager.SENSOR_DELAY_NORMAL);
+            });
         }
         if (mClientObserver != null) {
             mClientObserver.stopWatching();