summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/SurfaceView.java215
1 files changed, 63 insertions, 152 deletions
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 1812d291dd8f..7fdda2a22c17 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -33,7 +33,6 @@ import android.graphics.Region;
import android.graphics.RenderNode;
import android.os.Build;
import android.os.Handler;
-import android.os.IBinder;
import android.os.Looper;
import android.os.SystemClock;
import android.util.AttributeSet;
@@ -120,10 +119,11 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
final Rect mScreenRect = new Rect();
SurfaceSession mSurfaceSession;
- SurfaceControlWithBackground mSurfaceControl;
+ SurfaceControl mSurfaceControl;
// In the case of format changes we switch out the surface in-place
// we need to preserve the old one until the new one has drawn.
- SurfaceControlWithBackground mDeferredDestroySurfaceControl;
+ SurfaceControl mDeferredDestroySurfaceControl;
+ SurfaceControl mBackgroundControl;
final Rect mTmpRect = new Rect();
final Configuration mConfiguration = new Configuration();
@@ -487,6 +487,29 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
}
}
+ private void updateBackgroundVisibilityInTransaction(SurfaceControl viewRoot) {
+ if (mBackgroundControl == null) {
+ return;
+ }
+ if ((mSubLayer < 0) && ((mSurfaceFlags & SurfaceControl.OPAQUE) != 0)) {
+ mBackgroundControl.show();
+ mBackgroundControl.setRelativeLayer(viewRoot, Integer.MIN_VALUE);
+ } else {
+ mBackgroundControl.hide();
+ }
+ }
+
+ private void releaseSurfaces() {
+ if (mSurfaceControl != null) {
+ mSurfaceControl.remove();
+ mSurfaceControl = null;
+ }
+ if (mBackgroundControl != null) {
+ mBackgroundControl.remove();
+ mBackgroundControl = null;
+ }
+ }
+
/** @hide */
protected void updateSurface() {
if (!mHaveFrame) {
@@ -553,14 +576,21 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
updateOpaqueFlag();
final String name = "SurfaceView - " + viewRoot.getTitle().toString();
- mSurfaceControl = new SurfaceControlWithBackground(
- name,
- (mSurfaceFlags & SurfaceControl.OPAQUE) != 0,
- new SurfaceControl.Builder(mSurfaceSession)
- .setBufferSize(mSurfaceWidth, mSurfaceHeight)
- .setFormat(mFormat)
- .setParent(viewRoot.getSurfaceControl())
- .setFlags(mSurfaceFlags));
+ mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
+ .setName(name)
+ .setOpaque((mSurfaceFlags & SurfaceControl.OPAQUE) != 0)
+ .setBufferSize(mSurfaceWidth, mSurfaceHeight)
+ .setFormat(mFormat)
+ .setParent(viewRoot.getSurfaceControl())
+ .setFlags(mSurfaceFlags)
+ .build();
+ mBackgroundControl = new SurfaceControl.Builder(mSurfaceSession)
+ .setName("Background for -" + name)
+ .setOpaque(true)
+ .setColorLayer()
+ .setParent(mSurfaceControl)
+ .build();
+
} else if (mSurfaceControl == null) {
return;
}
@@ -577,11 +607,13 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
SurfaceControl.openTransaction();
try {
mSurfaceControl.setLayer(mSubLayer);
+
if (mViewVisibility) {
mSurfaceControl.show();
} else {
mSurfaceControl.hide();
}
+ updateBackgroundVisibilityInTransaction(viewRoot.getSurfaceControl());
// While creating the surface, we will set it's initial
// geometry. Outside of that though, we should generally
@@ -667,7 +699,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
}
if (creating) {
- mSurface.copyFrom(mSurfaceControl.mForegroundControl);
+ mSurface.copyFrom(mSurfaceControl);
}
if (sizeChanged && getContext().getApplicationInfo().targetSdkVersion
@@ -677,7 +709,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
// existing {@link Surface} will be ignored when the size changes.
// Therefore, we must explicitly recreate the {@link Surface} in these
// cases.
- mSurface.createFrom(mSurfaceControl.mForegroundControl);
+ mSurface.createFrom(mSurfaceControl);
}
if (visible && mSurface.isValid()) {
@@ -724,8 +756,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
if (mSurfaceControl != null && !mSurfaceCreated) {
mSurface.release();
- mSurfaceControl.remove();
- mSurfaceControl = null;
+ releaseSurfaces();
}
}
} catch (Exception ex) {
@@ -826,8 +857,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
private void setParentSpaceRectangle(Rect position, long frameNumber) {
final ViewRootImpl viewRoot = getViewRootImpl();
- applySurfaceTransforms(mSurfaceControl.mForegroundControl, position, frameNumber);
- applySurfaceTransforms(mSurfaceControl.mBackgroundControl, position, frameNumber);
+ applySurfaceTransforms(mSurfaceControl, position, frameNumber);
applyChildSurfaceTransaction_renderWorker(mRtTransaction, viewRoot.mSurface,
frameNumber);
@@ -892,13 +922,10 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
if (frameNumber > 0) {
final ViewRootImpl viewRoot = getViewRootImpl();
- mRtTransaction.deferTransactionUntilSurface(mSurfaceControl.mForegroundControl, viewRoot.mSurface,
- frameNumber);
- mRtTransaction.deferTransactionUntilSurface(mSurfaceControl.mBackgroundControl, viewRoot.mSurface,
+ mRtTransaction.deferTransactionUntilSurface(mSurfaceControl, viewRoot.mSurface,
frameNumber);
}
- mRtTransaction.hide(mSurfaceControl.mForegroundControl);
- mRtTransaction.hide(mSurfaceControl.mBackgroundControl);
+ mRtTransaction.hide(mSurfaceControl);
mRtTransaction.apply();
}
};
@@ -945,7 +972,19 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
* @hide
*/
public void setResizeBackgroundColor(int bgColor) {
- mSurfaceControl.setBackgroundColor(bgColor);
+ if (mBackgroundControl == null) {
+ return;
+ }
+
+ final float[] colorComponents = new float[] { Color.red(bgColor) / 255.f,
+ Color.green(bgColor) / 255.f, Color.blue(bgColor) / 255.f };
+
+ SurfaceControl.openTransaction();
+ try {
+ mBackgroundControl.setColor(colorComponents);
+ } finally {
+ SurfaceControl.closeTransaction();
+ }
}
@UnsupportedAppUsage
@@ -1129,134 +1168,6 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
* @return The SurfaceControl for this SurfaceView.
*/
public SurfaceControl getSurfaceControl() {
- return mSurfaceControl.mForegroundControl;
- }
-
- class SurfaceControlWithBackground {
- SurfaceControl mForegroundControl;
- SurfaceControl mBackgroundControl;
- private boolean mOpaque = true;
- public boolean mVisible = false;
-
- public SurfaceControlWithBackground(String name, boolean opaque, SurfaceControl.Builder b)
- throws Exception {
- mForegroundControl = b.setName(name).build();
- mBackgroundControl = b.setName("Background for -" + name)
- // Unset the buffer size of the background color layer.
- .setBufferSize(0, 0)
- .setColorLayer()
- .build();
-
- mOpaque = opaque;
- }
-
- public void setAlpha(float alpha) {
- mForegroundControl.setAlpha(alpha);
- mBackgroundControl.setAlpha(alpha);
- }
-
- public void setLayer(int zorder) {
- mForegroundControl.setLayer(zorder);
- // -3 is below all other child layers as SurfaceView never goes below -2
- mBackgroundControl.setLayer(-3);
- }
-
- public void setPosition(float x, float y) {
- mForegroundControl.setPosition(x, y);
- mBackgroundControl.setPosition(x, y);
- }
-
- public void setBufferSize(int w, int h) {
- mForegroundControl.setBufferSize(w, h);
- // The background surface is a color layer so we do not set a size.
- }
-
- public void setWindowCrop(Rect crop) {
- mForegroundControl.setWindowCrop(crop);
- mBackgroundControl.setWindowCrop(crop);
- }
-
- public void setWindowCrop(int width, int height) {
- mForegroundControl.setWindowCrop(width, height);
- mBackgroundControl.setWindowCrop(width, height);
- }
-
- public void setLayerStack(int layerStack) {
- mForegroundControl.setLayerStack(layerStack);
- mBackgroundControl.setLayerStack(layerStack);
- }
-
- public void setOpaque(boolean isOpaque) {
- mForegroundControl.setOpaque(isOpaque);
- mOpaque = isOpaque;
- updateBackgroundVisibility();
- }
-
- public void setSecure(boolean isSecure) {
- mForegroundControl.setSecure(isSecure);
- }
-
- public void setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
- mForegroundControl.setMatrix(dsdx, dtdx, dsdy, dtdy);
- mBackgroundControl.setMatrix(dsdx, dtdx, dsdy, dtdy);
- }
-
- public void hide() {
- mForegroundControl.hide();
- mVisible = false;
- updateBackgroundVisibility();
- }
-
- public void show() {
- mForegroundControl.show();
- mVisible = true;
- updateBackgroundVisibility();
- }
-
- public void remove() {
- mForegroundControl.remove();
- mBackgroundControl.remove();
- }
-
- public void release() {
- mForegroundControl.release();
- mBackgroundControl.release();
- }
-
- public void setTransparentRegionHint(Region region) {
- mForegroundControl.setTransparentRegionHint(region);
- mBackgroundControl.setTransparentRegionHint(region);
- }
-
- public void deferTransactionUntil(IBinder handle, long frame) {
- mForegroundControl.deferTransactionUntil(handle, frame);
- mBackgroundControl.deferTransactionUntil(handle, frame);
- }
-
- public void deferTransactionUntil(Surface barrier, long frame) {
- mForegroundControl.deferTransactionUntil(barrier, frame);
- mBackgroundControl.deferTransactionUntil(barrier, frame);
- }
-
- /** Set the color to fill the background with. */
- private void setBackgroundColor(int bgColor) {
- final float[] colorComponents = new float[] { Color.red(bgColor) / 255.f,
- Color.green(bgColor) / 255.f, Color.blue(bgColor) / 255.f };
-
- SurfaceControl.openTransaction();
- try {
- mBackgroundControl.setColor(colorComponents);
- } finally {
- SurfaceControl.closeTransaction();
- }
- }
-
- void updateBackgroundVisibility() {
- if (mOpaque && mVisible) {
- mBackgroundControl.show();
- } else {
- mBackgroundControl.hide();
- }
- }
+ return mSurfaceControl;
}
}