Merge "Add an API to BrightnessConfiguration to enable colour sampling."

This commit is contained in:
Kenny Guy
2019-11-18 16:50:34 +00:00
committed by Android (Google) Code Review
8 changed files with 212 additions and 13 deletions

View File

@@ -2001,6 +2001,7 @@ package android.hardware.display {
method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByCategory(int);
method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByPackageName(@NonNull String);
method public android.util.Pair<float[],float[]> getCurve();
method public boolean shouldCollectColorSamples();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR;
}
@@ -2013,6 +2014,7 @@ package android.hardware.display {
method public int getMaxCorrectionsByCategory();
method public int getMaxCorrectionsByPackageName();
method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShouldCollectColorSamples(boolean);
}
public final class BrightnessCorrection implements android.os.Parcelable {

View File

@@ -1018,6 +1018,7 @@ package android.hardware.display {
method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByCategory(int);
method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByPackageName(@NonNull String);
method public android.util.Pair<float[],float[]> getCurve();
method public boolean shouldCollectColorSamples();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR;
}
@@ -1030,6 +1031,7 @@ package android.hardware.display {
method public int getMaxCorrectionsByCategory();
method public int getMaxCorrectionsByPackageName();
method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String);
method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShouldCollectColorSamples(boolean);
}
public final class BrightnessCorrection implements android.os.Parcelable {

View File

@@ -79,7 +79,8 @@ public final class BrightnessChangeEvent implements Parcelable {
/**
* Histogram counting how many times a pixel of a given value was displayed onscreen for the
* Value component of HSV if the device supports color sampling, if the device does not support
* color sampling the value will be null.
* color sampling or {@link BrightnessConfiguration#shouldCollectColorSamples()} is false the
* value will be null.
*
* The buckets of the histogram are evenly weighted, the number of buckets is device specific.
* The units are in pixels * milliseconds, with 1 pixel millisecond being 1 pixel displayed
@@ -94,7 +95,8 @@ public final class BrightnessChangeEvent implements Parcelable {
/**
* How many milliseconds of data are contained in the colorValueBuckets, if the device does
* not support color sampling the value will be 0L.
* not support color sampling or {@link BrightnessConfiguration#shouldCollectColorSamples()} is
* false the value will be 0L.
*
* {@see #colorValueBuckets}
*/

View File

@@ -49,26 +49,31 @@ public final class BrightnessConfiguration implements Parcelable {
private static final String TAG_BRIGHTNESS_POINT = "brightness-point";
private static final String TAG_BRIGHTNESS_CORRECTIONS = "brightness-corrections";
private static final String TAG_BRIGHTNESS_CORRECTION = "brightness-correction";
private static final String TAG_BRIGHTNESS_PARAMS = "brightness-params";
private static final String ATTR_LUX = "lux";
private static final String ATTR_NITS = "nits";
private static final String ATTR_DESCRIPTION = "description";
private static final String ATTR_PACKAGE_NAME = "package-name";
private static final String ATTR_CATEGORY = "category";
private static final String ATTR_COLLECT_COLOR = "collect-color";
private final float[] mLux;
private final float[] mNits;
private final Map<String, BrightnessCorrection> mCorrectionsByPackageName;
private final Map<Integer, BrightnessCorrection> mCorrectionsByCategory;
private final String mDescription;
private final boolean mShouldCollectColorSamples;
private BrightnessConfiguration(float[] lux, float[] nits,
Map<String, BrightnessCorrection> correctionsByPackageName,
Map<Integer, BrightnessCorrection> correctionsByCategory, String description) {
Map<Integer, BrightnessCorrection> correctionsByCategory, String description,
boolean shouldCollectColorSamples) {
mLux = lux;
mNits = nits;
mCorrectionsByPackageName = correctionsByPackageName;
mCorrectionsByCategory = correctionsByCategory;
mDescription = description;
mShouldCollectColorSamples = shouldCollectColorSamples;
}
/**
@@ -119,6 +124,14 @@ public final class BrightnessConfiguration implements Parcelable {
return mDescription;
}
/**
* Returns whether color samples should be collected in
* {@link BrightnessChangeEvent#colorValueBuckets}.
*/
public boolean shouldCollectColorSamples() {
return mShouldCollectColorSamples;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeFloatArray(mLux);
@@ -138,6 +151,7 @@ public final class BrightnessConfiguration implements Parcelable {
correction.writeToParcel(dest, flags);
}
dest.writeString(mDescription);
dest.writeBoolean(mShouldCollectColorSamples);
}
@Override
@@ -167,6 +181,7 @@ public final class BrightnessConfiguration implements Parcelable {
if (mDescription != null) {
sb.append(mDescription);
}
sb.append(", shouldCollectColorSamples = " + mShouldCollectColorSamples);
sb.append("'}");
return sb.toString();
}
@@ -181,6 +196,7 @@ public final class BrightnessConfiguration implements Parcelable {
if (mDescription != null) {
result = result * 31 + mDescription.hashCode();
}
result = result * 31 + Boolean.hashCode(mShouldCollectColorSamples);
return result;
}
@@ -196,7 +212,8 @@ public final class BrightnessConfiguration implements Parcelable {
return Arrays.equals(mLux, other.mLux) && Arrays.equals(mNits, other.mNits)
&& mCorrectionsByPackageName.equals(other.mCorrectionsByPackageName)
&& mCorrectionsByCategory.equals(other.mCorrectionsByCategory)
&& Objects.equals(mDescription, other.mDescription);
&& Objects.equals(mDescription, other.mDescription)
&& mShouldCollectColorSamples == other.mShouldCollectColorSamples;
}
public static final @android.annotation.NonNull Creator<BrightnessConfiguration> CREATOR =
@@ -224,6 +241,8 @@ public final class BrightnessConfiguration implements Parcelable {
final String description = in.readString();
builder.setDescription(description);
final boolean shouldCollectColorSamples = in.readBoolean();
builder.setShouldCollectColorSamples(shouldCollectColorSamples);
return builder.build();
}
@@ -252,6 +271,7 @@ public final class BrightnessConfiguration implements Parcelable {
serializer.endTag(null, TAG_BRIGHTNESS_POINT);
}
serializer.endTag(null, TAG_BRIGHTNESS_CURVE);
serializer.startTag(null, TAG_BRIGHTNESS_CORRECTIONS);
for (Map.Entry<String, BrightnessCorrection> entry :
mCorrectionsByPackageName.entrySet()) {
@@ -271,6 +291,12 @@ public final class BrightnessConfiguration implements Parcelable {
serializer.endTag(null, TAG_BRIGHTNESS_CORRECTION);
}
serializer.endTag(null, TAG_BRIGHTNESS_CORRECTIONS);
serializer.startTag(null, TAG_BRIGHTNESS_PARAMS);
if (mShouldCollectColorSamples) {
serializer.attribute(null, ATTR_COLLECT_COLOR, Boolean.toString(true));
}
serializer.endTag(null, TAG_BRIGHTNESS_PARAMS);
}
/**
@@ -293,6 +319,7 @@ public final class BrightnessConfiguration implements Parcelable {
List<Float> nitsList = new ArrayList<>();
Map<String, BrightnessCorrection> correctionsByPackageName = new HashMap<>();
Map<Integer, BrightnessCorrection> correctionsByCategory = new HashMap<>();
boolean shouldCollectColorSamples = false;
final int configDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, configDepth)) {
if (TAG_BRIGHTNESS_CURVE.equals(parser.getName())) {
@@ -307,8 +334,7 @@ public final class BrightnessConfiguration implements Parcelable {
luxList.add(lux);
nitsList.add(nits);
}
}
if (TAG_BRIGHTNESS_CORRECTIONS.equals(parser.getName())) {
} else if (TAG_BRIGHTNESS_CORRECTIONS.equals(parser.getName())) {
final int correctionsDepth = parser.getDepth();
while (XmlUtils.nextElementWithin(parser, correctionsDepth)) {
if (!TAG_BRIGHTNESS_CORRECTION.equals(parser.getName())) {
@@ -328,6 +354,9 @@ public final class BrightnessConfiguration implements Parcelable {
}
}
}
} else if (TAG_BRIGHTNESS_PARAMS.equals(parser.getName())) {
shouldCollectColorSamples =
Boolean.parseBoolean(parser.getAttributeValue(null, ATTR_COLLECT_COLOR));
}
}
final int n = luxList.size();
@@ -350,6 +379,7 @@ public final class BrightnessConfiguration implements Parcelable {
final BrightnessCorrection correction = entry.getValue();
builder.addCorrectionByCategory(category, correction);
}
builder.setShouldCollectColorSamples(shouldCollectColorSamples);
return builder.build();
}
@@ -374,6 +404,7 @@ public final class BrightnessConfiguration implements Parcelable {
private Map<String, BrightnessCorrection> mCorrectionsByPackageName;
private Map<Integer, BrightnessCorrection> mCorrectionsByCategory;
private String mDescription;
private boolean mShouldCollectColorSamples;
/**
* Constructs the builder with the control points for the brightness curve.
@@ -497,6 +528,19 @@ public final class BrightnessConfiguration implements Parcelable {
return this;
}
/**
* Control whether screen color samples should be returned in
* {@link BrightnessChangeEvent#colorValueBuckets} if supported by the device.
*
* @param shouldCollectColorSamples true if color samples should be collected.
* @return
*/
@NonNull
public Builder setShouldCollectColorSamples(boolean shouldCollectColorSamples) {
mShouldCollectColorSamples = shouldCollectColorSamples;
return this;
}
/**
* Builds the {@link BrightnessConfiguration}.
*/
@@ -506,7 +550,7 @@ public final class BrightnessConfiguration implements Parcelable {
throw new IllegalStateException("A curve must be set!");
}
return new BrightnessConfiguration(mCurveLux, mCurveNits, mCorrectionsByPackageName,
mCorrectionsByCategory, mDescription);
mCorrectionsByCategory, mDescription, mShouldCollectColorSamples);
}
private static void checkMonotonic(float[] vals, boolean strictlyIncreasing, String name) {

View File

@@ -23,13 +23,23 @@ import static org.junit.Assert.fail;
import android.os.Parcel;
import android.util.Pair;
import android.util.Xml;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.FastXmlSerializer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
@SmallTest
@@ -104,11 +114,15 @@ public class BrightnessConfigurationTest {
});
}
@Test
public void testParceledConfigIsEquivalent() {
BrightnessConfiguration.Builder builder =
new BrightnessConfiguration.Builder(LUX_LEVELS, NITS_LEVELS);
builder.setShouldCollectColorSamples(true);
builder.addCorrectionByCategory(3,
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
builder.addCorrectionByPackageName("a.package.name",
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
BrightnessConfiguration config = builder.build();
Parcel p = Parcel.obtain();
p.writeParcelable(config, 0 /*flags*/);
@@ -118,13 +132,50 @@ public class BrightnessConfigurationTest {
assertEquals(config, newConfig);
}
@Test
public void testWriteReadXml() throws IOException, XmlPullParserException {
BrightnessConfiguration.Builder builder =
new BrightnessConfiguration.Builder(LUX_LEVELS, NITS_LEVELS);
builder.setShouldCollectColorSamples(true);
builder.addCorrectionByCategory(3,
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
builder.addCorrectionByPackageName("a.package.name",
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
BrightnessConfiguration config = builder.build();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XmlSerializer out = new FastXmlSerializer();
out.setOutput(baos, StandardCharsets.UTF_8.name());
out.startDocument(null, true);
config.saveToXml(out);
out.endDocument();
baos.flush();
ByteArrayInputStream input = new ByteArrayInputStream(baos.toByteArray());
XmlPullParser parser = Xml.newPullParser();
parser.setInput(input, StandardCharsets.UTF_8.name());
BrightnessConfiguration loadedConfig = BrightnessConfiguration.loadFromXml(parser);
assertEquals(config, loadedConfig);
}
@Test
public void testEquals() {
BrightnessConfiguration.Builder builder =
new BrightnessConfiguration.Builder(LUX_LEVELS, NITS_LEVELS);
builder.setShouldCollectColorSamples(true);
builder.addCorrectionByCategory(3,
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
builder.addCorrectionByPackageName("a.package.name",
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
BrightnessConfiguration baseConfig = builder.build();
builder = new BrightnessConfiguration.Builder(LUX_LEVELS, NITS_LEVELS);
builder.setShouldCollectColorSamples(true);
builder.addCorrectionByCategory(3,
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
builder.addCorrectionByPackageName("a.package.name",
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
BrightnessConfiguration identicalConfig = builder.build();
assertEquals(baseConfig, identicalConfig);
assertEquals("hashCodes must be equal for identical configs",
@@ -133,14 +184,37 @@ public class BrightnessConfigurationTest {
float[] lux = Arrays.copyOf(LUX_LEVELS, LUX_LEVELS.length);
lux[lux.length - 1] = lux[lux.length - 1] * 2;
builder = new BrightnessConfiguration.Builder(lux, NITS_LEVELS);
builder.setShouldCollectColorSamples(true);
builder.addCorrectionByCategory(3,
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
builder.addCorrectionByPackageName("a.package.name",
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
BrightnessConfiguration luxDifferConfig = builder.build();
assertNotEquals(baseConfig, luxDifferConfig);
float[] nits = Arrays.copyOf(NITS_LEVELS, NITS_LEVELS.length);
nits[nits.length - 1] = nits[nits.length - 1] * 2;
builder = new BrightnessConfiguration.Builder(LUX_LEVELS, nits);
builder.setShouldCollectColorSamples(true);
builder.addCorrectionByCategory(3,
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
builder.addCorrectionByPackageName("a.package.name",
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
BrightnessConfiguration nitsDifferConfig = builder.build();
assertNotEquals(baseConfig, nitsDifferConfig);
builder = new BrightnessConfiguration.Builder(LUX_LEVELS, NITS_LEVELS);
builder.addCorrectionByCategory(3,
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
builder.addCorrectionByPackageName("a.package.name",
BrightnessCorrection.createScaleAndTranslateLog(1.0f, 2.0f));
BrightnessConfiguration colorCollectionDiffers = builder.build();
assertNotEquals(baseConfig, colorCollectionDiffers);
builder = new BrightnessConfiguration.Builder(LUX_LEVELS, NITS_LEVELS);
builder.setShouldCollectColorSamples(true);
BrightnessConfiguration correctionsDiffer = builder.build();
assertNotEquals(baseConfig, correctionsDiffer);
}
private static void assertArrayEquals(float[] expected, float[] actual, String name) {

View File

@@ -34,6 +34,7 @@ import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.hardware.display.AmbientBrightnessDayStats;
import android.hardware.display.BrightnessChangeEvent;
import android.hardware.display.BrightnessConfiguration;
import android.hardware.display.ColorDisplayManager;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManagerInternal;
@@ -125,6 +126,7 @@ public class BrightnessTracker {
private static final int MSG_BRIGHTNESS_CHANGED = 1;
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 SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
@@ -158,6 +160,7 @@ public class BrightnessTracker {
private boolean mColorSamplingEnabled;
private int mNoFramesToSample;
private float mFrameRate;
private BrightnessConfiguration mBrightnessConfiguration;
// End of block of members that should only be accessed on the mBgHandler thread.
private @UserIdInt int mCurrentUserId = UserHandle.USER_NULL;
@@ -202,6 +205,14 @@ public class BrightnessTracker {
mBgHandler.obtainMessage(MSG_BACKGROUND_START, (Float) initialBrightness).sendToTarget();
}
/**
* Update tracker with new brightness configuration.
*/
public void setBrightnessConfiguration(BrightnessConfiguration brightnessConfiguration) {
mBgHandler.obtainMessage(MSG_BRIGHTNESS_CONFIG_CHANGED,
brightnessConfiguration).sendToTarget();
}
private void backgroundStart(float initialBrightness) {
readEvents();
readAmbientBrightnessStats();
@@ -759,7 +770,9 @@ public class BrightnessTracker {
private void enableColorSampling() {
if (!mInjector.isBrightnessModeAutomatic(mContentResolver)
|| !mInjector.isInteractive(mContext)
|| mColorSamplingEnabled) {
|| mColorSamplingEnabled
|| mBrightnessConfiguration == null
|| !mBrightnessConfiguration.shouldCollectColorSamples()) {
return;
}
@@ -977,6 +990,18 @@ public class BrightnessTracker {
stopSensorListener();
disableColorSampling();
break;
case MSG_BRIGHTNESS_CONFIG_CHANGED:
mBrightnessConfiguration = (BrightnessConfiguration) msg.obj;
boolean shouldCollectColorSamples =
mBrightnessConfiguration != null
&& mBrightnessConfiguration.shouldCollectColorSamples();
if (shouldCollectColorSamples && !mColorSamplingEnabled) {
enableColorSampling();
} else if (!shouldCollectColorSamples && mColorSamplingEnabled) {
disableColorSampling();
}
break;
}
}
}

View File

@@ -931,6 +931,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
autoBrightnessAdjustmentChanged, mPowerRequest.policy);
}
if (mBrightnessTracker != null) {
mBrightnessTracker.setBrightnessConfiguration(mBrightnessConfiguration);
}
// Apply auto-brightness.
boolean slowChange = false;
if (brightness < 0) {

View File

@@ -37,6 +37,7 @@ import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.display.AmbientBrightnessDayStats;
import android.hardware.display.BrightnessChangeEvent;
import android.hardware.display.BrightnessConfiguration;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayedContentSample;
import android.hardware.display.DisplayedContentSamplingAttributes;
@@ -78,6 +79,7 @@ import java.util.concurrent.TimeUnit;
@RunWith(AndroidJUnit4.class)
public class BrightnessTrackerTest {
private static final float DEFAULT_INITIAL_BRIGHTNESS = 2.5f;
private static final boolean DEFAULT_COLOR_SAMPLING_ENABLED = true;
private static final float FLOAT_DELTA = 0.01f;
private BrightnessTracker mTracker;
@@ -150,6 +152,40 @@ public class BrightnessTrackerTest {
assertFalse(mInjector.mColorSamplingEnabled);
}
@Test
public void testModifyBrightnessConfiguration() {
mInjector.mInteractive = true;
// Start with tracker not listening for color samples.
startTracker(mTracker, DEFAULT_INITIAL_BRIGHTNESS, /* collectColorSamples= */ false);
assertFalse(mInjector.mColorSamplingEnabled);
// Update brightness config to enabled color sampling.
mTracker.setBrightnessConfiguration(buildBrightnessConfiguration(
/* collectColorSamples= */ true));
mInjector.waitForHandler();
assertTrue(mInjector.mColorSamplingEnabled);
// Update brightness config to disable color sampling.
mTracker.setBrightnessConfiguration(buildBrightnessConfiguration(
/* collectColorSamples= */ false));
mInjector.waitForHandler();
assertFalse(mInjector.mColorSamplingEnabled);
// Pretend screen is off, update config to turn on color sampling.
mInjector.sendScreenChange(/*screen on */ false);
mTracker.setBrightnessConfiguration(buildBrightnessConfiguration(
/* collectColorSamples= */ true));
mInjector.waitForHandler();
assertFalse(mInjector.mColorSamplingEnabled);
// Pretend screen is on.
mInjector.sendScreenChange(/*screen on */ true);
assertTrue(mInjector.mColorSamplingEnabled);
mTracker.stop();
assertFalse(mInjector.mColorSamplingEnabled);
}
@Test
public void testNoColorSampling_WrongPixelFormat() {
mInjector.mDefaultSamplingAttributes =
@@ -278,7 +314,7 @@ public class BrightnessTrackerTest {
mInjector.mSecureIntSettings.put(Settings.Secure.NIGHT_DISPLAY_ACTIVATED, 1);
mInjector.mSecureIntSettings.put(Settings.Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE, 3333);
startTracker(mTracker, initialBrightness);
startTracker(mTracker, initialBrightness, DEFAULT_COLOR_SAMPLING_ENABLED);
mInjector.mBroadcastReceiver.onReceive(InstrumentationRegistry.getContext(),
batteryChangeEvent(30, 60));
mInjector.mSensorListener.onSensorChanged(createSensorEvent(1000.0f));
@@ -311,7 +347,7 @@ public class BrightnessTrackerTest {
@Test
public void testIgnoreAutomaticBrightnessChange() {
final int initialBrightness = 30;
startTracker(mTracker, initialBrightness);
startTracker(mTracker, initialBrightness, DEFAULT_COLOR_SAMPLING_ENABLED);
mInjector.mSensorListener.onSensorChanged(createSensorEvent(1.0f));
mInjector.incrementTime(TimeUnit.SECONDS.toMillis(1));
@@ -750,11 +786,13 @@ public class BrightnessTrackerTest {
}
private void startTracker(BrightnessTracker tracker) {
startTracker(tracker, DEFAULT_INITIAL_BRIGHTNESS);
startTracker(tracker, DEFAULT_INITIAL_BRIGHTNESS, DEFAULT_COLOR_SAMPLING_ENABLED);
}
private void startTracker(BrightnessTracker tracker, float initialBrightness) {
private void startTracker(BrightnessTracker tracker, float initialBrightness,
boolean collectColorSamples) {
tracker.start(initialBrightness);
tracker.setBrightnessConfiguration(buildBrightnessConfiguration(collectColorSamples));
mInjector.waitForHandler();
}
@@ -772,6 +810,14 @@ public class BrightnessTrackerTest {
mInjector.waitForHandler();
}
private BrightnessConfiguration buildBrightnessConfiguration(boolean collectColorSamples) {
BrightnessConfiguration.Builder builder = new BrightnessConfiguration.Builder(
/* lux = */ new float[] {0f, 10f, 100f},
/* nits = */ new float[] {1f, 90f, 100f});
builder.setShouldCollectColorSamples(collectColorSamples);
return builder.build();
}
private static final class Idle implements MessageQueue.IdleHandler {
private boolean mIdle;