diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 5bb577f661a42..cf8da179bab52 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -34,7 +34,7 @@ public class SurfaceControl { private static final String TAG = "SurfaceControl"; private static native long nativeCreate(SurfaceSession session, String name, - int w, int h, int format, int flags, long parentObject) + int w, int h, int format, int flags, long parentObject, int windowType, int ownerUid) throws OutOfResourcesException; private static native void nativeRelease(long nativeObject); private static native void nativeDestroy(long nativeObject); @@ -281,17 +281,25 @@ public class SurfaceControl { * @param h The surface initial height. * @param flags The surface creation flags. Should always include {@link #HIDDEN} * in the creation flags. + * @param windowType The type of the window as specified in WindowManager.java. + * @param ownerUid A unique per-app ID. * * @throws throws OutOfResourcesException If the SurfaceControl cannot be created. */ public SurfaceControl(SurfaceSession session, - String name, int w, int h, int format, int flags) + String name, int w, int h, int format, int flags, int windowType, int ownerUid) throws OutOfResourcesException { - this(session, name, w, h, format, flags, null); + this(session, name, w, h, format, flags, null, windowType, ownerUid); } public SurfaceControl(SurfaceSession session, - String name, int w, int h, int format, int flags, SurfaceControl parent) + String name, int w, int h, int format, int flags) + throws OutOfResourcesException { + this(session, name, w, h, format, flags, null, -1, -1); + } + + public SurfaceControl(SurfaceSession session, String name, int w, int h, int format, int flags, + SurfaceControl parent, int windowType, int ownerUid) throws OutOfResourcesException { if (session == null) { throw new IllegalArgumentException("session must not be null"); @@ -310,7 +318,8 @@ public class SurfaceControl { } mName = name; - mNativeObject = nativeCreate(session, name, w, h, format, flags, parent != null ? parent.mNativeObject : 0); + mNativeObject = nativeCreate(session, name, w, h, format, flags, + parent != null ? parent.mNativeObject : 0, windowType, ownerUid); if (mNativeObject == 0) { throw new OutOfResourcesException( "Couldn't allocate SurfaceControl native object"); diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index ab3e3113e1a2a..6932702f73c63 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -98,16 +98,18 @@ static struct { // ---------------------------------------------------------------------------- static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj, - jstring nameStr, jint w, jint h, jint format, jint flags, jlong parentObject) { + jstring nameStr, jint w, jint h, jint format, jint flags, jlong parentObject, + jint windowType, jint ownerUid) { ScopedUtfChars name(env, nameStr); sp client(android_view_SurfaceSession_getClient(env, sessionObj)); SurfaceControl *parent = reinterpret_cast(parentObject); sp surface = client->createSurface( - String8(name.c_str()), w, h, format, flags, parent); + String8(name.c_str()), w, h, format, flags, parent, windowType, ownerUid); if (surface == NULL) { jniThrowException(env, OutOfResourcesException, NULL); return 0; } + surface->incStrong((void *)nativeCreate); return reinterpret_cast(surface.get()); } @@ -742,7 +744,7 @@ static jobject nativeGetHdrCapabilities(JNIEnv* env, jclass clazz, jobject token // ---------------------------------------------------------------------------- static const JNINativeMethod sSurfaceControlMethods[] = { - {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIIIJ)J", + {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIIIJII)J", (void*)nativeCreate }, {"nativeRelease", "(J)V", (void*)nativeRelease }, diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index d62c62e7b3288..9b96523af73f0 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2171,7 +2171,8 @@ public class WindowManagerService extends IWindowManager.Stub if (!win.mHasSurface) { result |= RELAYOUT_RES_SURFACE_CHANGED; } - WindowSurfaceController surfaceController = winAnimator.createSurfaceLocked(); + WindowSurfaceController surfaceController = winAnimator.createSurfaceLocked( + win.mAttrs.type, win.mOwnerUid); if (surfaceController != null) { surfaceController.getSurface(outSurface); if (SHOW_TRANSACTIONS) Slog.i(TAG_WM, " OUT SURFACE " + outSurface + ": copied"); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 19ef44cace33c..e7f3832578c15 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -577,7 +577,7 @@ class WindowStateAnimator { } } - WindowSurfaceController createSurfaceLocked() { + WindowSurfaceController createSurfaceLocked(int windowType, int ownerUid) { final WindowState w = mWin; if (w.restoreSavedSurface()) { if (DEBUG_ANIM) Slog.i(TAG, @@ -653,7 +653,7 @@ class WindowStateAnimator { mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession, attrs.getTitle().toString(), - width, height, format, flags, this); + width, height, format, flags, this, windowType, ownerUid); w.setHasSurface(true); diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index c48a58514c3d6..1096ede963167 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -79,8 +79,8 @@ class WindowSurfaceController { private final WindowManagerService mService; - public WindowSurfaceController(SurfaceSession s, - String name, int w, int h, int format, int flags, WindowStateAnimator animator) { + public WindowSurfaceController(SurfaceSession s, String name, int w, int h, int format, + int flags, WindowStateAnimator animator, int windowType, int ownerUid) { mAnimator = animator; mSurfaceW = w; @@ -98,13 +98,13 @@ class WindowSurfaceController { animator.mWin.mSubLayer < 0 && animator.mWin.mAppToken != null) { mSurfaceControl = new SurfaceControlWithBackground(s, - name, w, h, format, flags, animator.mWin.mAppToken); + name, w, h, format, flags, animator.mWin.mAppToken, windowType, ownerUid); } else if (DEBUG_SURFACE_TRACE) { mSurfaceControl = new SurfaceTrace( - s, name, w, h, format, flags); + s, name, w, h, format, flags, windowType, ownerUid); } else { mSurfaceControl = new SurfaceControl( - s, name, w, h, format, flags); + s, name, w, h, format, flags, windowType, ownerUid); } if (mService.mRoot.mSurfaceTraceEnabled) { @@ -569,9 +569,21 @@ class WindowSurfaceController { private float mDsdx, mDtdx, mDsdy, mDtdy; private final String mName; + public SurfaceTrace(SurfaceSession s, String name, int w, int h, int format, int flags, + int windowType, int ownerUid) + throws OutOfResourcesException { + super(s, name, w, h, format, flags, windowType, ownerUid); + mName = name != null ? name : "Not named"; + mSize.set(w, h); + if (LOG_SURFACE_TRACE) Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " + + Debug.getCallers(3)); + synchronized (sSurfaces) { + sSurfaces.add(0, this); + } + } + public SurfaceTrace(SurfaceSession s, - String name, int w, int h, int format, int flags) - throws OutOfResourcesException { + String name, int w, int h, int format, int flags) { super(s, name, w, h, format, flags); mName = name != null ? name : "Not named"; mSize.set(w, h); @@ -806,11 +818,10 @@ class WindowSurfaceController { public boolean mVisible = false; public int mLayer = -1; - public SurfaceControlWithBackground(SurfaceSession s, - String name, int w, int h, int format, int flags, - AppWindowToken token) - throws OutOfResourcesException { - super(s, name, w, h, format, flags); + public SurfaceControlWithBackground(SurfaceSession s, String name, int w, int h, int format, + int flags, AppWindowToken token, int windowType, int ownerUid) + throws OutOfResourcesException { + super(s, name, w, h, format, flags, windowType, ownerUid); mBackgroundControl = new SurfaceControl(s, name, w, h, PixelFormat.OPAQUE, flags | SurfaceControl.FX_SURFACE_DIM); mOpaque = (flags & SurfaceControl.OPAQUE) != 0;