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

Commit b4ee475d authored by Chris Kuiper's avatar Chris Kuiper Committed by Android (Google) Code Review
Browse files

Merge "Update BrightnessTracker to use same sensor as ABC." into sc-v2-dev

parents 67f0700f 817d2df3
Loading
Loading
Loading
Loading
+31 −3
Original line number Diff line number Diff line
@@ -131,6 +131,7 @@ public class BrightnessTracker {
    private static final int MSG_STOP_SENSOR_LISTENER = 2;
    private static final int MSG_START_SENSOR_LISTENER = 3;
    private static final int MSG_BRIGHTNESS_CONFIG_CHANGED = 4;
    private static final int MSG_SENSOR_CHANGED = 5;

    private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");

@@ -158,6 +159,7 @@ public class BrightnessTracker {
    // These members should only be accessed on the mBgHandler thread.
    private BroadcastReceiver mBroadcastReceiver;
    private SensorListener mSensorListener;
    private Sensor mLightSensor;
    private SettingsObserver mSettingsObserver;
    private DisplayListener mDisplayListener;
    private boolean mSensorRegistered;
@@ -327,6 +329,14 @@ public class BrightnessTracker {
        m.sendToTarget();
    }

    /**
     * Updates the light sensor to use.
     */
    public void setLightSensor(Sensor lightSensor) {
        mBgHandler.obtainMessage(MSG_SENSOR_CHANGED, 0 /*unused*/, 0/*unused*/, lightSensor)
                .sendToTarget();
    }

    private void handleBrightnessChanged(float brightness, boolean userInitiated,
            float powerBrightnessFactor, boolean isUserSetBrightness,
            boolean isDefaultBrightnessConfig, long timestamp, String uniqueDisplayId) {
@@ -428,13 +438,28 @@ public class BrightnessTracker {
        }
    }

    private void handleSensorChanged(Sensor lightSensor) {
        if (mLightSensor != lightSensor) {
            mLightSensor = lightSensor;
            stopSensorListener();
            synchronized (mDataCollectionLock) {
                mLastSensorReadings.clear();
            }
            // Attempt to restart the sensor listener. It will check to see if it should be running
            // so there is no need to also check here.
            startSensorListener();
        }
    }

    private void startSensorListener() {
        if (!mSensorRegistered
                && mLightSensor != null
                && mAmbientBrightnessStatsTracker != null
                && mInjector.isInteractive(mContext)
                && mInjector.isBrightnessModeAutomatic(mContentResolver)) {
            mAmbientBrightnessStatsTracker.start();
            mSensorRegistered = true;
            mInjector.registerSensorListener(mContext, mSensorListener,
            mInjector.registerSensorListener(mContext, mSensorListener, mLightSensor,
                    mInjector.getBackgroundHandler());
        }
    }
@@ -736,6 +761,7 @@ public class BrightnessTracker {
        pw.println("BrightnessTracker state:");
        synchronized (mDataCollectionLock) {
            pw.println("  mStarted=" + mStarted);
            pw.println("  mLightSensor=" + mLightSensor);
            pw.println("  mLastBatteryLevel=" + mLastBatteryLevel);
            pw.println("  mLastBrightness=" + mLastBrightness);
            pw.println("  mLastSensorReadings.size=" + mLastSensorReadings.size());
@@ -1017,6 +1043,9 @@ public class BrightnessTracker {
                        disableColorSampling();
                    }
                    break;
                case MSG_SENSOR_CHANGED:
                    handleSensorChanged((Sensor) msg.obj);
                    break;

            }
        }
@@ -1045,9 +1074,8 @@ public class BrightnessTracker {
    @VisibleForTesting
    static class Injector {
        public void registerSensorListener(Context context,
                SensorEventListener sensorListener, Handler handler) {
                SensorEventListener sensorListener, Sensor lightSensor, Handler handler) {
            SensorManager sensorManager = context.getSystemService(SensorManager.class);
            Sensor lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
            sensorManager.registerListener(sensorListener,
                    lightSensor, SensorManager.SENSOR_DELAY_NORMAL, handler);
        }
+3 −1
Original line number Diff line number Diff line
@@ -795,7 +795,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
    private void loadFromDisplayDeviceConfig(IBinder token, DisplayDeviceInfo info) {
        // All properties that depend on the associated DisplayDevice and the DDC must be
        // updated here.
        loadAmbientLightSensor();
        loadBrightnessRampRates();
        loadProximitySensor();
        loadNitsRange(mContext.getResources());
@@ -925,6 +924,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
            }

            loadAmbientLightSensor();
            if (mBrightnessTracker != null) {
                mBrightnessTracker.setLightSensor(mLightSensor);
            }

            if (mAutomaticBrightnessController != null) {
                mAutomaticBrightnessController.stop();
+55 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ParceledListSlice;
import android.database.ContentObserver;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.display.AmbientBrightnessDayStats;
@@ -42,6 +43,7 @@ import android.hardware.display.ColorDisplayManager;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayedContentSample;
import android.hardware.display.DisplayedContentSamplingAttributes;
import android.hardware.input.InputSensorInfo;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.HandlerThread;
@@ -63,6 +65,8 @@ import com.android.internal.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@@ -84,8 +88,11 @@ public class BrightnessTrackerTest {
    private static final String DEFAULT_DISPLAY_ID = "123";
    private static final float FLOAT_DELTA = 0.01f;

    @Mock private InputSensorInfo mInputSensorInfoMock;

    private BrightnessTracker mTracker;
    private TestInjector mInjector;
    private Sensor mLightSensorFake;

    private static Object sHandlerLock = new Object();
    private static Handler sHandler;
@@ -108,9 +115,12 @@ public class BrightnessTrackerTest {

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        mInjector = new TestInjector(ensureHandler());
        mLightSensorFake = new Sensor(mInputSensorInfoMock);

        mTracker = new BrightnessTracker(InstrumentationRegistry.getContext(), mInjector);
        mTracker.setLightSensor(mLightSensorFake);
        mDefaultNightModeColorTemperature =
                InstrumentationRegistry.getContext().getResources().getInteger(
                R.integer.config_nightDisplayColorTemperatureDefault);
@@ -834,6 +844,47 @@ public class BrightnessTrackerTest {
        mTracker.stop();
    }

    @Test
    public void testLightSensorChange() {
        // verify the tracker started correctly and a listener registered
        startTracker(mTracker);
        assertNotNull(mInjector.mSensorListener);
        assertEquals(mInjector.mLightSensor, mLightSensorFake);

        // Setting the sensor to null should stop the registered listener.
        mTracker.setLightSensor(null);
        mInjector.waitForHandler();
        assertNull(mInjector.mSensorListener);
        assertNull(mInjector.mLightSensor);

        // Resetting sensor should start listener again
        mTracker.setLightSensor(mLightSensorFake);
        mInjector.waitForHandler();
        assertNotNull(mInjector.mSensorListener);
        assertEquals(mInjector.mLightSensor, mLightSensorFake);

        Sensor secondSensor = new Sensor(mInputSensorInfoMock);
        // Setting a different listener should keep things working
        mTracker.setLightSensor(secondSensor);
        mInjector.waitForHandler();
        assertNotNull(mInjector.mSensorListener);
        assertEquals(mInjector.mLightSensor, secondSensor);
    }

    @Test
    public void testSetLightSensorDoesntStartListener() {
        mTracker.setLightSensor(mLightSensorFake);
        assertNull(mInjector.mSensorListener);
    }

    @Test
    public void testNullLightSensorWontRegister() {
        mTracker.setLightSensor(null);
        startTracker(mTracker);
        assertNull(mInjector.mSensorListener);
        assertNull(mInjector.mLightSensor);
    }

    private InputStream getInputStream(String data) {
        return new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
    }
@@ -924,6 +975,7 @@ public class BrightnessTrackerTest {

    private class TestInjector extends BrightnessTracker.Injector {
        SensorEventListener mSensorListener;
        Sensor mLightSensor;
        BroadcastReceiver mBroadcastReceiver;
        DisplayManager.DisplayListener mDisplayListener;
        Map<String, Integer> mSecureIntSettings = new HashMap<>();
@@ -974,14 +1026,16 @@ public class BrightnessTrackerTest {

        @Override
        public void registerSensorListener(Context context,
                SensorEventListener sensorListener, Handler handler) {
                SensorEventListener sensorListener, Sensor lightSensor, Handler handler) {
            mSensorListener = sensorListener;
            mLightSensor = lightSensor;
        }

        @Override
        public void unregisterSensorListener(Context context,
                SensorEventListener sensorListener) {
            mSensorListener = null;
            mLightSensor = null;
        }

        @Override