Merge "Tag brightness APIs with @SystemAPI"
diff --git a/api/system-current.txt b/api/system-current.txt
index b47304a..2aca795 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -33,6 +33,7 @@
field public static final java.lang.String BIND_TV_REMOTE_SERVICE = "android.permission.BIND_TV_REMOTE_SERVICE";
field public static final java.lang.String BLUETOOTH_PRIVILEGED = "android.permission.BLUETOOTH_PRIVILEGED";
field public static final java.lang.String BRICK = "android.permission.BRICK";
+ field public static final java.lang.String BRIGHTNESS_SLIDER_USAGE = "android.permission.BRIGHTNESS_SLIDER_USAGE";
field public static final deprecated java.lang.String BROADCAST_NETWORK_PRIVILEGED = "android.permission.BROADCAST_NETWORK_PRIVILEGED";
field public static final java.lang.String CALL_PRIVILEGED = "android.permission.CALL_PRIVILEGED";
field public static final java.lang.String CAMERA_DISABLE_TRANSMIT_LED = "android.permission.CAMERA_DISABLE_TRANSMIT_LED";
@@ -46,6 +47,7 @@
field public static final java.lang.String CHANGE_CONFIGURATION = "android.permission.CHANGE_CONFIGURATION";
field public static final java.lang.String CHANGE_DEVICE_IDLE_TEMP_WHITELIST = "android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST";
field public static final java.lang.String CLEAR_APP_USER_DATA = "android.permission.CLEAR_APP_USER_DATA";
+ field public static final java.lang.String CONFIGURE_DISPLAY_BRIGHTNESS = "android.permission.CONFIGURE_DISPLAY_BRIGHTNESS";
field public static final java.lang.String CONNECTIVITY_INTERNAL = "android.permission.CONNECTIVITY_INTERNAL";
field public static final java.lang.String CONNECTIVITY_USE_RESTRICTED_NETWORKS = "android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS";
field public static final java.lang.String CONTROL_INCALL_EXPERIENCE = "android.permission.CONTROL_INCALL_EXPERIENCE";
@@ -1092,8 +1094,38 @@
package android.hardware.display {
+ public final class BrightnessChangeEvent implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessChangeEvent> CREATOR;
+ field public final float batteryLevel;
+ field public final float brightness;
+ field public final int colorTemperature;
+ field public final float lastBrightness;
+ field public final long[] luxTimestamps;
+ field public final float[] luxValues;
+ field public final boolean nightMode;
+ field public final java.lang.String packageName;
+ field public final long timeStamp;
+ }
+
+ public final class BrightnessConfiguration implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.util.Pair<float[], float[]> getCurve();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR;
+ }
+
+ public static class BrightnessConfiguration.Builder {
+ ctor public BrightnessConfiguration.Builder();
+ method public android.hardware.display.BrightnessConfiguration build();
+ method public android.hardware.display.BrightnessConfiguration.Builder setCurve(float[], float[]);
+ }
+
public final class DisplayManager {
+ method public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
method public android.graphics.Point getStableDisplaySize();
+ method public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
}
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 6ad4f5a..6941731 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -295,6 +295,43 @@
}
+package android.hardware.display {
+
+ public final class BrightnessChangeEvent implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessChangeEvent> CREATOR;
+ field public final float batteryLevel;
+ field public final float brightness;
+ field public final int colorTemperature;
+ field public final float lastBrightness;
+ field public final long[] luxTimestamps;
+ field public final float[] luxValues;
+ field public final boolean nightMode;
+ field public final java.lang.String packageName;
+ field public final long timeStamp;
+ }
+
+ public final class BrightnessConfiguration implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.util.Pair<float[], float[]> getCurve();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR;
+ }
+
+ public static class BrightnessConfiguration.Builder {
+ ctor public BrightnessConfiguration.Builder();
+ method public android.hardware.display.BrightnessConfiguration build();
+ method public android.hardware.display.BrightnessConfiguration.Builder setCurve(float[], float[]);
+ }
+
+ public final class DisplayManager {
+ method public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents();
+ method public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration);
+ }
+
+}
+
package android.location {
public final class GnssClock implements android.os.Parcelable {
diff --git a/core/java/android/hardware/display/BrightnessChangeEvent.java b/core/java/android/hardware/display/BrightnessChangeEvent.java
index 0a08353..2301824 100644
--- a/core/java/android/hardware/display/BrightnessChangeEvent.java
+++ b/core/java/android/hardware/display/BrightnessChangeEvent.java
@@ -16,6 +16,8 @@
package android.hardware.display;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -23,51 +25,65 @@
* Data about a brightness settings change.
*
* {@see DisplayManager.getBrightnessEvents()}
- * TODO make this SystemAPI
* @hide
*/
+@SystemApi
+@TestApi
public final class BrightnessChangeEvent implements Parcelable {
/** Brightness in nits */
- public float brightness;
+ public final float brightness;
/** Timestamp of the change {@see System.currentTimeMillis()} */
- public long timeStamp;
+ public final long timeStamp;
/** Package name of focused activity when brightness was changed.
* This will be null if the caller of {@see DisplayManager.getBrightnessEvents()}
* does not have access to usage stats {@see UsageStatsManager} */
- public String packageName;
+ public final String packageName;
/** User id of of the user running when brightness was changed.
* @hide */
- public int userId;
+ public final int userId;
/** Lux values of recent sensor data */
- public float[] luxValues;
+ public final float[] luxValues;
/** Timestamps of the lux sensor readings {@see System.currentTimeMillis()} */
- public long[] luxTimestamps;
+ public final long[] luxTimestamps;
/** Most recent battery level when brightness was changed or Float.NaN */
- public float batteryLevel;
+ public final float batteryLevel;
/** Color filter active to provide night mode */
- public boolean nightMode;
+ public final boolean nightMode;
/** If night mode color filter is active this will be the temperature in kelvin */
- public int colorTemperature;
+ public final int colorTemperature;
- /** Brightness level before slider adjustment */
- public float lastBrightness;
+ /** Brightness le vel before slider adjustment */
+ public final float lastBrightness;
- public BrightnessChangeEvent() {
+ /** @hide */
+ private BrightnessChangeEvent(float brightness, long timeStamp, String packageName,
+ int userId, float[] luxValues, long[] luxTimestamps, float batteryLevel,
+ boolean nightMode, int colorTemperature, float lastBrightness) {
+ this.brightness = brightness;
+ this.timeStamp = timeStamp;
+ this.packageName = packageName;
+ this.userId = userId;
+ this.luxValues = luxValues;
+ this.luxTimestamps = luxTimestamps;
+ this.batteryLevel = batteryLevel;
+ this.nightMode = nightMode;
+ this.colorTemperature = colorTemperature;
+ this.lastBrightness = lastBrightness;
}
/** @hide */
- public BrightnessChangeEvent(BrightnessChangeEvent other) {
+ public BrightnessChangeEvent(BrightnessChangeEvent other, boolean redactPackage) {
this.brightness = other.brightness;
this.timeStamp = other.timeStamp;
- this.packageName = other.packageName;
+ this.packageName = redactPackage ? null : other.packageName;
this.userId = other.userId;
this.luxValues = other.luxValues;
this.luxTimestamps = other.luxTimestamps;
@@ -118,4 +134,85 @@
dest.writeInt(colorTemperature);
dest.writeFloat(lastBrightness);
}
+
+ /** @hide */
+ public static class Builder {
+ private float mBrightness;
+ private long mTimeStamp;
+ private String mPackageName;
+ private int mUserId;
+ private float[] mLuxValues;
+ private long[] mLuxTimestamps;
+ private float mBatteryLevel;
+ private boolean mNightMode;
+ private int mColorTemperature;
+ private float mLastBrightness;
+
+ /** {@see BrightnessChangeEvent#brightness} */
+ public Builder setBrightness(float brightness) {
+ mBrightness = brightness;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#timeStamp} */
+ public Builder setTimeStamp(long timeStamp) {
+ mTimeStamp = timeStamp;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#packageName} */
+ public Builder setPackageName(String packageName) {
+ mPackageName = packageName;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#userId} */
+ public Builder setUserId(int userId) {
+ mUserId = userId;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#luxValues} */
+ public Builder setLuxValues(float[] luxValues) {
+ mLuxValues = luxValues;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#luxTimestamps} */
+ public Builder setLuxTimestamps(long[] luxTimestamps) {
+ mLuxTimestamps = luxTimestamps;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#batteryLevel} */
+ public Builder setBatteryLevel(float batteryLevel) {
+ mBatteryLevel = batteryLevel;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#nightMode} */
+ public Builder setNightMode(boolean nightMode) {
+ mNightMode = nightMode;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#colorTemperature} */
+ public Builder setColorTemperature(int colorTemperature) {
+ mColorTemperature = colorTemperature;
+ return this;
+ }
+
+ /** {@see BrightnessChangeEvent#lastBrightness} */
+ public Builder setLastBrightness(float lastBrightness) {
+ mLastBrightness = lastBrightness;
+ return this;
+ }
+
+ /** Builds a BrightnessChangeEvent */
+ public BrightnessChangeEvent build() {
+ return new BrightnessChangeEvent(mBrightness, mTimeStamp,
+ mPackageName, mUserId, mLuxValues, mLuxTimestamps, mBatteryLevel,
+ mNightMode, mColorTemperature, mLastBrightness);
+ }
+ }
}
diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java
index 6c3be81..2156491 100644
--- a/core/java/android/hardware/display/BrightnessConfiguration.java
+++ b/core/java/android/hardware/display/BrightnessConfiguration.java
@@ -16,6 +16,8 @@
package android.hardware.display;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Pair;
@@ -25,6 +27,8 @@
import java.util.Arrays;
/** @hide */
+@SystemApi
+@TestApi
public final class BrightnessConfiguration implements Parcelable {
private final float[] mLux;
private final float[] mNits;
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 97e9b9c..76ab35d 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -22,6 +22,7 @@
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.app.KeyguardManager;
import android.content.Context;
import android.graphics.Point;
@@ -622,6 +623,8 @@
* Fetch {@link BrightnessChangeEvent}s.
* @hide until we make it a system api.
*/
+ @SystemApi
+ @TestApi
@RequiresPermission(Manifest.permission.BRIGHTNESS_SLIDER_USAGE)
public List<BrightnessChangeEvent> getBrightnessEvents() {
return mGlobal.getBrightnessEvents(mContext.getOpPackageName());
@@ -632,6 +635,9 @@
*
* @hide
*/
+ @SystemApi
+ @TestApi
+ @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS)
public void setBrightnessConfiguration(BrightnessConfiguration c) {
setBrightnessConfigurationForUser(c, UserHandle.myUserId());
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index f0cf5b8..a3e8f1e 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2953,13 +2953,14 @@
<!-- Allows an application to collect usage infomation about brightness slider changes.
<p>Not for use by third-party applications.</p>
- TODO: make a System API
- @hide -->
+ @hide
+ @SystemApi -->
<permission android:name="android.permission.BRIGHTNESS_SLIDER_USAGE"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged|development" />
<!-- Allows an application to modify the display brightness configuration
- @hide -->
+ @hide
+ @SystemApi -->
<permission android:name="android.permission.CONFIGURE_DISPLAY_BRIGHTNESS"
android:protectionLevel="signature|privileged|development" />
diff --git a/services/core/java/com/android/server/display/BrightnessTracker.java b/services/core/java/com/android/server/display/BrightnessTracker.java
index cbb1c01..1e94e00 100644
--- a/services/core/java/com/android/server/display/BrightnessTracker.java
+++ b/services/core/java/com/android/server/display/BrightnessTracker.java
@@ -149,7 +149,7 @@
/**
* Start listening for brightness slider events
*
- * @param brightness the initial screen brightness
+ * @param initialBrightness the initial screen brightness
*/
public void start(float initialBrightness) {
if (DEBUG) {
@@ -219,8 +219,8 @@
if (includePackage) {
out.add(events[i]);
} else {
- BrightnessChangeEvent event = new BrightnessChangeEvent((events[i]));
- event.packageName = null;
+ BrightnessChangeEvent event = new BrightnessChangeEvent((events[i]),
+ /* redactPackage */ true);
out.add(event);
}
}
@@ -246,7 +246,8 @@
}
private void handleBrightnessChanged(float brightness, boolean userInitiated) {
- final BrightnessChangeEvent event;
+ BrightnessChangeEvent.Builder builder;
+
synchronized (mDataCollectionLock) {
if (!mStarted) {
// Not currently gathering brightness change information
@@ -263,9 +264,9 @@
return;
}
-
- event = new BrightnessChangeEvent();
- event.timeStamp = mInjector.currentTimeMillis();
+ builder = new BrightnessChangeEvent.Builder();
+ builder.setBrightness(brightness);
+ builder.setTimeStamp(mInjector.currentTimeMillis());
final int readingCount = mLastSensorReadings.size();
if (readingCount == 0) {
@@ -273,8 +274,8 @@
return;
}
- event.luxValues = new float[readingCount];
- event.luxTimestamps = new long[readingCount];
+ float[] luxValues = new float[readingCount];
+ long[] luxTimestamps = new long[readingCount];
int pos = 0;
@@ -282,33 +283,35 @@
long currentTimeMillis = mInjector.currentTimeMillis();
long elapsedTimeNanos = mInjector.elapsedRealtimeNanos();
for (LightData reading : mLastSensorReadings) {
- event.luxValues[pos] = reading.lux;
- event.luxTimestamps[pos] = currentTimeMillis -
+ luxValues[pos] = reading.lux;
+ luxTimestamps[pos] = currentTimeMillis -
TimeUnit.NANOSECONDS.toMillis(elapsedTimeNanos - reading.timestamp);
++pos;
}
+ builder.setLuxValues(luxValues);
+ builder.setLuxTimestamps(luxTimestamps);
- event.batteryLevel = mLastBatteryLevel;
- event.lastBrightness = previousBrightness;
+ builder.setBatteryLevel(mLastBatteryLevel);
+ builder.setLastBrightness(previousBrightness);
}
- event.brightness = brightness;
-
try {
final ActivityManager.StackInfo focusedStack = mInjector.getFocusedStack();
- event.userId = focusedStack.userId;
- event.packageName = focusedStack.topActivity.getPackageName();
+ builder.setUserId(focusedStack.userId);
+ builder.setPackageName(focusedStack.topActivity.getPackageName());
} catch (RemoteException e) {
// Really shouldn't be possible.
+ return;
}
- event.nightMode = mInjector.getSecureIntForUser(mContentResolver,
+ builder.setNightMode(mInjector.getSecureIntForUser(mContentResolver,
Settings.Secure.NIGHT_DISPLAY_ACTIVATED, 0, UserHandle.USER_CURRENT)
- == 1;
- event.colorTemperature = mInjector.getSecureIntForUser(mContentResolver,
+ == 1);
+ builder.setColorTemperature(mInjector.getSecureIntForUser(mContentResolver,
Settings.Secure.NIGHT_DISPLAY_COLOR_TEMPERATURE,
- 0, UserHandle.USER_CURRENT);
+ 0, UserHandle.USER_CURRENT));
+ BrightnessChangeEvent event = builder.build();
if (DEBUG) {
Slog.d(TAG, "Event " + event.brightness + " " + event.packageName);
}
@@ -457,40 +460,43 @@
}
tag = parser.getName();
if (TAG_EVENT.equals(tag)) {
- BrightnessChangeEvent event = new BrightnessChangeEvent();
+ BrightnessChangeEvent.Builder builder = new BrightnessChangeEvent.Builder();
String brightness = parser.getAttributeValue(null, ATTR_NITS);
- event.brightness = Float.parseFloat(brightness);
+ builder.setBrightness(Float.parseFloat(brightness));
String timestamp = parser.getAttributeValue(null, ATTR_TIMESTAMP);
- event.timeStamp = Long.parseLong(timestamp);
- event.packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
+ builder.setTimeStamp(Long.parseLong(timestamp));
+ builder.setPackageName(parser.getAttributeValue(null, ATTR_PACKAGE_NAME));
String user = parser.getAttributeValue(null, ATTR_USER);
- event.userId = mInjector.getUserId(mUserManager, Integer.parseInt(user));
+ builder.setUserId(mInjector.getUserId(mUserManager, Integer.parseInt(user)));
String batteryLevel = parser.getAttributeValue(null, ATTR_BATTERY_LEVEL);
- event.batteryLevel = Float.parseFloat(batteryLevel);
+ builder.setBatteryLevel(Float.parseFloat(batteryLevel));
String nightMode = parser.getAttributeValue(null, ATTR_NIGHT_MODE);
- event.nightMode = Boolean.parseBoolean(nightMode);
+ builder.setNightMode(Boolean.parseBoolean(nightMode));
String colorTemperature =
parser.getAttributeValue(null, ATTR_COLOR_TEMPERATURE);
- event.colorTemperature = Integer.parseInt(colorTemperature);
+ builder.setColorTemperature(Integer.parseInt(colorTemperature));
String lastBrightness = parser.getAttributeValue(null, ATTR_LAST_NITS);
- event.lastBrightness = Float.parseFloat(lastBrightness);
+ builder.setLastBrightness(Float.parseFloat(lastBrightness));
String luxValue = parser.getAttributeValue(null, ATTR_LUX);
String luxTimestamp = parser.getAttributeValue(null, ATTR_LUX_TIMESTAMPS);
- String[] luxValues = luxValue.split(",");
- String[] luxTimestamps = luxTimestamp.split(",");
- if (luxValues.length != luxTimestamps.length) {
+ String[] luxValuesStrings = luxValue.split(",");
+ String[] luxTimestampsStrings = luxTimestamp.split(",");
+ if (luxValuesStrings.length != luxTimestampsStrings.length) {
continue;
}
- event.luxValues = new float[luxValues.length];
- event.luxTimestamps = new long[luxValues.length];
+ float[] luxValues = new float[luxValuesStrings.length];
+ long[] luxTimestamps = new long[luxValuesStrings.length];
for (int i = 0; i < luxValues.length; ++i) {
- event.luxValues[i] = Float.parseFloat(luxValues[i]);
- event.luxTimestamps[i] = Long.parseLong(luxTimestamps[i]);
+ luxValues[i] = Float.parseFloat(luxValuesStrings[i]);
+ luxTimestamps[i] = Long.parseLong(luxTimestampsStrings[i]);
}
+ builder.setLuxValues(luxValues);
+ builder.setLuxTimestamps(luxTimestamps);
+ BrightnessChangeEvent event = builder.build();
if (DEBUG) {
Slog.i(TAG, "Read event " + event.brightness
+ " " + event.packageName);
diff --git a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
index 08edd52..edc7d74 100644
--- a/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/display/BrightnessTrackerTest.java
@@ -447,21 +447,24 @@
@Test
public void testParcelUnParcel() {
Parcel parcel = Parcel.obtain();
- BrightnessChangeEvent event = new BrightnessChangeEvent();
- event.brightness = 23f;
- event.timeStamp = 345L;
- event.packageName = "com.example";
- event.userId = 12;
- event.luxValues = new float[2];
- event.luxValues[0] = 3000.0f;
- event.luxValues[1] = 4000.0f;
- event.luxTimestamps = new long[2];
- event.luxTimestamps[0] = 325L;
- event.luxTimestamps[1] = 315L;
- event.batteryLevel = 0.7f;
- event.nightMode = false;
- event.colorTemperature = 345;
- event.lastBrightness = 50f;
+ BrightnessChangeEvent.Builder builder = new BrightnessChangeEvent.Builder();
+ builder.setBrightness(23f);
+ builder.setTimeStamp(345L);
+ builder.setPackageName("com.example");
+ builder.setUserId(12);
+ float[] luxValues = new float[2];
+ luxValues[0] = 3000.0f;
+ luxValues[1] = 4000.0f;
+ builder.setLuxValues(luxValues);
+ long[] luxTimestamps = new long[2];
+ luxTimestamps[0] = 325L;
+ luxTimestamps[1] = 315L;
+ builder.setLuxTimestamps(luxTimestamps);
+ builder.setBatteryLevel(0.7f);
+ builder.setNightMode(false);
+ builder.setColorTemperature(345);
+ builder.setLastBrightness(50f);
+ BrightnessChangeEvent event = builder.build();
event.writeToParcel(parcel, 0);
byte[] parceled = parcel.marshall();
@@ -485,7 +488,8 @@
assertEquals(event.lastBrightness, event2.lastBrightness, FLOAT_DELTA);
parcel = Parcel.obtain();
- event.batteryLevel = Float.NaN;
+ builder.setBatteryLevel(Float.NaN);
+ event = builder.build();
event.writeToParcel(parcel, 0);
parceled = parcel.marshall();
parcel.recycle();