Blank all displays including Wifi Display when screen is off.

Calling blank() on Surface Flinger to turn the screen off is not
enough to ensure that the content is blanked to all virtual displays.
What's more, the black surface left in place by the ElectronBeam may
not completely hide the content (particularly if the display orientation
changes).  To fix this for real, we'll want to move the display power
management code from the power manager into the display manager
but we don't have time for that.

As a work around, force all displays to show an empty layer stack
with no surfaces on it while blanked.

Bug: 7311959
Change-Id: I870c985f9e76f3f2322e5d83cdbbed9ed15b9f10
diff --git a/services/java/com/android/server/display/DisplayManagerService.java b/services/java/com/android/server/display/DisplayManagerService.java
index 0a42528..93896af 100644
--- a/services/java/com/android/server/display/DisplayManagerService.java
+++ b/services/java/com/android/server/display/DisplayManagerService.java
@@ -305,6 +305,8 @@
                     DisplayDevice device = mDisplayDevices.get(i);
                     device.blankLocked();
                 }
+
+                scheduleTraversalLocked(false);
             }
         }
     }
@@ -322,6 +324,8 @@
                     DisplayDevice device = mDisplayDevices.get(i);
                     device.unblankLocked();
                 }
+
+                scheduleTraversalLocked(false);
             }
         }
     }
@@ -755,7 +759,9 @@
                     + device.getDisplayDeviceInfoLocked());
             return;
         } else {
-            display.configureDisplayInTransactionLocked(device);
+            boolean isBlanked = (mAllDisplayBlankStateFromPowerManager
+                    == DISPLAY_BLANK_STATE_BLANKED);
+            display.configureDisplayInTransactionLocked(device, isBlanked);
         }
 
         // Update the viewports if needed.
diff --git a/services/java/com/android/server/display/LogicalDisplay.java b/services/java/com/android/server/display/LogicalDisplay.java
index c4b749c..680662e 100644
--- a/services/java/com/android/server/display/LogicalDisplay.java
+++ b/services/java/com/android/server/display/LogicalDisplay.java
@@ -55,6 +55,10 @@
 final class LogicalDisplay {
     private final DisplayInfo mBaseDisplayInfo = new DisplayInfo();
 
+    // The layer stack we use when the display has been blanked to prevent any
+    // of its content from appearing.
+    private static final int BLANK_LAYER_STACK = -1;
+
     private final int mDisplayId;
     private final int mLayerStack;
     private DisplayInfo mOverrideDisplayInfo; // set by the window manager
@@ -217,13 +221,15 @@
      * where the display is being mirrored.
      *
      * @param device The display device to modify.
+     * @param isBlanked True if the device is being blanked.
      */
-    public void configureDisplayInTransactionLocked(DisplayDevice device) {
+    public void configureDisplayInTransactionLocked(DisplayDevice device,
+            boolean isBlanked) {
         final DisplayInfo displayInfo = getDisplayInfoLocked();
         final DisplayDeviceInfo displayDeviceInfo = device.getDisplayDeviceInfoLocked();
 
         // Set the layer stack.
-        device.setLayerStackInTransactionLocked(mLayerStack);
+        device.setLayerStackInTransactionLocked(isBlanked ? BLANK_LAYER_STACK : mLayerStack);
 
         // Set the viewport.
         // This is the area of the logical display that we intend to show on the