Loading core/java/android/view/SurfaceView.java +24 −4 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ import java.util.concurrent.locks.ReentrantLock; * artifacts may occur on previous versions of the platform when its window is * positioned asynchronously.</p> */ public class SurfaceView extends View { public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallback { private static final String TAG = "SurfaceView"; private static final boolean DEBUG = false; Loading Loading @@ -169,6 +169,8 @@ public class SurfaceView extends View { boolean mWindowVisibility = false; boolean mLastWindowVisibility = false; boolean mViewVisibility = false; boolean mWindowStopped = false; int mRequestedWidth = -1; int mRequestedHeight = -1; /* Set SurfaceView's format to 565 by default to maintain backward Loading Loading @@ -226,12 +228,27 @@ public class SurfaceView extends View { return mSurfaceHolder; } private void updateRequestedVisibility() { mRequestedVisible = mViewVisibility && mWindowVisibility && !mWindowStopped; } /** @hide */ @Override public void windowStopped(boolean stopped) { mWindowStopped = stopped; updateRequestedVisibility(); updateSurface(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); getViewRootImpl().addWindowStoppedCallback(this); mParent.requestTransparentRegion(this); mViewVisibility = getVisibility() == VISIBLE; mRequestedVisible = mViewVisibility && mWindowVisibility; updateRequestedVisibility(); mAttachedToWindow = true; if (!mGlobalListenersAdded) { Loading @@ -246,7 +263,7 @@ public class SurfaceView extends View { protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); mWindowVisibility = visibility == VISIBLE; mRequestedVisible = mWindowVisibility && mViewVisibility; updateRequestedVisibility(); updateSurface(); } Loading @@ -254,7 +271,7 @@ public class SurfaceView extends View { public void setVisibility(int visibility) { super.setVisibility(visibility); mViewVisibility = visibility == VISIBLE; boolean newRequestedVisible = mWindowVisibility && mViewVisibility; boolean newRequestedVisible = mWindowVisibility && mViewVisibility && !mWindowStopped; if (newRequestedVisible != mRequestedVisible) { // our base class (View) invalidates the layout only when // we go from/to the GONE state. However, SurfaceView needs Loading @@ -278,6 +295,8 @@ public class SurfaceView extends View { @Override protected void onDetachedFromWindow() { getViewRootImpl().removeWindowStoppedCallback(this); mAttachedToWindow = false; if (mGlobalListenersAdded) { ViewTreeObserver observer = getViewTreeObserver(); Loading @@ -299,6 +318,7 @@ public class SurfaceView extends View { mSurfaceControl = null; mHaveFrame = false; super.onDetachedFromWindow(); } Loading core/java/android/view/ViewRootImpl.java +17 −0 Original line number Diff line number Diff line Loading @@ -1249,6 +1249,19 @@ public final class ViewRootImpl implements ViewParent, mIsAmbientMode = ambient; } interface WindowStoppedCallback { public void windowStopped(boolean stopped); } private final ArrayList<WindowStoppedCallback> mWindowStoppedCallbacks = new ArrayList<>(); void addWindowStoppedCallback(WindowStoppedCallback c) { mWindowStoppedCallbacks.add(c); } void removeWindowStoppedCallback(WindowStoppedCallback c) { mWindowStoppedCallbacks.remove(c); } void setWindowStopped(boolean stopped) { if (mStopped != stopped) { mStopped = stopped; Loading @@ -1264,6 +1277,10 @@ public final class ViewRootImpl implements ViewParent, renderer.destroyHardwareResources(mView); } } for (int i = 0; i < mWindowStoppedCallbacks.size(); i++) { mWindowStoppedCallbacks.get(i).windowStopped(stopped); } } } Loading Loading
core/java/android/view/SurfaceView.java +24 −4 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ import java.util.concurrent.locks.ReentrantLock; * artifacts may occur on previous versions of the platform when its window is * positioned asynchronously.</p> */ public class SurfaceView extends View { public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallback { private static final String TAG = "SurfaceView"; private static final boolean DEBUG = false; Loading Loading @@ -169,6 +169,8 @@ public class SurfaceView extends View { boolean mWindowVisibility = false; boolean mLastWindowVisibility = false; boolean mViewVisibility = false; boolean mWindowStopped = false; int mRequestedWidth = -1; int mRequestedHeight = -1; /* Set SurfaceView's format to 565 by default to maintain backward Loading Loading @@ -226,12 +228,27 @@ public class SurfaceView extends View { return mSurfaceHolder; } private void updateRequestedVisibility() { mRequestedVisible = mViewVisibility && mWindowVisibility && !mWindowStopped; } /** @hide */ @Override public void windowStopped(boolean stopped) { mWindowStopped = stopped; updateRequestedVisibility(); updateSurface(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); getViewRootImpl().addWindowStoppedCallback(this); mParent.requestTransparentRegion(this); mViewVisibility = getVisibility() == VISIBLE; mRequestedVisible = mViewVisibility && mWindowVisibility; updateRequestedVisibility(); mAttachedToWindow = true; if (!mGlobalListenersAdded) { Loading @@ -246,7 +263,7 @@ public class SurfaceView extends View { protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); mWindowVisibility = visibility == VISIBLE; mRequestedVisible = mWindowVisibility && mViewVisibility; updateRequestedVisibility(); updateSurface(); } Loading @@ -254,7 +271,7 @@ public class SurfaceView extends View { public void setVisibility(int visibility) { super.setVisibility(visibility); mViewVisibility = visibility == VISIBLE; boolean newRequestedVisible = mWindowVisibility && mViewVisibility; boolean newRequestedVisible = mWindowVisibility && mViewVisibility && !mWindowStopped; if (newRequestedVisible != mRequestedVisible) { // our base class (View) invalidates the layout only when // we go from/to the GONE state. However, SurfaceView needs Loading @@ -278,6 +295,8 @@ public class SurfaceView extends View { @Override protected void onDetachedFromWindow() { getViewRootImpl().removeWindowStoppedCallback(this); mAttachedToWindow = false; if (mGlobalListenersAdded) { ViewTreeObserver observer = getViewTreeObserver(); Loading @@ -299,6 +318,7 @@ public class SurfaceView extends View { mSurfaceControl = null; mHaveFrame = false; super.onDetachedFromWindow(); } Loading
core/java/android/view/ViewRootImpl.java +17 −0 Original line number Diff line number Diff line Loading @@ -1249,6 +1249,19 @@ public final class ViewRootImpl implements ViewParent, mIsAmbientMode = ambient; } interface WindowStoppedCallback { public void windowStopped(boolean stopped); } private final ArrayList<WindowStoppedCallback> mWindowStoppedCallbacks = new ArrayList<>(); void addWindowStoppedCallback(WindowStoppedCallback c) { mWindowStoppedCallbacks.add(c); } void removeWindowStoppedCallback(WindowStoppedCallback c) { mWindowStoppedCallbacks.remove(c); } void setWindowStopped(boolean stopped) { if (mStopped != stopped) { mStopped = stopped; Loading @@ -1264,6 +1277,10 @@ public final class ViewRootImpl implements ViewParent, renderer.destroyHardwareResources(mView); } } for (int i = 0; i < mWindowStoppedCallbacks.size(); i++) { mWindowStoppedCallbacks.get(i).windowStopped(stopped); } } } Loading