From 9de4936c99b979f6010440b043edc6d6142d1980 Mon Sep 17 00:00:00 2001 From: Craig Mautner Date: Thu, 2 Aug 2012 14:30:30 -0700 Subject: [PATCH] Add features to DisplayManager. Added Surface.setDisplayId(). Added callbacks to DisplayManagerService. Change-Id: Idd3f85f8ca1f1208962f1196efd6a3ab51c8c259 --- core/java/android/view/Surface.java | 2 + core/jni/android_view_Surface.cpp | 9 ++++ .../server/display/DisplayManagerService.java | 45 +++++++++++++++++-- .../server/wm/WindowStateAnimator.java | 11 ++++- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index abab2684489fe..5f5d1f297facc 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -469,6 +469,8 @@ public class Surface implements Parcelable { public native void setFlags(int flags, int mask); /** @hide */ public native void setWindowCrop(Rect crop); + /** @hide */ + public native void setDisplayId(int displayId); diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 3cd28b113a72a..3ad6406ea3833 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -717,6 +717,14 @@ static void Surface_setWindowCrop(JNIEnv* env, jobject thiz, jobject crop) } } +static void Surface_setDisplayId(JNIEnv* env, jobject thiz, jint displayId) +{ + const sp& surface(getSurfaceControl(env, thiz)); + if (surface == 0) return; + + // TODO(mathias): Everything. +} + // ---------------------------------------------------------------------------- static void Surface_copyFrom( @@ -855,6 +863,7 @@ static JNINativeMethod gSurfaceMethods[] = { {"writeToParcel", "(Landroid/os/Parcel;I)V", (void*)Surface_writeToParcel }, {"isConsumerRunningBehind", "()Z", (void*)Surface_isConsumerRunningBehind }, {"setWindowCrop", "(Landroid/graphics/Rect;)V", (void*)Surface_setWindowCrop }, + {"setDisplayId", "(I)V", (void*)Surface_setDisplayId }, }; void nativeClassInit(JNIEnv* env, jclass clazz) diff --git a/services/java/com/android/server/display/DisplayManagerService.java b/services/java/com/android/server/display/DisplayManagerService.java index b9c9ffde91aad..468bf21f8fd76 100644 --- a/services/java/com/android/server/display/DisplayManagerService.java +++ b/services/java/com/android/server/display/DisplayManagerService.java @@ -62,6 +62,9 @@ public final class DisplayManagerService extends IDisplayManager.Stub { /** All the DisplayInfos in the system indexed by deviceId */ private final SparseArray mDisplayInfos = new SparseArray(); + private final ArrayList mCallbacks = + new ArrayList(); + public DisplayManagerService() { mHeadless = SystemProperties.get(SYSTEM_HEADLESS).equals("1"); registerDefaultDisplayAdapter(); @@ -131,8 +134,20 @@ public final class DisplayManagerService extends IDisplayManager.Stub { * @param adapter The wrapper for information associated with the physical display. */ public void registerDisplayAdapter(DisplayAdapter adapter) { + + int displayId; + DisplayCallback[] callbacks; + synchronized (mLock) { - int displayId = mDisplayIdSeq++; + displayId = mDisplayIdSeq; + do { + // Find the next unused displayId. (Pretend like it might ever wrap around). + mDisplayIdSeq++; + if (mDisplayIdSeq < 0) { + mDisplayIdSeq = Display.DEFAULT_DISPLAY + 1; + } + } while (mDisplayInfos.get(mDisplayIdSeq) != null); + adapter.setDisplayId(displayId); createDisplayInfoLocked(displayId, adapter); @@ -142,6 +157,11 @@ public final class DisplayManagerService extends IDisplayManager.Stub { mLogicalToPhysicals.put(displayId, list); mDisplayAdapters.add(adapter); + callbacks = mCallbacks.toArray(new DisplayCallback[mCallbacks.size()]); + } + + for (int i = callbacks.length - 1; i >= 0; i--) { + callbacks[i].displayAdded(displayId); } // TODO: Notify SurfaceFlinger of new addition. @@ -188,7 +208,6 @@ public final class DisplayManagerService extends IDisplayManager.Stub { list = new ArrayList(); mLogicalToPhysicals.put(displayId, list); } - list.add(adapter); adapter.setDisplayId(displayId); } @@ -219,6 +238,20 @@ public final class DisplayManagerService extends IDisplayManager.Stub { // TODO: Notify SurfaceFlinger of removal. } + public void registerDisplayCallback(final DisplayCallback callback) { + synchronized (mLock) { + if (!mCallbacks.contains(callback)) { + mCallbacks.add(callback); + } + } + } + + public void unregisterDisplayCallback(final DisplayCallback callback) { + synchronized (mLock) { + mCallbacks.remove(callback); + } + } + /** * Create a new logical DisplayInfo and fill it in with information from the physical display. * @param displayId The logical identifier. @@ -288,11 +321,17 @@ public final class DisplayManagerService extends IDisplayManager.Stub { DisplayDeviceInfo info = new DisplayDeviceInfo(); for (DisplayAdapter adapter : mDisplayAdapters) { - pw.println("Display for adapter " + adapter.getName()); + pw.println("Display for adapter " + adapter.getName() + + " assigned to Display " + adapter.getDisplayId()); DisplayDevice device = adapter.getDisplayDevice(); pw.print(" "); device.getInfo(info); pw.println(info); } } + + public interface DisplayCallback { + public void displayAdded(int displayId); + public void displayRemoved(int displayId); + } } diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index f1c69f200858e..d931426a3bed0 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -474,6 +474,7 @@ class WindowStateAnimator { private final Point mSize = new Point(); private final Rect mWindowCrop = new Rect(); private boolean mShown = false; + private int mDisplayId; private String mName = "Not named"; public SurfaceTrace(SurfaceSession s, @@ -481,6 +482,7 @@ class WindowStateAnimator { OutOfResourcesException { super(s, pid, displayId, w, h, format, flags); mSize.set(w, h); + mDisplayId = displayId; Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " + Debug.getCallers(3)); } @@ -547,6 +549,13 @@ class WindowStateAnimator { + Debug.getCallers(3)); } + @Override + public void setDisplayId(int displayId) { + super.setDisplayId(displayId); + mDisplayId = displayId; + Slog.v(SURFACE_TAG, "setDisplayId: " + this + ". Called by " + Debug.getCallers(3)); + } + @Override public void hide() { super.hide(); @@ -588,7 +597,7 @@ class WindowStateAnimator { @Override public String toString() { return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " " - + mName + ": shown=" + mShown + " layer=" + mLayer + + mName + " (" + mDisplayId + "): shown=" + mShown + " layer=" + mLayer + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y + " " + mSize.x + "x" + mSize.y + " crop=" + mWindowCrop.toShortString();