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