Merge "Doze: Refactor v1"
diff --git a/api/current.txt b/api/current.txt
index 2e99eaf..22871fa 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11800,14 +11800,14 @@
method public deprecated boolean clipRegion(android.graphics.Region);
method public void concat(android.graphics.Matrix);
method public void drawARGB(int, int, int, int);
- method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
+ method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
method public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
method public void drawCircle(float, float, float, android.graphics.Paint);
method public void drawColor(int);
@@ -11815,28 +11815,28 @@
method public void drawLine(float, float, float, float, android.graphics.Paint);
method public void drawLines(float[], int, int, android.graphics.Paint);
method public void drawLines(float[], android.graphics.Paint);
- method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawOval(android.graphics.RectF, android.graphics.Paint);
+ method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawPaint(android.graphics.Paint);
method public void drawPath(android.graphics.Path, android.graphics.Paint);
method public void drawPicture(android.graphics.Picture);
- method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPicture(android.graphics.Picture, android.graphics.RectF);
+ method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPoint(float, float, android.graphics.Paint);
method public void drawPoints(float[], int, int, android.graphics.Paint);
method public void drawPoints(float[], android.graphics.Paint);
method public deprecated void drawPosText(char[], int, int, float[], android.graphics.Paint);
method public deprecated void drawPosText(java.lang.String, float[], android.graphics.Paint);
method public void drawRGB(int, int, int);
- method public void drawRect(float, float, float, float, android.graphics.Paint);
- method public void drawRect(android.graphics.Rect, android.graphics.Paint);
method public void drawRect(android.graphics.RectF, android.graphics.Paint);
- method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
+ method public void drawRect(android.graphics.Rect, android.graphics.Paint);
+ method public void drawRect(float, float, float, float, android.graphics.Paint);
method public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
+ method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
method public void drawText(char[], int, int, float, float, android.graphics.Paint);
- method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
+ method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
@@ -32103,6 +32103,15 @@
field public static final java.lang.String MIME_TYPE_DIR = "vnd.android.document/directory";
}
+ public static final class DocumentsContract.Path implements android.os.Parcelable {
+ ctor public DocumentsContract.Path(java.lang.String, java.util.List<java.lang.String>);
+ method public int describeContents();
+ method public java.util.List<java.lang.String> getPath();
+ method public java.lang.String getRootId();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.provider.DocumentsContract.Path> CREATOR;
+ }
+
public static final class DocumentsContract.Root {
field public static final java.lang.String COLUMN_AVAILABLE_BYTES = "available_bytes";
field public static final java.lang.String COLUMN_CAPACITY_BYTES = "capacity_bytes";
@@ -32120,15 +32129,6 @@
field public static final int FLAG_SUPPORTS_SEARCH = 8; // 0x8
}
- public static final class DocumentsContract.Path implements android.os.Parcelable {
- ctor public DocumentsContract.Path(java.lang.String, java.util.List<java.lang.String>);
- method public int describeContents();
- method public java.util.List<java.lang.String> getPath();
- method public java.lang.String getRootId();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.provider.DocumentsContract.Path> CREATOR;
- }
-
public abstract class DocumentsProvider extends android.content.ContentProvider {
ctor public DocumentsProvider();
method public java.lang.String copyDocument(java.lang.String, java.lang.String) throws java.io.FileNotFoundException;
diff --git a/api/system-current.txt b/api/system-current.txt
index d077808..a8a725e 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -3819,6 +3819,7 @@
public class ActivityManager {
method public int addAppTask(android.app.Activity, android.content.Intent, android.app.ActivityManager.TaskDescription, android.graphics.Bitmap);
+ method public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
method public boolean clearApplicationUserData();
method public void clearWatchHeapLimit();
method public void dumpPackageState(java.io.FileDescriptor, java.lang.String);
@@ -3849,6 +3850,7 @@
method public void killUid(int, java.lang.String);
method public void moveTaskToFront(int, int);
method public void moveTaskToFront(int, int, android.os.Bundle);
+ method public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public deprecated void restartPackage(java.lang.String);
method public static void setVrThread(int);
method public void setWatchHeapLimit(long);
@@ -3883,6 +3885,10 @@
field public long totalMem;
}
+ public static abstract interface ActivityManager.OnUidImportanceListener {
+ method public abstract void onUidImportance(int, int);
+ }
+
public static class ActivityManager.ProcessErrorStateInfo implements android.os.Parcelable {
ctor public ActivityManager.ProcessErrorStateInfo();
method public int describeContents();
@@ -12251,14 +12257,14 @@
method public deprecated boolean clipRegion(android.graphics.Region);
method public void concat(android.graphics.Matrix);
method public void drawARGB(int, int, int, int);
- method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
+ method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
method public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
method public void drawCircle(float, float, float, android.graphics.Paint);
method public void drawColor(int);
@@ -12266,28 +12272,28 @@
method public void drawLine(float, float, float, float, android.graphics.Paint);
method public void drawLines(float[], int, int, android.graphics.Paint);
method public void drawLines(float[], android.graphics.Paint);
- method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawOval(android.graphics.RectF, android.graphics.Paint);
+ method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawPaint(android.graphics.Paint);
method public void drawPath(android.graphics.Path, android.graphics.Paint);
method public void drawPicture(android.graphics.Picture);
- method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPicture(android.graphics.Picture, android.graphics.RectF);
+ method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPoint(float, float, android.graphics.Paint);
method public void drawPoints(float[], int, int, android.graphics.Paint);
method public void drawPoints(float[], android.graphics.Paint);
method public deprecated void drawPosText(char[], int, int, float[], android.graphics.Paint);
method public deprecated void drawPosText(java.lang.String, float[], android.graphics.Paint);
method public void drawRGB(int, int, int);
- method public void drawRect(float, float, float, float, android.graphics.Paint);
- method public void drawRect(android.graphics.Rect, android.graphics.Paint);
method public void drawRect(android.graphics.RectF, android.graphics.Paint);
- method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
+ method public void drawRect(android.graphics.Rect, android.graphics.Paint);
+ method public void drawRect(float, float, float, float, android.graphics.Paint);
method public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
+ method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
method public void drawText(char[], int, int, float, float, android.graphics.Paint);
- method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
+ method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
diff --git a/api/test-current.txt b/api/test-current.txt
index fdaf7a3..50dfa2a 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -3699,6 +3699,7 @@
public class ActivityManager {
method public int addAppTask(android.app.Activity, android.content.Intent, android.app.ActivityManager.TaskDescription, android.graphics.Bitmap);
+ method public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int);
method public boolean clearApplicationUserData();
method public void clearWatchHeapLimit();
method public void dumpPackageState(java.io.FileDescriptor, java.lang.String);
@@ -3712,6 +3713,7 @@
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
+ method public int getPackageImportance(java.lang.String);
method public android.os.Debug.MemoryInfo[] getProcessMemoryInfo(int[]);
method public java.util.List<android.app.ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
method public deprecated java.util.List<android.app.ActivityManager.RecentTaskInfo> getRecentTasks(int, int) throws java.lang.SecurityException;
@@ -3726,6 +3728,7 @@
method public void killBackgroundProcesses(java.lang.String);
method public void moveTaskToFront(int, int);
method public void moveTaskToFront(int, int, android.os.Bundle);
+ method public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public deprecated void restartPackage(java.lang.String);
method public static void setVrThread(int);
method public void setWatchHeapLimit(long);
@@ -3760,6 +3763,10 @@
field public long totalMem;
}
+ public static abstract interface ActivityManager.OnUidImportanceListener {
+ method public abstract void onUidImportance(int, int);
+ }
+
public static class ActivityManager.ProcessErrorStateInfo implements android.os.Parcelable {
ctor public ActivityManager.ProcessErrorStateInfo();
method public int describeContents();
@@ -11818,14 +11825,14 @@
method public deprecated boolean clipRegion(android.graphics.Region);
method public void concat(android.graphics.Matrix);
method public void drawARGB(int, int, int, int);
- method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawArc(android.graphics.RectF, float, float, boolean, android.graphics.Paint);
+ method public void drawArc(float, float, float, float, float, float, boolean, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, float, float, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
- method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.RectF, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Rect, android.graphics.Rect, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, float, float, int, int, boolean, android.graphics.Paint);
method public deprecated void drawBitmap(int[], int, int, int, int, int, int, boolean, android.graphics.Paint);
+ method public void drawBitmap(android.graphics.Bitmap, android.graphics.Matrix, android.graphics.Paint);
method public void drawBitmapMesh(android.graphics.Bitmap, int, int, float[], int, int[], int, android.graphics.Paint);
method public void drawCircle(float, float, float, android.graphics.Paint);
method public void drawColor(int);
@@ -11833,28 +11840,28 @@
method public void drawLine(float, float, float, float, android.graphics.Paint);
method public void drawLines(float[], int, int, android.graphics.Paint);
method public void drawLines(float[], android.graphics.Paint);
- method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawOval(android.graphics.RectF, android.graphics.Paint);
+ method public void drawOval(float, float, float, float, android.graphics.Paint);
method public void drawPaint(android.graphics.Paint);
method public void drawPath(android.graphics.Path, android.graphics.Paint);
method public void drawPicture(android.graphics.Picture);
- method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPicture(android.graphics.Picture, android.graphics.RectF);
+ method public void drawPicture(android.graphics.Picture, android.graphics.Rect);
method public void drawPoint(float, float, android.graphics.Paint);
method public void drawPoints(float[], int, int, android.graphics.Paint);
method public void drawPoints(float[], android.graphics.Paint);
method public deprecated void drawPosText(char[], int, int, float[], android.graphics.Paint);
method public deprecated void drawPosText(java.lang.String, float[], android.graphics.Paint);
method public void drawRGB(int, int, int);
- method public void drawRect(float, float, float, float, android.graphics.Paint);
- method public void drawRect(android.graphics.Rect, android.graphics.Paint);
method public void drawRect(android.graphics.RectF, android.graphics.Paint);
- method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
+ method public void drawRect(android.graphics.Rect, android.graphics.Paint);
+ method public void drawRect(float, float, float, float, android.graphics.Paint);
method public void drawRoundRect(android.graphics.RectF, float, float, android.graphics.Paint);
+ method public void drawRoundRect(float, float, float, float, float, float, android.graphics.Paint);
method public void drawText(char[], int, int, float, float, android.graphics.Paint);
- method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, float, float, android.graphics.Paint);
method public void drawText(java.lang.String, int, int, float, float, android.graphics.Paint);
+ method public void drawText(java.lang.CharSequence, int, int, float, float, android.graphics.Paint);
method public void drawTextOnPath(char[], int, int, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextOnPath(java.lang.String, android.graphics.Path, float, float, android.graphics.Paint);
method public void drawTextRun(char[], int, int, int, int, float, float, boolean, android.graphics.Paint);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index bdca086..9af7d8b 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -22,6 +22,7 @@
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Canvas;
@@ -61,6 +62,7 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.DisplayMetrics;
import android.util.Singleton;
import android.util.Size;
@@ -87,6 +89,49 @@
private final Context mContext;
private final Handler mHandler;
+ static final class UidObserver extends IUidObserver.Stub {
+ final OnUidImportanceListener mListener;
+ final int mImportanceCutpoint;
+ int mLastImportance;
+
+ UidObserver(OnUidImportanceListener listener, int importanceCutpoint) {
+ mListener = listener;
+ mImportanceCutpoint = importanceCutpoint;
+ }
+
+ @Override
+ public void onUidStateChanged(int uid, int procState) {
+ final boolean lastAboveCut = mLastImportance <= mImportanceCutpoint;
+ final int importance = RunningAppProcessInfo.procStateToImportance(procState);
+ final boolean newAboveCut = importance <= mImportanceCutpoint;
+ /*
+ Log.d(TAG, "Uid " + uid + " state change from " + mLastImportance + " to "
+ + importance + " @ cut " + mImportanceCutpoint
+ + ": lastAbove=" + lastAboveCut + " newAbove=" + newAboveCut);
+ */
+ mLastImportance = importance;
+ if (lastAboveCut != newAboveCut) {
+ mListener.onUidImportance(uid, importance);
+ }
+ }
+
+ @Override
+ public void onUidGone(int uid) {
+ mLastImportance = RunningAppProcessInfo.IMPORTANCE_GONE;
+ mListener.onUidImportance(uid, RunningAppProcessInfo.IMPORTANCE_GONE);
+ }
+
+ @Override
+ public void onUidActive(int uid) {
+ }
+
+ @Override
+ public void onUidIdle(int uid) {
+ }
+ }
+
+ final ArrayMap<OnUidImportanceListener, UidObserver> mImportanceListeners = new ArrayMap<>();
+
/**
* Defines acceptable types of bugreports.
* @hide
@@ -3045,11 +3090,11 @@
* running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned.
* @hide
*/
- @SystemApi
+ @SystemApi @TestApi
@RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS)
public int getPackageImportance(String packageName) {
try {
- int procState = ActivityManagerNative.getDefault().getPackageProcessState(packageName,
+ int procState = getService().getPackageProcessState(packageName,
mContext.getOpPackageName());
return RunningAppProcessInfo.procStateToImportance(procState);
} catch (RemoteException e) {
@@ -3058,6 +3103,83 @@
}
/**
+ * Callback to get reports about changes to the importance of a uid. Use with
+ * {@link #addOnUidImportanceListener}.
+ * @hide
+ */
+ @SystemApi @TestApi
+ public interface OnUidImportanceListener {
+ /**
+ * The importance if a given uid has changed. Will be one of the importance
+ * values in {@link RunningAppProcessInfo};
+ * {@link RunningAppProcessInfo#IMPORTANCE_GONE IMPORTANCE_GONE} will be reported
+ * when the uid is no longer running at all. This callback will happen on a thread
+ * from a thread pool, not the main UI thread.
+ * @param uid The uid whose importance has changed.
+ * @param importance The new importance value as per {@link RunningAppProcessInfo}.
+ */
+ void onUidImportance(int uid, int importance);
+ }
+
+ /**
+ * Start monitoring changes to the imoportance of uids running in the system.
+ * @param listener The listener callback that will receive change reports.
+ * @param importanceCutpoint The level of importance in which the caller is interested
+ * in differences. For example, if {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE}
+ * is used here, you will receive a call each time a uids importance transitions between
+ * being <= {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE} and
+ * > {@link RunningAppProcessInfo#IMPORTANCE_PERCEPTIBLE}.
+ *
+ * <p>The caller must hold the {@link android.Manifest.permission#PACKAGE_USAGE_STATS}
+ * permission to use this feature.</p>
+ *
+ * @throws IllegalArgumentException If the listener is already registered.
+ * @throws SecurityException If the caller does not hold
+ * {@link android.Manifest.permission#PACKAGE_USAGE_STATS}.
+ * @hide
+ */
+ @SystemApi @TestApi
+ public void addOnUidImportanceListener(OnUidImportanceListener listener,
+ int importanceCutpoint) {
+ synchronized (this) {
+ if (mImportanceListeners.containsKey(listener)) {
+ throw new IllegalArgumentException("Listener already registered: " + listener);
+ }
+ // TODO: implement the cut point in the system process to avoid IPCs.
+ UidObserver observer = new UidObserver(listener, importanceCutpoint);
+ try {
+ getService().registerUidObserver(observer,
+ UID_OBSERVER_PROCSTATE | UID_OBSERVER_GONE, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ mImportanceListeners.put(listener, observer);
+ }
+ }
+
+ /**
+ * Remove an importance listener that was previously registered with
+ * {@link #addOnUidImportanceListener}.
+ *
+ * @throws IllegalArgumentException If the listener is not registered.
+ * @hide
+ */
+ @SystemApi @TestApi
+ public void removeOnUidImportanceListener(OnUidImportanceListener listener) {
+ synchronized (this) {
+ UidObserver observer = mImportanceListeners.remove(listener);
+ if (observer == null) {
+ throw new IllegalArgumentException("Listener not registered: " + listener);
+ }
+ try {
+ getService().unregisterUidObserver(observer);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
* Return global memory state information for the calling process. This
* does not fill in all fields of the {@link RunningAppProcessInfo}. The
* only fields that will be filled in are
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 2498459..92d67b7 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -431,7 +431,7 @@
* etc.
*/
void keyguardGoingAway(int flags) = 296;
- void registerUidObserver(in IUidObserver observer, int which) = 297;
+ void registerUidObserver(in IUidObserver observer, int which, String callingPackage) = 297;
void unregisterUidObserver(in IUidObserver observer) = 298;
boolean isAssistDataAllowedOnCurrentActivity() = 299;
boolean showAssistFromActivity(in IBinder token, in Bundle args) = 300;
diff --git a/core/java/android/os/HardwarePropertiesManager.java b/core/java/android/os/HardwarePropertiesManager.java
index 6dec0dc..2b00ecb 100644
--- a/core/java/android/os/HardwarePropertiesManager.java
+++ b/core/java/android/os/HardwarePropertiesManager.java
@@ -55,9 +55,7 @@
public @interface TemperatureSource {}
/**
- * Device temperature types. These must match the values in
- * frameworks/native/include/hardwareproperties/HardwarePropertiesManager.h
- * TODO(b/32022261) Remove this comment.
+ * Device temperature types.
*/
/** Temperature of CPUs in Celsius. */
public static final int DEVICE_TEMPERATURE_CPU = Constants.TemperatureType.CPU;
diff --git a/core/java/android/widget/StackView.java b/core/java/android/widget/StackView.java
index 0e99c02..1b9055c 100644
--- a/core/java/android/widget/StackView.java
+++ b/core/java/android/widget/StackView.java
@@ -1051,6 +1051,11 @@
float d = (float) Math.hypot(viewLp.horizontalOffset, viewLp.verticalOffset);
float maxd = (float) Math.hypot(mSlideAmount, 0.4f * mSlideAmount);
+ if (d > maxd) {
+ // Because mSlideAmount is updated in onLayout(), it is possible that d > maxd
+ // if we get onLayout() right before this method is called.
+ d = maxd;
+ }
if (velocity == 0) {
return (invert ? (1 - d / maxd) : d / maxd) * DEFAULT_ANIMATION_DURATION;
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 6dc3f3e..ff1d383 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1059,6 +1059,12 @@
<integer name="config_autoBrightnessBrighteningLightDebounce">4000</integer>
<integer name="config_autoBrightnessDarkeningLightDebounce">8000</integer>
+ <!-- Initial light sensor event rate in milliseconds for automatic brightness control. This is
+ used for obtaining the first light sample when the device stops dozing.
+
+ Set this to -1 to disable this feature. -->
+ <integer name="config_autoBrightnessInitialLightSensorRate">-1</integer>
+
<!-- Light sensor event rate in milliseconds for automatic brightness control. -->
<integer name="config_autoBrightnessLightSensorRate">250</integer>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 0073f53..92fff65 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1736,6 +1736,7 @@
<java-symbol type="integer" name="config_autoBrightnessAmbientLightHorizon"/>
<java-symbol type="integer" name="config_autoBrightnessBrighteningLightDebounce"/>
<java-symbol type="integer" name="config_autoBrightnessDarkeningLightDebounce"/>
+ <java-symbol type="integer" name="config_autoBrightnessInitialLightSensorRate"/>
<java-symbol type="integer" name="config_autoBrightnessLightSensorRate"/>
<java-symbol type="integer" name="config_carDockKeepsScreenOn" />
<java-symbol type="integer" name="config_criticalBatteryWarningLevel" />
diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp
index 5213d48..5e4a7f7 100644
--- a/libs/hwui/DisplayList.cpp
+++ b/libs/hwui/DisplayList.cpp
@@ -25,6 +25,7 @@
#include "RecordedOp.h"
#include "RenderNode.h"
#include "VectorDrawable.h"
+#include "renderthread/CanvasContext.h"
namespace android {
namespace uirenderer {
@@ -105,11 +106,8 @@
bool DisplayList::prepareListAndChildren(TreeInfo& info, bool functorsNeedLayer,
std::function<void(RenderNode*, TreeInfo&, bool)> childFn) {
- TextureCache& cache = Caches::getInstance().textureCache;
- for (auto& bitmapResource : bitmapResources) {
- void* ownerToken = &info.canvasContext;
- info.prepareTextures = cache.prefetchAndMarkInUse(ownerToken, bitmapResource.get());
- }
+ info.prepareTextures = info.canvasContext.pinImages(bitmapResources);
+
for (auto&& op : children) {
RenderNode* childNode = op->renderNode;
info.damageAccumulator->pushTransform(&op->localMatrix);
diff --git a/libs/hwui/debug/GlesDriver.cpp b/libs/hwui/debug/GlesDriver.cpp
index b8ef639..97e8f3a 100644
--- a/libs/hwui/debug/GlesDriver.cpp
+++ b/libs/hwui/debug/GlesDriver.cpp
@@ -36,6 +36,11 @@
return ret;
}
+sk_sp<const GrGLInterface> GlesDriver::getSkiaInterface() {
+ sk_sp<const GrGLInterface> skiaInterface(GrGLCreateNativeInterface());
+ return skiaInterface;
+}
+
} // namespace debug
} // namespace uirenderer
} // namespace android
diff --git a/libs/hwui/debug/GlesDriver.h b/libs/hwui/debug/GlesDriver.h
index ca6f4b6..3c36487 100644
--- a/libs/hwui/debug/GlesDriver.h
+++ b/libs/hwui/debug/GlesDriver.h
@@ -28,6 +28,7 @@
#include <GLES3/gl31.h>
#include <GLES3/gl32.h>
+#include <gl/GrGLInterface.h>
#include <memory>
namespace android {
@@ -39,6 +40,7 @@
class GlesDriver {
public:
virtual ~GlesDriver() {}
+ virtual sk_sp<const GrGLInterface> getSkiaInterface();
#define GL_ENTRY(ret, api, ...) virtual ret api##_(__VA_ARGS__) = 0;
#include "gles_decls.in"
diff --git a/libs/hwui/debug/NullGlesDriver.cpp b/libs/hwui/debug/NullGlesDriver.cpp
index e9dbc74..8fbe4bf 100644
--- a/libs/hwui/debug/NullGlesDriver.cpp
+++ b/libs/hwui/debug/NullGlesDriver.cpp
@@ -20,6 +20,11 @@
namespace uirenderer {
namespace debug {
+sk_sp<const GrGLInterface> NullGlesDriver::getSkiaInterface() {
+ sk_sp<const GrGLInterface> skiaInterface(GrGLCreateNullInterface());
+ return skiaInterface;
+}
+
struct {
GLboolean scissorEnabled;
} gState;
diff --git a/libs/hwui/debug/NullGlesDriver.h b/libs/hwui/debug/NullGlesDriver.h
index d731379..37ca8f34 100644
--- a/libs/hwui/debug/NullGlesDriver.h
+++ b/libs/hwui/debug/NullGlesDriver.h
@@ -24,6 +24,8 @@
class NullGlesDriver : public FatalBaseDriver {
public:
+ virtual sk_sp<const GrGLInterface> getSkiaInterface() override;
+
virtual void glGenBuffers_(GLsizei n, GLuint *buffers) override;
virtual void glGenFramebuffers_(GLsizei n, GLuint *framebuffers) override;
virtual void glGenRenderbuffers_(GLsizei n, GLuint *renderbuffers) override;
diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
index c734097e..4abaa90 100644
--- a/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
+++ b/libs/hwui/pipeline/skia/SkiaDisplayList.cpp
@@ -20,7 +20,7 @@
#include "VectorDrawable.h"
#include <SkImagePriv.h>
-#include <SkMutex.h>
+
namespace android {
namespace uirenderer {
@@ -40,7 +40,7 @@
}
bool SkiaDisplayList::reuseDisplayList(RenderNode* node, renderthread::CanvasContext* context) {
- reset(context ? context->getGrContext() : nullptr, SkRect::MakeEmpty());
+ reset(SkRect::MakeEmpty());
node->attachAvailableList(this);
return true;
}
@@ -53,9 +53,12 @@
bool SkiaDisplayList::prepareListAndChildren(TreeInfo& info, bool functorsNeedLayer,
std::function<void(RenderNode*, TreeInfo&, bool)> childFn) {
- // force all mutable images to be pinned in the GPU cache for the duration
- // of this frame
- pinImages(info.canvasContext.getGrContext());
+ // If the prepare tree is triggered by the UI thread then we must force all
+ // mutable images to be pinned in the GPU cache until the next UI thread
+ // draw
+ if (info.mode == TreeInfo::MODE_FULL) {
+ info.prepareTextures = info.canvasContext.pinImages(mMutableImages);
+ }
for (auto& child : mChildNodes) {
RenderNode* childNode = child.getRenderNode();
@@ -78,45 +81,7 @@
return isDirty;
}
-static std::vector<sk_sp<SkImage>> gPinnedImages;
-static SkBaseMutex gLock;
-
-void SkiaDisplayList::pinImages(GrContext* context) {
- if (mPinnedImages) return;
- for (SkImage* image : mMutableImages) {
- SkImage_pinAsTexture(image, context);
- }
- mPinnedImages = true;
-}
-
-void SkiaDisplayList::unpinImages(GrContext* context) {
- if (!mPinnedImages) return;
- if (context) {
- for (SkImage* image : mMutableImages) {
- SkImage_unpinAsTexture(image, context);
- }
- } else {
- gLock.acquire();
- for (SkImage* image : mMutableImages) {
- gPinnedImages.emplace_back(sk_ref_sp(image));
- }
- gLock.release();
- }
- mPinnedImages = false;
-}
-
-void SkiaDisplayList::cleanupImages(GrContext* context) {
- gLock.acquire();
- for (auto& image : gPinnedImages) {
- SkImage_unpinAsTexture(image.get(), context);
- }
- gPinnedImages.clear();
- gLock.release();
-}
-
-void SkiaDisplayList::reset(GrContext* context, SkRect bounds) {
- unpinImages(context);
- SkASSERT(!mPinnedImages);
+void SkiaDisplayList::reset(SkRect bounds) {
mIsProjectionReceiver = false;
mDrawable->reset(bounds);
diff --git a/libs/hwui/pipeline/skia/SkiaDisplayList.h b/libs/hwui/pipeline/skia/SkiaDisplayList.h
index 734aae4a..f34b485 100644
--- a/libs/hwui/pipeline/skia/SkiaDisplayList.h
+++ b/libs/hwui/pipeline/skia/SkiaDisplayList.h
@@ -51,7 +51,7 @@
* constructed with the provided bounds. The reuse avoids any overhead
* associated with destroying the SkLiteDL as well as the deques and vectors.
*/
- void reset(GrContext* context, SkRect bounds);
+ void reset(SkRect bounds);
/**
* Use the linear allocator to create any SkDrawables needed by the display
@@ -119,21 +119,6 @@
void updateChildren(std::function<void(RenderNode*)> updateFn) override;
/**
- * Pin/Unpin any mutable images to the GPU cache. A pinned images is
- * guaranteed to be remain in the cache until it has been unpinned which
- * we leverage to avoid making a CPU copy of the pixels.
- */
- void pinImages(GrContext* context);
- void unpinImages(GrContext* context);
-
- /**
- * If a SkiaDisplayList is deleted on the UI thread we cache a list of any
- * images that need unpinned from the GPU cache and call this function on
- * a subsequent frame to perform that cleanup.
- */
- static void cleanupImages(GrContext* context);
-
- /**
* We use std::deque here because (1) we need to iterate through these
* elements and (2) mDrawable holds pointers to the elements, so they cannot
* relocate.
@@ -145,9 +130,6 @@
sk_sp<SkLiteDL> mDrawable;
bool mIsProjectionReceiver = false;
-
-private:
- bool mPinnedImages = false;
};
}; // namespace skiapipeline
diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
index 494f14d..ca7ee8b 100644
--- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp
@@ -88,7 +88,7 @@
// Draw visual debugging features
if (CC_UNLIKELY(Properties::showDirtyRegions
- || ProfileType::None == Properties::getProfileType())) {
+ || ProfileType::None != Properties::getProfileType())) {
SkCanvas* profileCanvas = surface->getCanvas();
SkiaProfileRenderer profileRenderer(profileCanvas);
profiler->draw(profileRenderer);
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
index 03fa266..69e603b 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp
@@ -46,6 +46,22 @@
// which will flush temporary resources over time.
}
+bool SkiaPipeline::pinImages(std::vector<SkImage*>& mutableImages) {
+ for (SkImage* image : mutableImages) {
+ mPinnedImages.emplace_back(sk_ref_sp(image));
+ // TODO: return false if texture creation fails (see b/32691999)
+ SkImage_pinAsTexture(image, mRenderThread.getGrContext());
+ }
+ return true;
+}
+
+void SkiaPipeline::unpinImages() {
+ for (auto& image : mPinnedImages) {
+ SkImage_unpinAsTexture(image.get(), mRenderThread.getGrContext());
+ }
+ mPinnedImages.clear();
+}
+
void SkiaPipeline::renderLayers(const FrameBuilder::LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, bool opaque,
const BakedOpRenderer::LightInfo& lightInfo) {
@@ -154,9 +170,6 @@
const std::vector<sp<RenderNode>>& nodes, bool opaque, const Rect &contentDrawBounds,
sk_sp<SkSurface> surface) {
- // unpin all mutable images that were attached to nodes deleted while on the UI thread
- SkiaDisplayList::cleanupImages(surface->getCanvas()->getGrContext());
-
// draw all layers up front
renderLayersImpl(layers, opaque);
diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.h b/libs/hwui/pipeline/skia/SkiaPipeline.h
index 160046a..877a353 100644
--- a/libs/hwui/pipeline/skia/SkiaPipeline.h
+++ b/libs/hwui/pipeline/skia/SkiaPipeline.h
@@ -34,6 +34,10 @@
void onDestroyHardwareResources() override;
+ bool pinImages(std::vector<SkImage*>& mutableImages) override;
+ bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override { return false; }
+ void unpinImages() override;
+
void renderLayers(const FrameBuilder::LightGeometry& lightGeometry,
LayerUpdateQueue* layerUpdateQueue, bool opaque,
const BakedOpRenderer::LightInfo& lightInfo) override;
@@ -101,6 +105,7 @@
private:
TaskManager mTaskManager;
+ std::vector<sk_sp<SkImage>> mPinnedImages;
static float mLightRadius;
static uint8_t mAmbientShadowAlpha;
static uint8_t mSpotShadowAlpha;
diff --git a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
index ecc6d51..621816a 100644
--- a/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
+++ b/libs/hwui/pipeline/skia/SkiaRecordingCanvas.cpp
@@ -41,7 +41,7 @@
}
SkRect bounds = SkRect::MakeWH(width, height);
if (mDisplayList) {
- mDisplayList->reset(nullptr, bounds);
+ mDisplayList->reset(bounds);
} else {
mDisplayList.reset(new SkiaDisplayList(bounds));
}
diff --git a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
index 8fffe91..21f3488 100644
--- a/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
+++ b/libs/hwui/pipeline/skia/SkiaVulkanPipeline.cpp
@@ -74,7 +74,7 @@
// Draw visual debugging features
if (CC_UNLIKELY(Properties::showDirtyRegions
- || ProfileType::None == Properties::getProfileType())) {
+ || ProfileType::None != Properties::getProfileType())) {
SkCanvas* profileCanvas = mBackbuffer->getCanvas();
SkiaProfileRenderer profileRenderer(profileCanvas);
profiler->draw(profileRenderer);
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index b61eef2..c322efb 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -80,6 +80,26 @@
}
/**
+ * Pin any mutable images to the GPU cache. A pinned images is guaranteed to
+ * remain in the cache until it has been unpinned. We leverage this feature
+ * to avoid making a CPU copy of the pixels.
+ *
+ * @return true if the images have been successfully pinned to the GPU cache
+ * and false otherwise (e.g. cache limits have been exceeded).
+ */
+ bool pinImages(std::vector<SkImage*>& mutableImages) {
+ return mRenderPipeline->pinImages(mutableImages);
+ }
+ bool pinImages(LsaVector<sk_sp<Bitmap>>& images) {
+ return mRenderPipeline->pinImages(images);
+ }
+
+ /**
+ * Unpin any image that had be previously pinned to the GPU cache
+ */
+ void unpinImages() { mRenderPipeline->unpinImages(); }
+
+ /**
* Destroy any layers that have been attached to the provided RenderNode removing
* any state that may have been set during createOrUpdateLayer().
*/
diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp
index e3b6dc6..4ff54a5 100644
--- a/libs/hwui/renderthread/DrawFrameTask.cpp
+++ b/libs/hwui/renderthread/DrawFrameTask.cpp
@@ -119,7 +119,7 @@
int64_t vsync = mFrameInfo[static_cast<int>(FrameInfoIndex::Vsync)];
mRenderThread->timeLord().vsyncReceived(vsync);
bool canDraw = mContext->makeCurrent();
- Caches::getInstance().textureCache.resetMarkInUse(mContext);
+ mContext->unpinImages();
for (size_t i = 0; i < mLayers.size(); i++) {
mLayers[i]->apply();
diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp
index beaa85e..de95bee 100644
--- a/libs/hwui/renderthread/EglManager.cpp
+++ b/libs/hwui/renderthread/EglManager.cpp
@@ -30,6 +30,10 @@
#include <gl/GrGLInterface.h>
#include <string>
+#ifdef HWUI_GLES_WRAP_ENABLED
+#include "debug/GlesDriver.h"
+#endif
+
#define GLES_VERSION 2
// Android-specific addition that is used to show when frames began in systrace
@@ -131,7 +135,12 @@
mRenderThread.renderState().onGLContextCreated();
if (Properties::getRenderPipelineType() == RenderPipelineType::SkiaGL) {
+#ifdef HWUI_GLES_WRAP_ENABLED
+ debug::GlesDriver* driver = debug::GlesDriver::get();
+ sk_sp<const GrGLInterface> glInterface(driver->getSkiaInterface());
+#else
sk_sp<const GrGLInterface> glInterface(GrGLCreateNativeInterface());
+#endif
LOG_ALWAYS_FATAL_IF(!glInterface.get());
GrContextOptions options;
diff --git a/libs/hwui/renderthread/IRenderPipeline.h b/libs/hwui/renderthread/IRenderPipeline.h
index 52894ad..0e4000b 100644
--- a/libs/hwui/renderthread/IRenderPipeline.h
+++ b/libs/hwui/renderthread/IRenderPipeline.h
@@ -73,6 +73,9 @@
virtual TaskManager* getTaskManager() = 0;
virtual bool createOrUpdateLayer(RenderNode* node,
const DamageAccumulator& damageAccumulator) = 0;
+ virtual bool pinImages(std::vector<SkImage*>& mutableImages) = 0;
+ virtual bool pinImages(LsaVector<sk_sp<Bitmap>>& images) = 0;
+ virtual void unpinImages() = 0;
virtual ~IRenderPipeline() {}
};
diff --git a/libs/hwui/renderthread/OpenGLPipeline.cpp b/libs/hwui/renderthread/OpenGLPipeline.cpp
index cca0fca..afeeef8 100644
--- a/libs/hwui/renderthread/OpenGLPipeline.cpp
+++ b/libs/hwui/renderthread/OpenGLPipeline.cpp
@@ -31,7 +31,8 @@
namespace renderthread {
OpenGLPipeline::OpenGLPipeline(RenderThread& thread)
- : mEglManager(thread.eglManager()), mRenderThread(thread) {
+ : mEglManager(thread.eglManager())
+ , mRenderThread(thread) {
}
MakeCurrentResult OpenGLPipeline::makeCurrent() {
@@ -222,6 +223,19 @@
return transformUpdateNeeded;
}
+bool OpenGLPipeline::pinImages(LsaVector<sk_sp<Bitmap>>& images) {
+ TextureCache& cache = Caches::getInstance().textureCache;
+ bool prefetchSucceeded = true;
+ for (auto& bitmapResource : images) {
+ prefetchSucceeded &= cache.prefetchAndMarkInUse(this, bitmapResource.get());
+ }
+ return prefetchSucceeded;
+}
+
+void OpenGLPipeline::unpinImages() {
+ Caches::getInstance().textureCache.resetMarkInUse(this);
+}
+
void OpenGLPipeline::destroyLayer(RenderNode* node) {
if (OffscreenBuffer* layer = node->getLayer()) {
layer->renderState.layerPool().putOrDelete(layer);
diff --git a/libs/hwui/renderthread/OpenGLPipeline.h b/libs/hwui/renderthread/OpenGLPipeline.h
index 8722d59..6df8be4 100644
--- a/libs/hwui/renderthread/OpenGLPipeline.h
+++ b/libs/hwui/renderthread/OpenGLPipeline.h
@@ -55,6 +55,9 @@
TaskManager* getTaskManager() override;
bool createOrUpdateLayer(RenderNode* node,
const DamageAccumulator& damageAccumulator) override;
+ bool pinImages(std::vector<SkImage*>& mutableImages) override { return false; }
+ bool pinImages(LsaVector<sk_sp<Bitmap>>& images) override;
+ void unpinImages() override;
static void destroyLayer(RenderNode* node);
static void prepareToDraw(const RenderThread& thread, Bitmap* bitmap);
static void invokeFunctor(const RenderThread& thread, Functor* functor);
diff --git a/libs/hwui/tests/unit/SkiaDisplayListTests.cpp b/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
index fe6cea6..67fb78a 100644
--- a/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
+++ b/libs/hwui/tests/unit/SkiaDisplayListTests.cpp
@@ -58,7 +58,7 @@
ASSERT_TRUE(skiaDL.mIsProjectionReceiver);
bounds = SkRect::MakeWH(100, 100);
- skiaDL.reset(nullptr, bounds);
+ skiaDL.reset(bounds);
ASSERT_EQ(skiaDL.mDrawable->getBounds(), bounds);
ASSERT_TRUE(skiaDL.mChildNodes.empty());
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 20cca16..8e01e9e 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -938,7 +938,7 @@
try {
ActivityManagerNative.getDefault().registerUidObserver(new UidObserver(),
- ActivityManager.UID_OBSERVER_IDLE);
+ ActivityManager.UID_OBSERVER_IDLE, null);
} catch (RemoteException e) {
// ignored; both services live in system_server
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index dd417d9..2d6832d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -12245,9 +12245,11 @@
}
@Override
- public void registerUidObserver(IUidObserver observer, int which) {
- enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
- "registerUidObserver()");
+ public void registerUidObserver(IUidObserver observer, int which, String callingPackage) {
+ if (!hasUsageStatsPermission(callingPackage)) {
+ enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
+ "registerUidObserver");
+ }
synchronized (this) {
mUidObservers.register(observer, which);
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index f037f2f..eb5e603 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -4062,21 +4062,23 @@
mIndexMap.put(device, index);
changed = oldIndex != index;
- if (changed) {
- // Apply change to all streams using this one as alias
- // if changing volume of current device, also change volume of current
- // device on aliased stream
- boolean currentDevice = (device == getDeviceForStream(mStreamType));
- int numStreamTypes = AudioSystem.getNumStreamTypes();
- for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
- if (streamType != mStreamType &&
- mStreamVolumeAlias[streamType] == mStreamType) {
- int scaledIndex = rescaleIndex(index, mStreamType, streamType);
- mStreamStates[streamType].setIndex(scaledIndex, device, caller);
- if (currentDevice) {
- mStreamStates[streamType].setIndex(scaledIndex,
- getDeviceForStream(streamType), caller);
- }
+ // Apply change to all streams using this one as alias if:
+ // - the index actually changed OR
+ // - there is no volume index stored for this device on alias stream.
+ // If changing volume of current device, also change volume of current
+ // device on aliased stream
+ final boolean currentDevice = (device == getDeviceForStream(mStreamType));
+ final int numStreamTypes = AudioSystem.getNumStreamTypes();
+ for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
+ final VolumeStreamState aliasStreamState = mStreamStates[streamType];
+ if (streamType != mStreamType &&
+ mStreamVolumeAlias[streamType] == mStreamType &&
+ (changed || !aliasStreamState.hasIndexForDevice(device))) {
+ final int scaledIndex = rescaleIndex(index, mStreamType, streamType);
+ aliasStreamState.setIndex(scaledIndex, device, caller);
+ if (currentDevice) {
+ aliasStreamState.setIndex(scaledIndex,
+ getDeviceForStream(streamType), caller);
}
}
}
@@ -4113,6 +4115,12 @@
}
}
+ public boolean hasIndexForDevice(int device) {
+ synchronized (VolumeStreamState.class) {
+ return (mIndexMap.get(device, -1) != -1);
+ }
+ }
+
public int getMaxIndex() {
return mIndexMax;
}
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index fa6a7e7..3da49d8 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -86,8 +86,14 @@
private final int mScreenBrightnessRangeMaximum;
private final float mDozeScaleFactor;
- // Light sensor event rate in milliseconds.
- private final int mLightSensorRate;
+ // Initial light sensor event rate in milliseconds.
+ private final int mInitialLightSensorRate;
+
+ // Steady-state light sensor event rate in milliseconds.
+ private final int mNormalLightSensorRate;
+
+ // The current light sensor event rate in milliseconds.
+ private int mCurrentLightSensorRate;
// Stability requirements in milliseconds for accepting a new brightness level. This is used
// for debouncing the light sensor. Different constants are used to debounce the light sensor
@@ -185,7 +191,7 @@
public AutomaticBrightnessController(Callbacks callbacks, Looper looper,
SensorManager sensorManager, Spline autoBrightnessSpline, int lightSensorWarmUpTime,
int brightnessMin, int brightnessMax, float dozeScaleFactor,
- int lightSensorRate, long brighteningLightDebounceConfig,
+ int lightSensorRate, int initialLightSensorRate, long brighteningLightDebounceConfig,
long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig,
int ambientLightHorizon, float autoBrightnessAdjustmentMaxGamma,
HysteresisLevels dynamicHysteresis) {
@@ -197,7 +203,9 @@
mScreenBrightnessRangeMaximum = brightnessMax;
mLightSensorWarmUpTimeConfig = lightSensorWarmUpTime;
mDozeScaleFactor = dozeScaleFactor;
- mLightSensorRate = lightSensorRate;
+ mNormalLightSensorRate = lightSensorRate;
+ mInitialLightSensorRate = initialLightSensorRate;
+ mCurrentLightSensorRate = -1;
mBrighteningLightDebounceConfig = brighteningLightDebounceConfig;
mDarkeningLightDebounceConfig = darkeningLightDebounceConfig;
mResetAmbientLuxAfterWarmUpConfig = resetAmbientLuxAfterWarmUpConfig;
@@ -208,9 +216,9 @@
mHandler = new AutomaticBrightnessHandler(looper);
mAmbientLightRingBuffer =
- new AmbientLightRingBuffer(mLightSensorRate, mAmbientLightHorizon);
+ new AmbientLightRingBuffer(mNormalLightSensorRate, mAmbientLightHorizon);
mInitialHorizonAmbientLightRingBuffer =
- new AmbientLightRingBuffer(mLightSensorRate, mAmbientLightHorizon);
+ new AmbientLightRingBuffer(mNormalLightSensorRate, mAmbientLightHorizon);
if (!DEBUG_PRETEND_LIGHT_SENSOR_ABSENT) {
mLightSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
@@ -293,8 +301,9 @@
if (!mLightSensorEnabled) {
mLightSensorEnabled = true;
mLightSensorEnableTime = SystemClock.uptimeMillis();
+ mCurrentLightSensorRate = mInitialLightSensorRate;
mSensorManager.registerListener(mLightSensorListener, mLightSensor,
- mLightSensorRate * 1000, mHandler);
+ mCurrentLightSensorRate * 1000, mHandler);
return true;
}
} else {
@@ -304,6 +313,7 @@
mRecentLightSamples = 0;
mAmbientLightRingBuffer.clear();
mInitialHorizonAmbientLightRingBuffer.clear();
+ mCurrentLightSensorRate = -1;
mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX);
mSensorManager.unregisterListener(mLightSensorListener);
}
@@ -314,6 +324,10 @@
private void handleLightSensorEvent(long time, float lux) {
mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX);
+ if (mAmbientLightRingBuffer.size() == 0) {
+ // switch to using the steady-state sample rate after grabbing the initial light sample
+ adjustLightSensorRate(mNormalLightSensorRate);
+ }
applyLightSensorMeasurement(time, lux);
updateAmbientLux(time);
}
@@ -333,6 +347,20 @@
mLastObservedLuxTime = time;
}
+ private void adjustLightSensorRate(int lightSensorRate) {
+ // if the light sensor rate changed, update the sensor listener
+ if (lightSensorRate != mCurrentLightSensorRate) {
+ if (DEBUG) {
+ Slog.d(TAG, "adjustLightSensorRate: previousRate=" + mCurrentLightSensorRate
+ + ", currentRate=" + lightSensorRate);
+ }
+ mCurrentLightSensorRate = lightSensorRate;
+ mSensorManager.unregisterListener(mLightSensorListener);
+ mSensorManager.registerListener(mLightSensorListener, mLightSensor,
+ lightSensorRate * 1000, mHandler);
+ }
+ }
+
private boolean setScreenAutoBrightnessAdjustment(float adjustment) {
if (adjustment != mScreenAutoBrightnessAdjustment) {
mScreenAutoBrightnessAdjustment = adjustment;
@@ -468,7 +496,7 @@
// should be enough time to decide whether we should actually transition to the new
// weighted ambient lux or not.
nextTransitionTime =
- nextTransitionTime > time ? nextTransitionTime : time + mLightSensorRate;
+ nextTransitionTime > time ? nextTransitionTime : time + mNormalLightSensorRate;
if (DEBUG) {
Slog.d(TAG, "updateAmbientLux: Scheduling ambient lux update for "
+ nextTransitionTime + TimeUtils.formatUptime(nextTransitionTime));
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 3b2dc34..477ecdf 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -310,6 +310,15 @@
int lightSensorRate = resources.getInteger(
com.android.internal.R.integer.config_autoBrightnessLightSensorRate);
+ int initialLightSensorRate = resources.getInteger(
+ com.android.internal.R.integer.config_autoBrightnessInitialLightSensorRate);
+ if (initialLightSensorRate == -1) {
+ initialLightSensorRate = lightSensorRate;
+ } else if (initialLightSensorRate > lightSensorRate) {
+ Slog.w(TAG, "Expected config_autoBrightnessInitialLightSensorRate ("
+ + initialLightSensorRate + ") to be less than or equal to "
+ + "config_autoBrightnessLightSensorRate (" + lightSensorRate + ").");
+ }
long brighteningLightDebounce = resources.getInteger(
com.android.internal.R.integer.config_autoBrightnessBrighteningLightDebounce);
long darkeningLightDebounce = resources.getInteger(
@@ -366,7 +375,7 @@
handler.getLooper(), sensorManager, screenAutoBrightnessSpline,
lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum,
mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
- brighteningLightDebounce, darkeningLightDebounce,
+ initialLightSensorRate, brighteningLightDebounce, darkeningLightDebounce,
autoBrightnessResetAmbientLuxAfterWarmUp, ambientLightHorizon,
autoBrightnessAdjustmentMaxGamma, dynamicHysteresis);
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index 970da99..a37dfed 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -824,7 +824,7 @@
try {
ActivityManagerNative.getDefault().registerUidObserver(mUidObserver,
ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE
- | ActivityManager.UID_OBSERVER_IDLE);
+ | ActivityManager.UID_OBSERVER_IDLE, null);
} catch (RemoteException e) {
// ignored; both services live in system_server
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 2bccfee..d8103fc 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -611,7 +611,8 @@
try {
mActivityManager.registerUidObserver(mUidObserver,
- ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE);
+ ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE,
+ null);
mNetworkManager.registerObserver(mAlertObserver);
} catch (RemoteException e) {
// ignored; both services live in system_server
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 3b5abe8..37acf5c 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -3677,7 +3677,7 @@
@VisibleForTesting
void injectRegisterUidObserver(IUidObserver observer, int which) {
try {
- ActivityManagerNative.getDefault().registerUidObserver(observer, which);
+ ActivityManagerNative.getDefault().registerUidObserver(observer, which, null);
} catch (RemoteException shouldntHappen) {
}
}
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 743caf8..6326148 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -653,6 +653,14 @@
mDelayedImeWin = imeWin;
imeWin.mWinAnimator.startDelayingAnimationStart();
}
+
+ // If we are already waiting for something to be drawn, clear out the old one so it
+ // still gets executed.
+ // TODO: Have a real system where we can wait on different windows to be drawn with
+ // different callbacks.
+ if (mService.mWaitingForDrawnCallback != null) {
+ mService.mWaitingForDrawnCallback.run();
+ }
mService.mWaitingForDrawnCallback = () -> {
mAnimationStartDelayed = false;
if (mDelayedImeWin != null) {
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index 2c46413..3a9ff5f 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -73,3 +73,4 @@
android.hardware.vr@1.0 \
android.hardware.audio.common@2.0 \
android.hardware.tv.input@1.0 \
+ android.hardware.thermal@1.0 \
diff --git a/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp b/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
index 14d50ce..a385704 100644
--- a/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
+++ b/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
@@ -21,7 +21,7 @@
#include <stdlib.h>
-#include <hardware/thermal.h>
+#include <android/hardware/thermal/1.0/IThermal.h>
#include <utils/Log.h>
#include <utils/String8.h>
@@ -29,6 +29,15 @@
namespace android {
+using hardware::hidl_vec;
+using hardware::Status;
+using hardware::thermal::V1_0::CoolingDevice;
+using hardware::thermal::V1_0::CpuUsage;
+using hardware::thermal::V1_0::IThermal;
+using hardware::thermal::V1_0::Temperature;
+using hardware::thermal::V1_0::ThermalStatus;
+using hardware::thermal::V1_0::ThermalStatusCode;
+
// ---------------------------------------------------------------------------
// These values must be kept in sync with the temperature source constants in
@@ -45,136 +54,129 @@
jmethodID initMethod;
} gCpuUsageInfoClassInfo;
-jfloat gUndefinedTemperature;
-
-static struct thermal_module* gThermalModule;
+static sp<IThermal> gThermalModule;
// ----------------------------------------------------------------------------
static void nativeInit(JNIEnv* env, jobject obj) {
- status_t err = hw_get_module(THERMAL_HARDWARE_MODULE_ID, (hw_module_t const**)&gThermalModule);
- if (err) {
- ALOGE("Couldn't load %s module (%s)", THERMAL_HARDWARE_MODULE_ID, strerror(-err));
+ // TODO(b/31632518)
+ if (gThermalModule == nullptr) {
+ gThermalModule = IThermal::getService("thermal");
+ }
+
+ if (gThermalModule == nullptr) {
+ ALOGE("Undable to get Thermal service.");
}
}
static jfloatArray nativeGetFanSpeeds(JNIEnv *env, jclass /* clazz */) {
- if (gThermalModule && gThermalModule->getCoolingDevices) {
- ssize_t list_size = gThermalModule->getCoolingDevices(gThermalModule, nullptr, 0);
-
- if (list_size >= 0) {
- cooling_device_t *list = (cooling_device_t *)
- malloc(list_size * sizeof(cooling_device_t));
- ssize_t size = gThermalModule->getCoolingDevices(gThermalModule, list, list_size);
- if (size >= 0) {
- if (list_size > size) {
- list_size = size;
- }
- jfloat values[list_size];
- for (ssize_t i = 0; i < list_size; ++i) {
- values[i] = list[i].current_value;
- }
-
- jfloatArray fanSpeeds = env->NewFloatArray(list_size);
- env->SetFloatArrayRegion(fanSpeeds, 0, list_size, values);
- free(list);
- return fanSpeeds;
- }
-
- free(list);
- }
-
- ALOGE("Cloudn't get fan speeds because of HAL error");
+ if (gThermalModule == nullptr) {
+ ALOGE("Couldn't get fan speeds because of HAL error.");
+ return env->NewFloatArray(0);
}
- return env->NewFloatArray(0);
+
+ hidl_vec<CoolingDevice> list;
+ Status status = gThermalModule->getCoolingDevices(
+ [&list](ThermalStatus status, hidl_vec<CoolingDevice> devices) {
+ if (status.code == ThermalStatusCode::SUCCESS) {
+ list = std::move(devices);
+ } else {
+ ALOGE("Couldn't get fan speeds because of HAL error: %s",
+ status.debugMessage.c_str());
+ }
+ }).getStatus();
+
+ if (!status.isOk()) {
+ ALOGE("getCoolingDevices failed status: %d", status.exceptionCode());
+ }
+
+ float values[list.size()];
+ for (size_t i = 0; i < list.size(); ++i) {
+ values[i] = list[i].currentValue;
+ }
+ jfloatArray fanSpeeds = env->NewFloatArray(list.size());
+ env->SetFloatArrayRegion(fanSpeeds, 0, list.size(), values);
+ return fanSpeeds;
}
static jfloatArray nativeGetDeviceTemperatures(JNIEnv *env, jclass /* clazz */, int type,
int source) {
- if (gThermalModule && gThermalModule->getTemperatures) {
- ssize_t list_size = gThermalModule->getTemperatures(gThermalModule, nullptr, 0);
- if (list_size >= 0) {
- temperature_t *list = (temperature_t *) malloc(list_size * sizeof(temperature_t));
- ssize_t size = gThermalModule->getTemperatures(gThermalModule, list, list_size);
- if (size >= 0) {
- if (list_size > size) {
- list_size = size;
- }
-
- jfloat values[list_size];
- size_t length = 0;
-
- for (ssize_t i = 0; i < list_size; ++i) {
- if (list[i].type == type) {
- switch (source) {
- case TEMPERATURE_CURRENT:
- if (list[i].current_value == UNKNOWN_TEMPERATURE) {
- values[length++] = gUndefinedTemperature;
- } else {
- values[length++] = list[i].current_value;
- }
- break;
- case TEMPERATURE_THROTTLING:
- if (list[i].throttling_threshold == UNKNOWN_TEMPERATURE) {
- values[length++] = gUndefinedTemperature;
- } else {
- values[length++] = list[i].throttling_threshold;
- }
- break;
- case TEMPERATURE_SHUTDOWN:
- if (list[i].shutdown_threshold == UNKNOWN_TEMPERATURE) {
- values[length++] = gUndefinedTemperature;
- } else {
- values[length++] = list[i].shutdown_threshold;
- }
- break;
- case TEMPERATURE_THROTTLING_BELOW_VR_MIN:
- if (list[i].vr_throttling_threshold == UNKNOWN_TEMPERATURE) {
- values[length++] = gUndefinedTemperature;
- } else {
- values[length++] = list[i].vr_throttling_threshold;
- }
- break;
- }
- }
- }
- jfloatArray deviceTemps = env->NewFloatArray(length);
- env->SetFloatArrayRegion(deviceTemps, 0, length, values);
- free(list);
- return deviceTemps;
- }
- free(list);
- }
- ALOGE("Couldn't get device temperatures because of HAL error");
+ if (gThermalModule == nullptr) {
+ ALOGE("Couldn't get device temperatures because of HAL error.");
+ return env->NewFloatArray(0);
}
- return env->NewFloatArray(0);
+ hidl_vec<Temperature> list;
+ Status status = gThermalModule->getTemperatures(
+ [&list](ThermalStatus status, hidl_vec<Temperature> temperatures) {
+ if (status.code == ThermalStatusCode::SUCCESS) {
+ list = std::move(temperatures);
+ } else {
+ ALOGE("Couldn't get temperatures because of HAL error: %s",
+ status.debugMessage.c_str());
+ }
+ }).getStatus();
+
+ if (!status.isOk()) {
+ ALOGE("getDeviceTemperatures failed status: %d", status.exceptionCode());
+ }
+
+ jfloat values[list.size()];
+ size_t length = 0;
+ for (size_t i = 0; i < list.size(); ++i) {
+ if (static_cast<int>(list[i].type) == type) {
+ switch (source) {
+ case TEMPERATURE_CURRENT:
+ values[length++] = list[i].currentValue;
+ break;
+ case TEMPERATURE_THROTTLING:
+ values[length++] = list[i].throttlingThreshold;
+ break;
+ case TEMPERATURE_SHUTDOWN:
+ values[length++] = list[i].shutdownThreshold;
+ break;
+ case TEMPERATURE_THROTTLING_BELOW_VR_MIN:
+ values[length++] = list[i].vrThrottlingThreshold;
+ break;
+ }
+ }
+ }
+ jfloatArray deviceTemps = env->NewFloatArray(length);
+ env->SetFloatArrayRegion(deviceTemps, 0, length, values);
+ return deviceTemps;
}
static jobjectArray nativeGetCpuUsages(JNIEnv *env, jclass /* clazz */) {
- if (gThermalModule && gThermalModule->getCpuUsages
- && gCpuUsageInfoClassInfo.initMethod) {
- ssize_t size = gThermalModule->getCpuUsages(gThermalModule, nullptr);
- if (size >= 0) {
- cpu_usage_t *list = (cpu_usage_t *) malloc(size * sizeof(cpu_usage_t));
- size = gThermalModule->getCpuUsages(gThermalModule, list);
- if (size >= 0) {
- jobjectArray cpuUsages = env->NewObjectArray(size, gCpuUsageInfoClassInfo.clazz,
- nullptr);
- for (ssize_t i = 0; i < size; ++i) {
- if (list[i].is_online) {
- jobject cpuUsage = env->NewObject(gCpuUsageInfoClassInfo.clazz,
- gCpuUsageInfoClassInfo.initMethod, list[i].active, list[i].total);
- env->SetObjectArrayElement(cpuUsages, i, cpuUsage);
- }
- }
- free(list);
- return cpuUsages;
- }
- free(list);
- }
- ALOGE("Couldn't get CPU usages because of HAL error");
+ if (gThermalModule == nullptr || !gCpuUsageInfoClassInfo.initMethod) {
+ ALOGE("Couldn't get CPU usages because of HAL error.");
+ return env->NewObjectArray(0, gCpuUsageInfoClassInfo.clazz, nullptr);
}
- return env->NewObjectArray(0, gCpuUsageInfoClassInfo.clazz, nullptr);
+ hidl_vec<CpuUsage> list;
+ Status status = gThermalModule->getCpuUsages(
+ [&list](ThermalStatus status, hidl_vec<CpuUsage> cpuUsages) {
+ if (status.code == ThermalStatusCode::SUCCESS) {
+ list = std::move(cpuUsages);
+ } else {
+ ALOGE("Couldn't get CPU usages because of HAL error: %s",
+ status.debugMessage.c_str());
+ }
+ }).getStatus();
+
+ if (!status.isOk()) {
+ ALOGE("getCpuUsages failed status: %d", status.exceptionCode());
+ }
+
+ jobjectArray cpuUsages = env->NewObjectArray(list.size(), gCpuUsageInfoClassInfo.clazz,
+ nullptr);
+ for (size_t i = 0; i < list.size(); ++i) {
+ if (list[i].isOnline) {
+ jobject cpuUsage = env->NewObject(gCpuUsageInfoClassInfo.clazz,
+ gCpuUsageInfoClassInfo.initMethod,
+ list[i].active,
+ list[i].total);
+ env->SetObjectArrayElement(cpuUsages, i, cpuUsage);
+ }
+ }
+ return cpuUsages;
}
// ----------------------------------------------------------------------------
@@ -200,12 +202,6 @@
gCpuUsageInfoClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
gCpuUsageInfoClassInfo.initMethod = GetMethodIDOrDie(env, gCpuUsageInfoClassInfo.clazz,
"<init>", "(JJ)V");
-
- clazz = env->FindClass("android/os/HardwarePropertiesManager");
- jfieldID undefined_temperature_field = GetStaticFieldIDOrDie(env, clazz,
- "UNDEFINED_TEMPERATURE", "F");
- gUndefinedTemperature = env->GetStaticFloatField(clazz, undefined_temperature_field);
-
return res;
}
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 25a421e..42d9412 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -246,7 +246,7 @@
Log.d(TAG, "set mUidObserver to " + mUidObserver);
return null;
}
- }).when(mActivityManager).registerUidObserver(any(), anyInt());
+ }).when(mActivityManager).registerUidObserver(any(), anyInt(), null);
mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mStatsService,
mNetworkManager, mIpm, mTime, mPolicyDir, true);
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
index 19b4186..fd1c91a 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
@@ -66,6 +66,8 @@
class TaskWithBounds extends Task {
final Rect mBounds;
+ final Rect mInsetBounds = new Rect();
+ boolean mFullscreenForTest = true;
TaskWithBounds(Rect bounds) {
super(0, mStubStack, 0, sWm, null, null, false);
mBounds = bounds;
@@ -76,11 +78,11 @@
}
@Override
void getTempInsetBounds(Rect outBounds) {
- outBounds.setEmpty();
+ outBounds.set(mInsetBounds);
}
@Override
boolean isFullscreen() {
- return true;
+ return mFullscreenForTest;
}
}
@@ -237,6 +239,41 @@
assertRect(w.mFrame, 600, 600, 900, 900);
}
+ @Test
+ public void testLayoutNonfullscreenTask() {
+ final Rect taskBounds = new Rect(300, 300, 700, 700);
+ TaskWithBounds task = new TaskWithBounds(taskBounds);
+ task.mFullscreenForTest = false;
+ WindowState w = createWindow(task, FILL_PARENT, FILL_PARENT);
+ w.mAttrs.gravity = Gravity.LEFT | Gravity.TOP;
+
+ final Rect pf = new Rect(0, 0, 1000, 1000);
+ w.computeFrameLw(pf, pf, pf, pf, pf, pf, pf, null);
+ // For non fullscreen tasks the containing frame is based off the
+ // task bounds not the parent frame.
+ assertRect(w.mFrame, 300, 300, 700, 700);
+ assertRect(w.getContentFrameLw(), 300, 300, 700, 700);
+ assertRect(w.mContentInsets, 0, 0, 0, 0);
+
+ pf.set(0, 0, 1000, 1000);
+ // We still produce insets against the containing frame the same way.
+ final Rect cf = new Rect(0, 0, 500, 500);
+ w.computeFrameLw(pf, pf, pf, cf, cf, pf, cf, null);
+ assertRect(w.mFrame, 300, 300, 700, 700);
+ assertRect(w.getContentFrameLw(), 300, 300, 500, 500);
+ assertRect(w.mContentInsets, 0, 0, 200, 200);
+
+ pf.set(0, 0, 1000, 1000);
+ // However if we set temp inset bounds, the insets will be computed
+ // as if our window was laid out there, but it will be laid out according to
+ // the task bounds.
+ task.mInsetBounds.set(200, 200, 600, 600);
+ w.computeFrameLw(pf, pf, pf, cf, cf, pf, cf, null);
+ assertRect(w.mFrame, 300, 300, 700, 700);
+ assertRect(w.getContentFrameLw(), 300, 300, 600, 600);
+ assertRect(w.mContentInsets, 0, 0, 100, 100);
+ }
+
private WindowState createWindow(Task task, int width, int height) {
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
attrs.width = width;
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
index 8d5cf63..398308d 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
@@ -283,6 +283,13 @@
public static final String EXTRA_HANDOVER_MESSAGE =
"android.net.wifi.p2p.EXTRA_HANDOVER_MESSAGE";
+ /**
+ * The lookup key for a calling package returned by the WifiP2pService.
+ * @hide
+ */
+ public static final String CALLING_PACKAGE =
+ "android.net.wifi.p2p.CALLING_PACKAGE";
+
IWifiP2pManager mService;
private static final int BASE = Protocol.BASE_WIFI_P2P_MANAGER;
@@ -1271,7 +1278,10 @@
*/
public void requestPeers(Channel c, PeerListListener listener) {
checkChannel(c);
- c.mAsyncChannel.sendMessage(REQUEST_PEERS, 0, c.putListener(listener));
+ Bundle callingPackage = new Bundle();
+ callingPackage.putString(CALLING_PACKAGE, c.mContext.getOpPackageName());
+ c.mAsyncChannel.sendMessage(REQUEST_PEERS, 0, c.putListener(listener),
+ callingPackage);
}
/**