Loading services/core/java/com/android/server/display/DisplayDevice.java +5 −1 Original line number Diff line number Diff line Loading @@ -108,8 +108,12 @@ abstract class DisplayDevice { /** * Sets the display state, if supported. * * @return A runnable containing work to be deferred until after we have * exited the critical section, or null if none. */ public void requestDisplayStateLocked(int state) { public Runnable requestDisplayStateLocked(int state) { return null; } /** Loading services/core/java/com/android/server/display/DisplayManagerService.java +34 −9 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** Loading Loading @@ -214,6 +215,11 @@ public final class DisplayManagerService extends SystemService { private final DisplayViewport mTempDefaultViewport = new DisplayViewport(); private final DisplayViewport mTempExternalTouchViewport = new DisplayViewport(); // Temporary list of deferred work to perform when setting the display state. // Only used by requestDisplayState. The field is self-synchronized and only // intended for use inside of the requestGlobalDisplayStateInternal function. private final ArrayList<Runnable> mTempDisplayStateWorkQueue = new ArrayList<Runnable>(); public DisplayManagerService(Context context) { super(context); mContext = context; Loading Loading @@ -318,13 +324,28 @@ public final class DisplayManagerService extends SystemService { } private void requestGlobalDisplayStateInternal(int state) { synchronized (mTempDisplayStateWorkQueue) { try { // Update the display state within the lock. synchronized (mSyncRoot) { if (mGlobalDisplayState != state) { mGlobalDisplayState = state; updateGlobalDisplayStateLocked(); updateGlobalDisplayStateLocked(mTempDisplayStateWorkQueue); scheduleTraversalLocked(false); } } // Setting the display power state can take hundreds of milliseconds // to complete so we defer the most expensive part of the work until // after we have exited the critical section to avoid blocking other // threads for a long time. for (int i = 0; i < mTempDisplayStateWorkQueue.size(); i++) { mTempDisplayStateWorkQueue.get(i).run(); } } finally { mTempDisplayStateWorkQueue.clear(); } } } private DisplayInfo getDisplayInfoInternal(int displayId, int callingUid) { Loading Loading @@ -669,21 +690,25 @@ public final class DisplayManagerService extends SystemService { scheduleTraversalLocked(false); } private void updateGlobalDisplayStateLocked() { private void updateGlobalDisplayStateLocked(List<Runnable> workQueue) { final int count = mDisplayDevices.size(); for (int i = 0; i < count; i++) { DisplayDevice device = mDisplayDevices.get(i); updateDisplayStateLocked(device); Runnable runnable = updateDisplayStateLocked(device); if (runnable != null) { workQueue.add(runnable); } } } private void updateDisplayStateLocked(DisplayDevice device) { private Runnable updateDisplayStateLocked(DisplayDevice device) { // Blank or unblank the display immediately to match the state requested // by the display power controller (if known). DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) { device.requestDisplayStateLocked(mGlobalDisplayState); return device.requestDisplayStateLocked(mGlobalDisplayState); } return null; } // Adds a new logical display based on the given display device. Loading services/core/java/com/android/server/display/LocalDisplayAdapter.java +20 −8 Original line number Diff line number Diff line Loading @@ -222,19 +222,31 @@ final class LocalDisplayAdapter extends DisplayAdapter { } @Override public void requestDisplayStateLocked(int state) { public Runnable requestDisplayStateLocked(final int state) { if (mState != state) { final int displayId = mBuiltInDisplayId; final IBinder token = getDisplayTokenLocked(); final int mode = getPowerModeForState(state); mState = state; updateDeviceInfoLocked(); // Defer actually setting the display power mode until we have exited // the critical section since it can take hundreds of milliseconds // to complete. return new Runnable() { @Override public void run() { Trace.traceBegin(Trace.TRACE_TAG_POWER, "requestDisplayState(" + Display.stateToString(state) + ", id=" + mBuiltInDisplayId + ")"); + Display.stateToString(state) + ", id=" + displayId + ")"); try { SurfaceControl.setDisplayPowerMode(getDisplayTokenLocked(), mode); SurfaceControl.setDisplayPowerMode(token, mode); } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); } mState = state; updateDeviceInfoLocked(); } }; } return null; } @Override Loading services/core/java/com/android/server/display/VirtualDisplayAdapter.java +2 −1 Original line number Diff line number Diff line Loading @@ -188,7 +188,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter { } @Override public void requestDisplayStateLocked(int state) { public Runnable requestDisplayStateLocked(int state) { if (state != mDisplayState) { mDisplayState = state; if (state == Display.STATE_OFF) { Loading @@ -197,6 +197,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter { mCallback.dispatchDisplayResumed(); } } return null; } @Override Loading Loading
services/core/java/com/android/server/display/DisplayDevice.java +5 −1 Original line number Diff line number Diff line Loading @@ -108,8 +108,12 @@ abstract class DisplayDevice { /** * Sets the display state, if supported. * * @return A runnable containing work to be deferred until after we have * exited the critical section, or null if none. */ public void requestDisplayStateLocked(int state) { public Runnable requestDisplayStateLocked(int state) { return null; } /** Loading
services/core/java/com/android/server/display/DisplayManagerService.java +34 −9 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** Loading Loading @@ -214,6 +215,11 @@ public final class DisplayManagerService extends SystemService { private final DisplayViewport mTempDefaultViewport = new DisplayViewport(); private final DisplayViewport mTempExternalTouchViewport = new DisplayViewport(); // Temporary list of deferred work to perform when setting the display state. // Only used by requestDisplayState. The field is self-synchronized and only // intended for use inside of the requestGlobalDisplayStateInternal function. private final ArrayList<Runnable> mTempDisplayStateWorkQueue = new ArrayList<Runnable>(); public DisplayManagerService(Context context) { super(context); mContext = context; Loading Loading @@ -318,13 +324,28 @@ public final class DisplayManagerService extends SystemService { } private void requestGlobalDisplayStateInternal(int state) { synchronized (mTempDisplayStateWorkQueue) { try { // Update the display state within the lock. synchronized (mSyncRoot) { if (mGlobalDisplayState != state) { mGlobalDisplayState = state; updateGlobalDisplayStateLocked(); updateGlobalDisplayStateLocked(mTempDisplayStateWorkQueue); scheduleTraversalLocked(false); } } // Setting the display power state can take hundreds of milliseconds // to complete so we defer the most expensive part of the work until // after we have exited the critical section to avoid blocking other // threads for a long time. for (int i = 0; i < mTempDisplayStateWorkQueue.size(); i++) { mTempDisplayStateWorkQueue.get(i).run(); } } finally { mTempDisplayStateWorkQueue.clear(); } } } private DisplayInfo getDisplayInfoInternal(int displayId, int callingUid) { Loading Loading @@ -669,21 +690,25 @@ public final class DisplayManagerService extends SystemService { scheduleTraversalLocked(false); } private void updateGlobalDisplayStateLocked() { private void updateGlobalDisplayStateLocked(List<Runnable> workQueue) { final int count = mDisplayDevices.size(); for (int i = 0; i < count; i++) { DisplayDevice device = mDisplayDevices.get(i); updateDisplayStateLocked(device); Runnable runnable = updateDisplayStateLocked(device); if (runnable != null) { workQueue.add(runnable); } } } private void updateDisplayStateLocked(DisplayDevice device) { private Runnable updateDisplayStateLocked(DisplayDevice device) { // Blank or unblank the display immediately to match the state requested // by the display power controller (if known). DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked(); if ((info.flags & DisplayDeviceInfo.FLAG_NEVER_BLANK) == 0) { device.requestDisplayStateLocked(mGlobalDisplayState); return device.requestDisplayStateLocked(mGlobalDisplayState); } return null; } // Adds a new logical display based on the given display device. Loading
services/core/java/com/android/server/display/LocalDisplayAdapter.java +20 −8 Original line number Diff line number Diff line Loading @@ -222,19 +222,31 @@ final class LocalDisplayAdapter extends DisplayAdapter { } @Override public void requestDisplayStateLocked(int state) { public Runnable requestDisplayStateLocked(final int state) { if (mState != state) { final int displayId = mBuiltInDisplayId; final IBinder token = getDisplayTokenLocked(); final int mode = getPowerModeForState(state); mState = state; updateDeviceInfoLocked(); // Defer actually setting the display power mode until we have exited // the critical section since it can take hundreds of milliseconds // to complete. return new Runnable() { @Override public void run() { Trace.traceBegin(Trace.TRACE_TAG_POWER, "requestDisplayState(" + Display.stateToString(state) + ", id=" + mBuiltInDisplayId + ")"); + Display.stateToString(state) + ", id=" + displayId + ")"); try { SurfaceControl.setDisplayPowerMode(getDisplayTokenLocked(), mode); SurfaceControl.setDisplayPowerMode(token, mode); } finally { Trace.traceEnd(Trace.TRACE_TAG_POWER); } mState = state; updateDeviceInfoLocked(); } }; } return null; } @Override Loading
services/core/java/com/android/server/display/VirtualDisplayAdapter.java +2 −1 Original line number Diff line number Diff line Loading @@ -188,7 +188,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter { } @Override public void requestDisplayStateLocked(int state) { public Runnable requestDisplayStateLocked(int state) { if (state != mDisplayState) { mDisplayState = state; if (state == Display.STATE_OFF) { Loading @@ -197,6 +197,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter { mCallback.dispatchDisplayResumed(); } } return null; } @Override Loading