Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 102e97bb authored by Jeff Brown's avatar Jeff Brown Committed by Android Git Automerger
Browse files

am 8f4baad3: Merge "Blank or unblank all displays as need." into jb-mr1-dev

* commit '8f4baad3':
  Blank or unblank all displays as need.
parents 6cccadfb 8f4baad3
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -266,6 +266,8 @@ public class Surface implements Parcelable {
            IBinder displayToken, int orientation, Rect layerStackRect, Rect displayRect);
    private static native boolean nativeGetDisplayInfo(
            IBinder displayToken, PhysicalDisplayInfo outInfo);
    private static native void nativeBlankDisplay(IBinder displayToken);
    private static native void nativeUnblankDisplay(IBinder displayToken);

    private native void nativeCopyFrom(Surface other);
    private native void nativeTransferFrom(Surface other);
@@ -638,6 +640,22 @@ public class Surface implements Parcelable {
        return nativeGetDisplayInfo(displayToken, outInfo);
    }

    /** @hide */
    public static void blankDisplay(IBinder displayToken) {
        if (displayToken == null) {
            throw new IllegalArgumentException("displayToken must not be null");
        }
        nativeBlankDisplay(displayToken);
    }

    /** @hide */
    public static void unblankDisplay(IBinder displayToken) {
        if (displayToken == null) {
            throw new IllegalArgumentException("displayToken must not be null");
        }
        nativeUnblankDisplay(displayToken);
    }

    /**
     * Copy another surface to this one.  This surface now holds a reference
     * to the same data as the original surface, and is -not- the owner.
+21 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include <android_runtime/android_view_SurfaceSession.h>
#include <android_runtime/android_graphics_SurfaceTexture.h>
#include <utils/misc.h>
#include <utils/Log.h>

#include <ScopedUtfChars.h>

@@ -710,6 +711,22 @@ static jboolean nativeGetDisplayInfo(JNIEnv* env, jclass clazz,
    return JNI_TRUE;
}

static void nativeBlankDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) {
    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
    if (token == NULL) return;

    ALOGD_IF_SLOW(100, "Excessive delay in blankDisplay() while turning screen off");
    SurfaceComposerClient::blankDisplay(token);
}

static void nativeUnblankDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) {
    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
    if (token == NULL) return;

    ALOGD_IF_SLOW(100, "Excessive delay in unblankDisplay() while turning screen on");
    SurfaceComposerClient::unblankDisplay(token);
}

// ----------------------------------------------------------------------------

static void nativeCopyFrom(JNIEnv* env, jobject surfaceObj, jobject otherObj) {
@@ -832,6 +849,10 @@ static JNINativeMethod gSurfaceMethods[] = {
            (void*)nativeSetDisplayProjection },
    {"nativeGetDisplayInfo", "(Landroid/os/IBinder;Landroid/view/Surface$PhysicalDisplayInfo;)Z",
            (void*)nativeGetDisplayInfo },
    {"nativeBlankDisplay", "(Landroid/os/IBinder;)V",
            (void*)nativeBlankDisplay },
    {"nativeUnblankDisplay", "(Landroid/os/IBinder;)V",
            (void*)nativeUnblankDisplay },
    {"nativeCopyFrom", "(Landroid/view/Surface;)V",
            (void*)nativeCopyFrom },
    {"nativeTransferFrom", "(Landroid/view/Surface;)V",
+12 −0
Original line number Diff line number Diff line
@@ -104,6 +104,18 @@ abstract class DisplayDevice {
    public void performTraversalInTransactionLocked() {
    }

    /**
     * Blanks the display, if supported.
     */
    public void blankLocked() {
    }

    /**
     * Unblanks the display, if supported.
     */
    public void unblankLocked() {
    }

    /**
     * Sets the display layer stack while in a transaction.
     */
+62 −5
Original line number Diff line number Diff line
@@ -103,6 +103,10 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
    private static final int MSG_REQUEST_TRAVERSAL = 4;
    private static final int MSG_UPDATE_VIEWPORT = 5;

    private static final int DISPLAY_BLANK_STATE_UNKNOWN = 0;
    private static final int DISPLAY_BLANK_STATE_BLANKED = 1;
    private static final int DISPLAY_BLANK_STATE_UNBLANKED = 2;

    private final Context mContext;
    private final boolean mHeadless;
    private final DisplayManagerHandler mHandler;
@@ -141,6 +145,9 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
            new SparseArray<LogicalDisplay>();
    private int mNextNonDefaultDisplayId = Display.DEFAULT_DISPLAY + 1;

    // Set to true if all displays have been blanked by the power manager.
    private int mAllDisplayBlankStateFromPowerManager;

    // Set to true when there are pending display changes that have yet to be applied
    // to the surface flinger state.
    private boolean mPendingTraversal;
@@ -285,6 +292,40 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
        }
    }

    /**
     * Called by the power manager to blank all displays.
     */
    public void blankAllDisplaysFromPowerManager() {
        synchronized (mSyncRoot) {
            if (mAllDisplayBlankStateFromPowerManager != DISPLAY_BLANK_STATE_BLANKED) {
                mAllDisplayBlankStateFromPowerManager = DISPLAY_BLANK_STATE_BLANKED;

                final int count = mDisplayDevices.size();
                for (int i = 0; i < count; i++) {
                    DisplayDevice device = mDisplayDevices.get(i);
                    device.blankLocked();
                }
            }
        }
    }

    /**
     * Called by the power manager to unblank all displays.
     */
    public void unblankAllDisplaysFromPowerManager() {
        synchronized (mSyncRoot) {
            if (mAllDisplayBlankStateFromPowerManager != DISPLAY_BLANK_STATE_UNBLANKED) {
                mAllDisplayBlankStateFromPowerManager = DISPLAY_BLANK_STATE_UNBLANKED;

                final int count = mDisplayDevices.size();
                for (int i = 0; i < count; i++) {
                    DisplayDevice device = mDisplayDevices.get(i);
                    device.unblankLocked();
                }
            }
        }
    }

    /**
     * Returns information about the specified logical display.
     *
@@ -528,6 +569,17 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
            mDisplayDevices.add(device);
            addLogicalDisplayLocked(device);
            scheduleTraversalLocked(false);

            // Blank or unblank the display immediately to match the state requested
            // by the power manager (if known).
            switch (mAllDisplayBlankStateFromPowerManager) {
                case DISPLAY_BLANK_STATE_BLANKED:
                    device.blankLocked();
                    break;
                case DISPLAY_BLANK_STATE_UNBLANKED:
                    device.unblankLocked();
                    break;
            }
        }
    }

@@ -788,9 +840,18 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
        }

        pw.println("DISPLAY MANAGER (dumpsys display)");
        pw.println("  mHeadless=" + mHeadless);

        synchronized (mSyncRoot) {
            pw.println("  mHeadless=" + mHeadless);
            pw.println("  mOnlyCode=" + mOnlyCore);
            pw.println("  mSafeMode=" + mSafeMode);
            pw.println("  mPendingTraversal=" + mPendingTraversal);
            pw.println("  mAllDisplayBlankStateFromPowerManager="
                    + mAllDisplayBlankStateFromPowerManager);
            pw.println("  mNextNonDefaultDisplayId=" + mNextNonDefaultDisplayId);
            pw.println("  mDefaultViewport=" + mDefaultViewport);
            pw.println("  mExternalTouchViewport=" + mExternalTouchViewport);

            IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "    ");
            ipw.increaseIndent();

@@ -817,10 +878,6 @@ public final class DisplayManagerService extends IDisplayManager.Stub {
                pw.println("  Display " + displayId + ":");
                display.dumpLocked(ipw);
            }

            pw.println();
            pw.println("Default viewport: " + mDefaultViewport);
            pw.println("External touch viewport: " + mExternalTouchViewport);
        }
    }

+14 −0
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ final class LocalDisplayAdapter extends DisplayAdapter {

        private DisplayDeviceInfo mInfo;
        private boolean mHavePendingChanges;
        private boolean mBlanked;

        public LocalDisplayDevice(IBinder displayToken, int builtInDisplayId,
                PhysicalDisplayInfo phys) {
@@ -149,11 +150,24 @@ final class LocalDisplayAdapter extends DisplayAdapter {
            return mInfo;
        }

        @Override
        public void blankLocked() {
            mBlanked = true;
            Surface.blankDisplay(getDisplayTokenLocked());
        }

        @Override
        public void unblankLocked() {
            mBlanked = false;
            Surface.unblankDisplay(getDisplayTokenLocked());
        }

        @Override
        public void dumpLocked(PrintWriter pw) {
            super.dumpLocked(pw);
            pw.println("mBuiltInDisplayId=" + mBuiltInDisplayId);
            pw.println("mPhys=" + mPhys);
            pw.println("mBlanked=" + mBlanked);
        }
    }

Loading