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

Commit 0b08abe1 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change I9521cf8b into eclair

* changes:
  Register for light sensor events if non-hardware based auto-brightnees is enabled
parents f55aa972 8738e0c0
Loading
Loading
Loading
Loading
+95 −43
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ import java.util.Observable;
import java.util.Observer;

class PowerManagerService extends IPowerManager.Stub
        implements LocalPowerManager, Watchdog.Monitor, SensorEventListener {
        implements LocalPowerManager, Watchdog.Monitor {

    private static final String TAG = "PowerManagerService";
    static final String PARTIAL_NAME = "PowerManagerService";
@@ -190,6 +190,9 @@ class PowerManagerService extends IPowerManager.Stub
    private BatteryService mBatteryService;
    private SensorManager mSensorManager;
    private Sensor mProximitySensor;
    private Sensor mLightSensor;
    private boolean mLightSensorEnabled;
    private float mLightSensorValue = -1;
    private boolean mDimScreen = true;
    private long mNextTimeout;
    private volatile int mPokey = 0;
@@ -210,6 +213,7 @@ class PowerManagerService extends IPowerManager.Stub

    // could be either static or controllable at runtime
    private static final boolean mSpew = false;
    private static final boolean mDebugLightSensor = false;

    /*
    static PrintStream mLog;
@@ -1171,7 +1175,7 @@ class PowerManagerService extends IPowerManager.Stub

                // Finally, set the flag that prevents the screen from turning on.
                // (Below, in setPowerState(), we'll check mPreventScreenOn and
                // we *won't* call Power.setScreenState(true) if it's set.)
                // we *won't* call setScreenStateLocked(true) if it's set.)
                mPreventScreenOn = true;
            } else {
                // (Re)enable the screen.
@@ -1189,9 +1193,9 @@ class PowerManagerService extends IPowerManager.Stub
                        Log.d(TAG,
                              "preventScreenOn: turning on after a prior preventScreenOn(true)!");
                    }
                    int err = Power.setScreenState(true);
                    int err = setScreenStateLocked(true);
                    if (err != 0) {
                        Log.w(TAG, "preventScreenOn: error from Power.setScreenState(): " + err);
                        Log.w(TAG, "preventScreenOn: error from setScreenStateLocked(): " + err);
                    }
                }

@@ -1246,6 +1250,14 @@ class PowerManagerService extends IPowerManager.Stub
            }
        };

    private int setScreenStateLocked(boolean on) {
        int err = Power.setScreenState(on);
        if (err == 0) {
            enableLightSensor(on && mAutoBrightessEnabled);
        }
        return err;
    }

    private void setPowerState(int state)
    {
        setPowerState(state, false, false);
@@ -1334,7 +1346,7 @@ class PowerManagerService extends IPowerManager.Stub
                        reallyTurnScreenOn = false;
                    }
                    if (reallyTurnScreenOn) {
                        err = Power.setScreenState(true);
                        err = setScreenStateLocked(true);
                        long identity = Binder.clearCallingIdentity();
                        try {
                            mBatteryStats.noteScreenBrightness(
@@ -1346,7 +1358,7 @@ class PowerManagerService extends IPowerManager.Stub
                            Binder.restoreCallingIdentity(identity);
                        }
                    } else {
                        Power.setScreenState(false);
                        setScreenStateLocked(false);
                        // But continue as if we really did turn the screen on...
                        err = 0;
                    }
@@ -1391,7 +1403,7 @@ class PowerManagerService extends IPowerManager.Stub
        EventLog.writeEvent(LOG_POWER_SCREEN_STATE, 0, becauseOfUser ? 1 : 0,
                mTotalTouchDownTime, mTouchCycles);
        mLastTouchDown = 0;
        int err = Power.setScreenState(false);
        int err = setScreenStateLocked(false);
        if (mScreenOnStartTime != 0) {
            mScreenOnTime += SystemClock.elapsedRealtime() - mScreenOnStartTime;
            mScreenOnStartTime = 0;
@@ -1809,6 +1821,14 @@ class PowerManagerService extends IPowerManager.Stub
        }
    }

    private void lightSensorChangedLocked(float value) {
        if (mDebugLightSensor) {
            Log.d(TAG, "lightSensorChangedLocked " + value);
        }
        mLightSensorValue = value;
        // more to do here
    }

    /**
     * The user requested that we go to sleep (probably with the power button).
     * This overrides all wake locks that are held.
@@ -1900,7 +1920,7 @@ class PowerManagerService extends IPowerManager.Stub
            mHardware.setAutoBrightness_UNCHECKED(mAutoBrightessEnabled);
            setBacklightBrightness((int)mScreenBrightness.curValue);
        } else {
            // not yet implemented
            enableLightSensor(screenIsOn() && mAutoBrightessEnabled);
        }
    }

@@ -2050,6 +2070,14 @@ class PowerManagerService extends IPowerManager.Stub
    }
    
    void systemReady() {
        mSensorManager = new SensorManager(mHandlerThread.getLooper());
        mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        // don't bother with the light sensor if auto brightness is handled in hardware
        if (!mHasHardwareAutoBrightness) {
            mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
            enableLightSensor(mAutoBrightessEnabled);
        }

        synchronized (mLocks) {
            Log.d(TAG, "system ready!");
            mDoneBooting = true;
@@ -2077,8 +2105,6 @@ class PowerManagerService extends IPowerManager.Stub
                   | PowerManager.FULL_WAKE_LOCK
                   | PowerManager.SCREEN_DIM_WAKE_LOCK;

        // call getSensorManager() to make sure mProximitySensor is initialized
        getSensorManager();
        if (mProximitySensor != null) {
            result |= PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK;
        }
@@ -2117,26 +2143,19 @@ class PowerManagerService extends IPowerManager.Stub
        }
    }

    private SensorManager getSensorManager() {
        if (mSensorManager == null) {
            mSensorManager = new SensorManager(mHandlerThread.getLooper());
            mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
        }
        return mSensorManager;
    }

    private void enableProximityLockLocked() {
        if (mSpew) {
            Log.d(TAG, "enableProximityLockLocked");
        }
        mSensorManager.registerListener(this, mProximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(mProximityListener, mProximitySensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    private void disableProximityLockLocked() {
        if (mSpew) {
            Log.d(TAG, "disableProximityLockLocked");
        }
        mSensorManager.unregisterListener(this);
        mSensorManager.unregisterListener(mProximityListener);
        synchronized (mLocks) {
            if (mProximitySensorActive) {
                mProximitySensorActive = false;
@@ -2145,6 +2164,22 @@ class PowerManagerService extends IPowerManager.Stub
        }
    }

    private void enableLightSensor(boolean enable) {
        if (mDebugLightSensor) {
            Log.d(TAG, "enableLightSensor " + enable);
        }
        if (mSensorManager != null && mLightSensorEnabled != enable) {
            mLightSensorEnabled = enable;
            if (enable) {
                mSensorManager.registerListener(mLightListener, mLightSensor,
                        SensorManager.SENSOR_DELAY_NORMAL);
            } else {
                mSensorManager.unregisterListener(mLightListener);
            }
        }
    }

    SensorEventListener mProximityListener = new SensorEventListener() {
        public void onSensorChanged(SensorEvent event) {
            long milliseconds = event.timestamp / 1000000;
            synchronized (mLocks) {
@@ -2173,4 +2208,21 @@ class PowerManagerService extends IPowerManager.Stub
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // ignore
        }
    };

    SensorEventListener mLightListener = new SensorEventListener() {
        public void onSensorChanged(SensorEvent event) {
            synchronized (mLocks) {
                int value = (int)event.values[0];
                if (mDebugLightSensor) {
                    Log.d(TAG, "onSensorChanged: light value: " + value);
                }
                lightSensorChangedLocked(value);
            }
        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // ignore
        }
    };
}