Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80da3dfe authored by Danesh M's avatar Danesh M
Browse files

PowerManager : Make proximity check opt-in

Change-Id: I7cf64a82530da2e655018e43683ba7a5584d54f8
(cherry picked from commit 2323852b)
parent 871e9a84
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -1542,4 +1542,10 @@
         policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
    -->
    <integer name="config_longPressOnMenuBehavior">3</integer>

    <!-- Default value for proximity check on screen wake
         NOTE ! - Enable for devices that have a fast response proximity sensor (ideally < 300ms)
    -->
    <bool name="config_proximityCheckOnWake">false</bool>
    <integer name="config_proximityCheckTimeout">250</integer>
</resources>
+6 −0
Original line number Diff line number Diff line
@@ -2023,4 +2023,10 @@

  <!-- External media format -->
  <java-symbol type="string" name="extmedia_format_message_cm" />

  <!-- Proximity check on screen on -->
  <java-symbol type="bool" name="config_proximityCheckOnWake" />

  <!-- Proximity check timeout -->
  <java-symbol type="integer" name="config_proximityCheckTimeout" />
</resources>
+38 −10
Original line number Diff line number Diff line
@@ -179,8 +179,7 @@ public final class PowerManagerService extends IPowerManager.Stub
    // 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 static final float PROXIMITY_NEAR_THRESHOLD = 5.0f;

    private Context mContext;
    private LightsService mLightsService;
@@ -422,7 +421,11 @@ public final class PowerManagerService extends IPowerManager.Stub
    private PerformanceManager mPerformanceManager;
    private SensorManager mSensorManager;
    private Sensor mProximitySensor;
    private boolean mProximityWake;
    private boolean mProximityWakeEnabled;
    private int mProximityTimeOut;
    private boolean mProximityWakeSupported;
    android.os.PowerManager.WakeLock mProximityWakeLock;
    SensorEventListener mProximityListener;

    public PowerManagerService() {
        synchronized (mLock) {
@@ -607,6 +610,15 @@ public final class PowerManagerService extends IPowerManager.Stub
                com.android.internal.R.bool.config_dreamsActivatedOnSleepByDefault);
        mDreamsActivatedOnDockByDefaultConfig = resources.getBoolean(
                com.android.internal.R.bool.config_dreamsActivatedOnDockByDefault);
        mProximityTimeOut = resources.getInteger(
                com.android.internal.R.integer.config_proximityCheckTimeout);
        mProximityWakeSupported = resources.getBoolean(
                com.android.internal.R.bool.config_proximityCheckOnWake);
        if (mProximityWakeSupported) {
            PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
            mProximityWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "ProximityWakeLock");
        }
    }

    private void updateSettingsLocked() {
@@ -632,7 +644,7 @@ public final class PowerManagerService extends IPowerManager.Stub
        mWakeUpWhenPluggedOrUnpluggedSetting = Settings.Global.getInt(resolver,
                Settings.Global.WAKE_WHEN_PLUGGED_OR_UNPLUGGED,
                (mWakeUpWhenPluggedOrUnpluggedConfig ? 1 : 0));
        mProximityWake = Settings.System.getInt(resolver,
        mProximityWakeEnabled = Settings.System.getInt(resolver,
                Settings.System.PROXIMITY_ON_WAKE, 0) == 1;

        final int oldScreenBrightnessSetting = mScreenBrightnessSetting;
@@ -1219,31 +1231,44 @@ public final class PowerManagerService extends IPowerManager.Stub
            // There is already a message queued;
            return;
        }
        if (mProximityWake && mProximitySensor != null) {
        if (mProximityWakeSupported && mProximityWakeEnabled && mProximitySensor != null) {
            Message msg = mHandler.obtainMessage(MSG_WAKE_UP);
            msg.obj = r;
            mHandler.sendMessageDelayed(msg, MAX_PROXIMITY_WAIT);
            mHandler.sendMessageDelayed(msg, mProximityTimeOut);
            runPostProximityCheck(r);
        } else {
            r.run();
        }
    }

    private void cleanupProximity() {
        if (mProximityWakeLock.isHeld()) {
            mProximityWakeLock.release();
        }
        if (mProximityListener != null) {
            mSensorManager.unregisterListener(mProximityListener);
            mProximityListener = null;
        }
    }

    private void runPostProximityCheck(final Runnable r) {
        if (mSensorManager == null) {
            r.run();
            return;
        }
        mSensorManager.registerListener(new SensorEventListener() {
        mProximityWakeLock.acquire();
        mProximityListener = new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                mSensorManager.unregisterListener(this);
                cleanupProximity();
                if (!mHandler.hasMessages(MSG_WAKE_UP)) {
                    Slog.w(TAG, "The proximity sensor took too long, wake event already triggered!");
                    return;
                }
                mHandler.removeMessages(MSG_WAKE_UP);
                if (event.values[0] == mProximitySensor.getMaximumRange()) {
                float distance = event.values[0];
                if (distance >= PROXIMITY_NEAR_THRESHOLD ||
                        distance >= mProximitySensor.getMaximumRange()) {
                    r.run();
                }
            }
@@ -1251,7 +1276,9 @@ public final class PowerManagerService extends IPowerManager.Stub
            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {}

        }, mProximitySensor, SensorManager.SENSOR_DELAY_FASTEST);
        };
        mSensorManager.registerListener(mProximityListener,
                mProximitySensor, SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override // Binder call
@@ -2901,6 +2928,7 @@ public final class PowerManagerService extends IPowerManager.Stub
                    checkIfBootAnimationFinished();
                    break;
                case MSG_WAKE_UP:
                    cleanupProximity();
                    ((Runnable) msg.obj).run();
                    break;
            }