* commit 'aa32f5f0db25a1553a353d93274f12432e5d07fc': Refactor for multi-display support.
This commit is contained in:
@@ -27,6 +27,7 @@ import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.hardware.SystemSensorManager;
|
||||
import android.hardware.display.DisplayManager;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
@@ -35,6 +36,7 @@ import android.os.SystemClock;
|
||||
import android.util.Slog;
|
||||
import android.util.Spline;
|
||||
import android.util.TimeUtils;
|
||||
import android.view.Display;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
@@ -428,7 +430,8 @@ final class DisplayPowerController {
|
||||
|
||||
private void initialize() {
|
||||
final Executor executor = AsyncTask.THREAD_POOL_EXECUTOR;
|
||||
mPowerState = new DisplayPowerState(new ElectronBeam(),
|
||||
Display display = DisplayManager.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY);
|
||||
mPowerState = new DisplayPowerState(new ElectronBeam(display),
|
||||
new PhotonicModulator(executor,
|
||||
mLights.getLight(LightsService.LIGHT_ID_BACKLIGHT),
|
||||
mSuspendBlocker));
|
||||
|
||||
@@ -33,7 +33,6 @@ import android.view.Display;
|
||||
import android.view.DisplayInfo;
|
||||
import android.view.Surface;
|
||||
import android.view.SurfaceSession;
|
||||
import android.view.WindowManagerImpl;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.ByteBuffer;
|
||||
@@ -68,6 +67,7 @@ final class ElectronBeam {
|
||||
private boolean mPrepared;
|
||||
private boolean mWarmUp;
|
||||
|
||||
private final Display mDisplay;
|
||||
private final DisplayInfo mDisplayInfo = new DisplayInfo();
|
||||
private int mDisplayLayerStack; // layer stack associated with primary display
|
||||
private int mDisplayRotation;
|
||||
@@ -90,7 +90,8 @@ final class ElectronBeam {
|
||||
private final FloatBuffer mVertexBuffer = createNativeFloatBuffer(8);
|
||||
private final FloatBuffer mTexCoordBuffer = createNativeFloatBuffer(8);
|
||||
|
||||
public ElectronBeam() {
|
||||
public ElectronBeam(Display display) {
|
||||
mDisplay = display;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -109,9 +110,8 @@ final class ElectronBeam {
|
||||
mWarmUp = warmUp;
|
||||
|
||||
// Get the display size and adjust it for rotation.
|
||||
Display display = WindowManagerImpl.getDefault().getDefaultDisplay();
|
||||
display.getDisplayInfo(mDisplayInfo);
|
||||
mDisplayLayerStack = display.getDisplayId();
|
||||
mDisplay.getDisplayInfo(mDisplayInfo);
|
||||
mDisplayLayerStack = mDisplay.getLayerStack();
|
||||
mDisplayRotation = mDisplayInfo.rotation;
|
||||
if (mDisplayRotation == Surface.ROTATION_90
|
||||
|| mDisplayRotation == Surface.ROTATION_270) {
|
||||
|
||||
@@ -42,6 +42,7 @@ class ScreenRotationAnimation {
|
||||
static final int FREEZE_LAYER = WindowManagerService.TYPE_LAYER_MULTIPLIER * 200;
|
||||
|
||||
final Context mContext;
|
||||
final Display mDisplay;
|
||||
Surface mSurface;
|
||||
BlackFrame mCustomBlackFrame;
|
||||
BlackFrame mExitingBlackFrame;
|
||||
@@ -186,9 +187,10 @@ class ScreenRotationAnimation {
|
||||
pw.println();
|
||||
}
|
||||
|
||||
public ScreenRotationAnimation(Context context, SurfaceSession session,
|
||||
public ScreenRotationAnimation(Context context, Display display, SurfaceSession session,
|
||||
boolean inTransaction, int originalWidth, int originalHeight, int originalRotation) {
|
||||
mContext = context;
|
||||
mDisplay = display;
|
||||
|
||||
// Screenshot does NOT include rotation!
|
||||
if (originalRotation == Surface.ROTATION_90
|
||||
@@ -213,13 +215,13 @@ class ScreenRotationAnimation {
|
||||
try {
|
||||
try {
|
||||
if (WindowManagerService.DEBUG_SURFACE_TRACE) {
|
||||
mSurface = new SurfaceTrace(session, 0, "FreezeSurface", Display.DEFAULT_DISPLAY,
|
||||
mWidth, mHeight,
|
||||
PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
|
||||
mSurface = new SurfaceTrace(session, 0, "FreezeSurface",
|
||||
mDisplay.getLayerStack(), mWidth, mHeight,
|
||||
PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
|
||||
} else {
|
||||
mSurface = new Surface(session, 0, "FreezeSurface", Display.DEFAULT_DISPLAY,
|
||||
mWidth, mHeight,
|
||||
PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
|
||||
mSurface = new Surface(session, 0, "FreezeSurface",
|
||||
mDisplay.getLayerStack(), mWidth, mHeight,
|
||||
PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN);
|
||||
}
|
||||
if (!mSurface.isValid()) {
|
||||
// Screenshot failed, punt.
|
||||
|
||||
@@ -22,8 +22,6 @@ import android.graphics.Color;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Region;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Slog;
|
||||
import android.view.Display;
|
||||
import android.view.Surface;
|
||||
import android.view.SurfaceSession;
|
||||
@@ -39,7 +37,7 @@ class StrictModeFlash {
|
||||
|
||||
public StrictModeFlash(Display display, SurfaceSession session) {
|
||||
try {
|
||||
mSurface = new Surface(session, 0, "StrictModeFlash", Display.DEFAULT_DISPLAY,
|
||||
mSurface = new Surface(session, 0, "StrictModeFlash", display.getLayerStack(),
|
||||
1, 1, PixelFormat.TRANSLUCENT, 0);
|
||||
} catch (Surface.OutOfResourcesException e) {
|
||||
return;
|
||||
|
||||
@@ -35,6 +35,7 @@ import android.view.Surface.OutOfResourcesException;
|
||||
* Displays a watermark on top of the window manager's windows.
|
||||
*/
|
||||
class Watermark {
|
||||
final Display mDisplay;
|
||||
final String[] mTokens;
|
||||
final String mText;
|
||||
final Paint mTextPaint;
|
||||
@@ -50,7 +51,7 @@ class Watermark {
|
||||
int mLastDH;
|
||||
boolean mDrawNeeded;
|
||||
|
||||
Watermark(DisplayMetrics dm, SurfaceSession session, String[] tokens) {
|
||||
Watermark(Display display, DisplayMetrics dm, SurfaceSession session, String[] tokens) {
|
||||
if (false) {
|
||||
Log.i(WindowManagerService.TAG, "*********************** WATERMARK");
|
||||
for (int i=0; i<tokens.length; i++) {
|
||||
@@ -58,6 +59,7 @@ class Watermark {
|
||||
}
|
||||
}
|
||||
|
||||
mDisplay = display;
|
||||
mTokens = tokens;
|
||||
|
||||
StringBuilder builder = new StringBuilder(32);
|
||||
@@ -112,7 +114,7 @@ class Watermark {
|
||||
|
||||
try {
|
||||
mSurface = new Surface(session, 0,
|
||||
"WatermarkSurface", Display.DEFAULT_DISPLAY,
|
||||
"WatermarkSurface", mDisplay.getLayerStack(),
|
||||
1, 1, PixelFormat.TRANSLUCENT, 0);
|
||||
mSurface.setLayer(WindowManagerService.TYPE_LAYER_MULTIPLIER*100);
|
||||
mSurface.setPosition(0, 0);
|
||||
|
||||
@@ -127,7 +127,7 @@ import android.view.SurfaceSession;
|
||||
import android.view.View;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.WindowManager;
|
||||
import android.view.WindowManagerImpl;
|
||||
import android.view.WindowManagerGlobal;
|
||||
import android.view.WindowManagerPolicy;
|
||||
import android.view.WindowManager.LayoutParams;
|
||||
import android.view.WindowManagerPolicy.FakeWindow;
|
||||
@@ -2141,7 +2141,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
WindowManager.LayoutParams attrs, int viewVisibility, int displayId,
|
||||
Rect outContentInsets, InputChannel outInputChannel) {
|
||||
int res = mPolicy.checkAddPermission(attrs);
|
||||
if (res != WindowManagerImpl.ADD_OKAY) {
|
||||
if (res != WindowManagerGlobal.ADD_OKAY) {
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -2157,7 +2157,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
|
||||
if (mWindowMap.containsKey(client.asBinder())) {
|
||||
Slog.w(TAG, "Window " + client + " is already added");
|
||||
return WindowManagerImpl.ADD_DUPLICATE_ADD;
|
||||
return WindowManagerGlobal.ADD_DUPLICATE_ADD;
|
||||
}
|
||||
|
||||
if (attrs.type >= FIRST_SUB_WINDOW && attrs.type <= LAST_SUB_WINDOW) {
|
||||
@@ -2165,13 +2165,13 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
if (attachedWindow == null) {
|
||||
Slog.w(TAG, "Attempted to add window with token that is not a window: "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN;
|
||||
}
|
||||
if (attachedWindow.mAttrs.type >= FIRST_SUB_WINDOW
|
||||
&& attachedWindow.mAttrs.type <= LAST_SUB_WINDOW) {
|
||||
Slog.w(TAG, "Attempted to add window with token that is a sub-window: "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_SUBWINDOW_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_SUBWINDOW_TOKEN;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2182,22 +2182,22 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
&& attrs.type <= LAST_APPLICATION_WINDOW) {
|
||||
Slog.w(TAG, "Attempted to add application window with unknown token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
if (attrs.type == TYPE_INPUT_METHOD) {
|
||||
Slog.w(TAG, "Attempted to add input method window with unknown token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
if (attrs.type == TYPE_WALLPAPER) {
|
||||
Slog.w(TAG, "Attempted to add wallpaper window with unknown token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
if (attrs.type == TYPE_DREAM) {
|
||||
Slog.w(TAG, "Attempted to add Dream window with unknown token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
token = new WindowToken(this, attrs.token, -1, false);
|
||||
addToken = true;
|
||||
@@ -2207,35 +2207,35 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
if (atoken == null) {
|
||||
Slog.w(TAG, "Attempted to add window with non-application token "
|
||||
+ token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_NOT_APP_TOKEN;
|
||||
return WindowManagerGlobal.ADD_NOT_APP_TOKEN;
|
||||
} else if (atoken.removed) {
|
||||
Slog.w(TAG, "Attempted to add window with exiting application token "
|
||||
+ token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_APP_EXITING;
|
||||
return WindowManagerGlobal.ADD_APP_EXITING;
|
||||
}
|
||||
if (attrs.type == TYPE_APPLICATION_STARTING && atoken.firstWindowDrawn) {
|
||||
// No need for this guy!
|
||||
if (localLOGV) Slog.v(
|
||||
TAG, "**** NO NEED TO START: " + attrs.getTitle());
|
||||
return WindowManagerImpl.ADD_STARTING_NOT_NEEDED;
|
||||
return WindowManagerGlobal.ADD_STARTING_NOT_NEEDED;
|
||||
}
|
||||
} else if (attrs.type == TYPE_INPUT_METHOD) {
|
||||
if (token.windowType != TYPE_INPUT_METHOD) {
|
||||
Slog.w(TAG, "Attempted to add input method window with bad token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
} else if (attrs.type == TYPE_WALLPAPER) {
|
||||
if (token.windowType != TYPE_WALLPAPER) {
|
||||
Slog.w(TAG, "Attempted to add wallpaper window with bad token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
} else if (attrs.type == TYPE_DREAM) {
|
||||
if (token.windowType != TYPE_DREAM) {
|
||||
Slog.w(TAG, "Attempted to add Dream window with bad token "
|
||||
+ attrs.token + ". Aborting.");
|
||||
return WindowManagerImpl.ADD_BAD_APP_TOKEN;
|
||||
return WindowManagerGlobal.ADD_BAD_APP_TOKEN;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2247,13 +2247,13 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
// continue.
|
||||
Slog.w(TAG, "Adding window client " + client.asBinder()
|
||||
+ " that is dead, aborting.");
|
||||
return WindowManagerImpl.ADD_APP_EXITING;
|
||||
return WindowManagerGlobal.ADD_APP_EXITING;
|
||||
}
|
||||
|
||||
mPolicy.adjustWindowParamsLw(win.mAttrs);
|
||||
|
||||
res = mPolicy.prepareAddWindowLw(win, attrs);
|
||||
if (res != WindowManagerImpl.ADD_OKAY) {
|
||||
if (res != WindowManagerGlobal.ADD_OKAY) {
|
||||
return res;
|
||||
}
|
||||
|
||||
@@ -2269,7 +2269,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
|
||||
// From now on, no exceptions or errors allowed!
|
||||
|
||||
res = WindowManagerImpl.ADD_OKAY;
|
||||
res = WindowManagerGlobal.ADD_OKAY;
|
||||
|
||||
origId = Binder.clearCallingIdentity();
|
||||
|
||||
@@ -2313,10 +2313,10 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
mPolicy.getContentInsetHintLw(attrs, outContentInsets);
|
||||
|
||||
if (mInTouchMode) {
|
||||
res |= WindowManagerImpl.ADD_FLAG_IN_TOUCH_MODE;
|
||||
res |= WindowManagerGlobal.ADD_FLAG_IN_TOUCH_MODE;
|
||||
}
|
||||
if (win.mAppToken == null || !win.mAppToken.clientHidden) {
|
||||
res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE;
|
||||
res |= WindowManagerGlobal.ADD_FLAG_APP_VISIBLE;
|
||||
}
|
||||
|
||||
mInputMonitor.setUpdateInputWindowsNeededLw();
|
||||
@@ -2748,7 +2748,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
|
||||
winAnimator.mSurfaceDestroyDeferred =
|
||||
(flags&WindowManagerImpl.RELAYOUT_DEFER_SURFACE_DESTROY) != 0;
|
||||
(flags&WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY) != 0;
|
||||
|
||||
int attrChanges = 0;
|
||||
int flagChanges = 0;
|
||||
@@ -2967,7 +2967,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
|
||||
mLayoutNeeded = true;
|
||||
win.mGivenInsetsPending = (flags&WindowManagerImpl.RELAYOUT_INSETS_PENDING) != 0;
|
||||
win.mGivenInsetsPending = (flags&WindowManagerGlobal.RELAYOUT_INSETS_PENDING) != 0;
|
||||
if (assignLayers) {
|
||||
assignLayersLocked(win.getWindowList());
|
||||
}
|
||||
@@ -3010,10 +3010,10 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
|
||||
Binder.restoreCallingIdentity(origId);
|
||||
|
||||
return (inTouchMode ? WindowManagerImpl.RELAYOUT_RES_IN_TOUCH_MODE : 0)
|
||||
| (toBeDisplayed ? WindowManagerImpl.RELAYOUT_RES_FIRST_TIME : 0)
|
||||
| (surfaceChanged ? WindowManagerImpl.RELAYOUT_RES_SURFACE_CHANGED : 0)
|
||||
| (animating ? WindowManagerImpl.RELAYOUT_RES_ANIMATING : 0);
|
||||
return (inTouchMode ? WindowManagerGlobal.RELAYOUT_RES_IN_TOUCH_MODE : 0)
|
||||
| (toBeDisplayed ? WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME : 0)
|
||||
| (surfaceChanged ? WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED : 0)
|
||||
| (animating ? WindowManagerGlobal.RELAYOUT_RES_ANIMATING : 0);
|
||||
}
|
||||
|
||||
public void performDeferredDestroyWindow(Session session, IWindow client) {
|
||||
@@ -9629,7 +9629,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
|
||||
// TODO(multidisplay): rotation on main screen only.
|
||||
DisplayInfo displayInfo = getDefaultDisplayContent().getDisplayInfo();
|
||||
mAnimator.mScreenRotationAnimation = new ScreenRotationAnimation(mContext,
|
||||
mAnimator.mScreenRotationAnimation = new ScreenRotationAnimation(mContext, mDisplay,
|
||||
mFxSession, inTransaction, displayInfo.logicalWidth, displayInfo.logicalHeight,
|
||||
mDisplay.getRotation());
|
||||
}
|
||||
@@ -9742,7 +9742,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
if (line != null) {
|
||||
String[] toks = line.split("%");
|
||||
if (toks != null && toks.length > 0) {
|
||||
mWatermark = new Watermark(mRealDisplayMetrics, mFxSession, toks);
|
||||
mWatermark = new Watermark(mDisplay, mRealDisplayMetrics, mFxSession, toks);
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
|
||||
@@ -474,24 +474,14 @@ 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";
|
||||
private int mLayerStack;
|
||||
private String mName;
|
||||
|
||||
public SurfaceTrace(SurfaceSession s,
|
||||
int pid, int displayId, int w, int h, int format, int flags) throws
|
||||
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));
|
||||
}
|
||||
|
||||
public SurfaceTrace(SurfaceSession s,
|
||||
int pid, String name, int displayId, int w, int h, int format, int flags)
|
||||
int pid, String name, int layerStack, int w, int h, int format, int flags)
|
||||
throws OutOfResourcesException {
|
||||
super(s, pid, name, displayId, w, h, format, flags);
|
||||
mName = name;
|
||||
super(s, pid, name, layerStack, w, h, format, flags);
|
||||
mName = name != null ? name : "Not named";
|
||||
mSize.set(w, h);
|
||||
Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by "
|
||||
+ Debug.getCallers(3));
|
||||
@@ -550,10 +540,10 @@ class WindowStateAnimator {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDisplayId(int displayId) {
|
||||
super.setDisplayId(displayId);
|
||||
mDisplayId = displayId;
|
||||
Slog.v(SURFACE_TAG, "setDisplayId: " + this + ". Called by " + Debug.getCallers(3));
|
||||
public void setLayerStack(int layerStack) {
|
||||
super.setLayerStack(layerStack);
|
||||
mLayerStack = layerStack;
|
||||
Slog.v(SURFACE_TAG, "setLayerStack: " + this + ". Called by " + Debug.getCallers(3));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -597,7 +587,7 @@ class WindowStateAnimator {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " "
|
||||
+ mName + " (" + mDisplayId + "): shown=" + mShown + " layer=" + mLayer
|
||||
+ mName + " (" + mLayerStack + "): shown=" + mShown + " layer=" + mLayer
|
||||
+ " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y
|
||||
+ " " + mSize.x + "x" + mSize.y
|
||||
+ " crop=" + mWindowCrop.toShortString();
|
||||
|
||||
Reference in New Issue
Block a user