ContentViewRenderView.java revision cedac228d2dd51db4b79ea1e72c7f249408ee061
17c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Copyright 2012 The Chromium Authors. All rights reserved.
27c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// Use of this source code is governed by a BSD-style license that can be
37c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet// found in the LICENSE file.
47c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
57c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetpackage org.chromium.content.browser;
67c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
77c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport android.content.Context;
87c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport android.graphics.Color;
97c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport android.graphics.PixelFormat;
107c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport android.view.Surface;
117c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport android.view.SurfaceHolder;
127c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport android.view.SurfaceView;
137c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport android.widget.FrameLayout;
147c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
157c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport org.chromium.base.CalledByNative;
167c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport org.chromium.base.JNINamespace;
177c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetimport org.chromium.ui.base.WindowAndroid;
187c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
197c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet/***
207c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * This view is used by a ContentView to render its content.
217c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * Call {@link #setCurrentContentViewCore(ContentViewCore)} with the contentViewCore that should be
227c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * managing the view.
237c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet * Note that only one ContentViewCore can be shown at a time.
247c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet */
257c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet@JNINamespace("content")
267c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichetpublic class ContentViewRenderView extends FrameLayout {
277c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    // The native side of this object.
287c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    private long mNativeContentViewRenderView;
297c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    private final SurfaceHolder.Callback mSurfaceCallback;
307c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
317c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    private final SurfaceView mSurfaceView;
327c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    protected ContentViewCore mContentViewCore;
337c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
347c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    private ContentReadbackHandler mContentReadbackHandler;
357c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet
367c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    /**
377c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Constructs a new ContentViewRenderView that should be can to a view hierarchy.
387c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * Native code should add/remove the layers to be rendered through the ContentViewLayerRenderer.
397c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     * @param context The context used to create this.
407c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet     */
417c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet    public ContentViewRenderView(Context context, WindowAndroid rootWindow) {
427c9978567a202d6aa98beac5da5e1b3b34792862Jerome Poichet        super(context);
43        assert rootWindow != null;
44        mNativeContentViewRenderView = nativeInit(rootWindow.getNativePointer());
45        assert mNativeContentViewRenderView != 0;
46
47        mSurfaceView = createSurfaceView(getContext());
48        mSurfaceView.setZOrderMediaOverlay(true);
49        mSurfaceCallback = new SurfaceHolder.Callback() {
50            @Override
51            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
52                assert mNativeContentViewRenderView != 0;
53                nativeSurfaceChanged(mNativeContentViewRenderView,
54                        format, width, height, holder.getSurface());
55                if (mContentViewCore != null) {
56                    mContentViewCore.onPhysicalBackingSizeChanged(
57                            width, height);
58                }
59            }
60
61            @Override
62            public void surfaceCreated(SurfaceHolder holder) {
63                assert mNativeContentViewRenderView != 0;
64                nativeSurfaceCreated(mNativeContentViewRenderView);
65
66                onReadyToRender();
67            }
68
69            @Override
70            public void surfaceDestroyed(SurfaceHolder holder) {
71                assert mNativeContentViewRenderView != 0;
72                nativeSurfaceDestroyed(mNativeContentViewRenderView);
73            }
74        };
75        mSurfaceView.getHolder().addCallback(mSurfaceCallback);
76        setSurfaceViewBackgroundColor(Color.WHITE);
77
78        addView(mSurfaceView,
79                new FrameLayout.LayoutParams(
80                        FrameLayout.LayoutParams.MATCH_PARENT,
81                        FrameLayout.LayoutParams.MATCH_PARENT));
82
83        mContentReadbackHandler = new ContentReadbackHandler() {
84            @Override
85            protected boolean readyForReadback() {
86                return mNativeContentViewRenderView != 0 && mContentViewCore != null;
87            }
88        };
89        mContentReadbackHandler.initNativeContentReadbackHandler();
90    }
91
92    /**
93     * @return The content readback handler.
94     */
95    public ContentReadbackHandler getContentReadbackHandler() {
96        return mContentReadbackHandler;
97    }
98
99    /**
100     * Sets the background color of the surface view.  This method is necessary because the
101     * background color of ContentViewRenderView itself is covered by the background of
102     * SurfaceView.
103     * @param color The color of the background.
104     */
105    public void setSurfaceViewBackgroundColor(int color) {
106        if (mSurfaceView != null) {
107            mSurfaceView.setBackgroundColor(color);
108        }
109    }
110
111    /**
112     * Should be called when the ContentViewRenderView is not needed anymore so its associated
113     * native resource can be freed.
114     */
115    public void destroy() {
116        mContentReadbackHandler.destroy();
117        mContentReadbackHandler = null;
118        mSurfaceView.getHolder().removeCallback(mSurfaceCallback);
119        nativeDestroy(mNativeContentViewRenderView);
120        mNativeContentViewRenderView = 0;
121    }
122
123    public void setCurrentContentViewCore(ContentViewCore contentViewCore) {
124        assert mNativeContentViewRenderView != 0;
125        mContentViewCore = contentViewCore;
126
127        if (mContentViewCore != null) {
128            mContentViewCore.onPhysicalBackingSizeChanged(getWidth(), getHeight());
129            nativeSetCurrentContentViewCore(mNativeContentViewRenderView,
130                                            mContentViewCore.getNativeContentViewCore());
131        } else {
132            nativeSetCurrentContentViewCore(mNativeContentViewRenderView, 0);
133        }
134    }
135
136    /**
137     * This method should be subclassed to provide actions to be performed once the view is ready to
138     * render.
139     */
140    protected void onReadyToRender() {
141    }
142
143    /**
144     * This method could be subclassed optionally to provide a custom SurfaceView object to
145     * this ContentViewRenderView.
146     * @param context The context used to create the SurfaceView object.
147     * @return The created SurfaceView object.
148     */
149    protected SurfaceView createSurfaceView(Context context) {
150        return new SurfaceView(context);
151    }
152
153    /**
154     * @return whether the surface view is initialized and ready to render.
155     */
156    public boolean isInitialized() {
157        return mSurfaceView.getHolder().getSurface() != null;
158    }
159
160    /**
161     * Enter or leave overlay video mode.
162     * @param enabled Whether overlay mode is enabled.
163     */
164    public void setOverlayVideoMode(boolean enabled) {
165        int format = enabled ? PixelFormat.TRANSLUCENT : PixelFormat.OPAQUE;
166        mSurfaceView.getHolder().setFormat(format);
167        nativeSetOverlayVideoMode(mNativeContentViewRenderView, enabled);
168    }
169
170    /**
171     * Set the native layer tree helper for this {@link ContentViewRenderView}.
172     * @param layerTreeBuildHelperNativePtr Native pointer to the layer tree build helper.
173     */
174    public void setLayerTreeBuildHelper(long layerTreeBuildHelperNativePtr) {
175        nativeSetLayerTreeBuildHelper(mNativeContentViewRenderView, layerTreeBuildHelperNativePtr);
176    }
177
178    @CalledByNative
179    protected void onCompositorLayout() {
180    }
181
182    @CalledByNative
183    private void onSwapBuffersCompleted() {
184        if (mSurfaceView.getBackground() != null) {
185            post(new Runnable() {
186                @Override public void run() {
187                    mSurfaceView.setBackgroundResource(0);
188                }
189            });
190        }
191    }
192
193    private native long nativeInit(long rootWindowNativePointer);
194    private native void nativeDestroy(long nativeContentViewRenderView);
195    private native void nativeSetCurrentContentViewCore(long nativeContentViewRenderView,
196            long nativeContentViewCore);
197    private native void nativeSetLayerTreeBuildHelper(long nativeContentViewRenderView,
198            long buildHelperNativePtr);
199    private native void nativeSurfaceCreated(long nativeContentViewRenderView);
200    private native void nativeSurfaceDestroyed(long nativeContentViewRenderView);
201    private native void nativeSurfaceChanged(long nativeContentViewRenderView,
202            int format, int width, int height, Surface surface);
203    private native void nativeSetOverlayVideoMode(long nativeContentViewRenderView,
204            boolean enabled);
205}
206