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

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

Merge changes from topic "better-autobrightness-in-qpr3" into sc-v2-dev-plus-aosp

* changes:
  [automerge] Update BrightnessTracker to use same sensor as ABC. 2p: 817d2df3
  Update BrightnessTracker to use same sensor as ABC.
parents a1569f82 5f186723
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