LibreOffice Module android (master) 1
LayerView.java
Go to the documentation of this file.
1/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
2 * This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6package org.mozilla.gecko.gfx;
7
8
9import android.content.Context;
10import android.content.res.Resources;
11import android.graphics.Bitmap;
12import android.graphics.BitmapFactory;
13import android.graphics.PixelFormat;
14import android.util.AttributeSet;
15import android.util.Log;
16import android.view.KeyEvent;
17import android.view.MotionEvent;
18import android.view.SurfaceHolder;
19import android.view.SurfaceView;
20import android.view.View;
21import android.view.ViewGroup;
22import android.view.inputmethod.EditorInfo;
23import android.view.inputmethod.InputConnection;
24import android.widget.FrameLayout;
25
29import org.libreoffice.R;
32
41public class LayerView extends FrameLayout {
42 private static String LOGTAG = LayerView.class.getName();
43
45 private PanZoomController mPanZoomController;
49
50 /* Must be a PAINT_xxx constant */
51 private int mPaintState = PAINT_NONE;
52 private boolean mFullScreen = false;
53
54 private SurfaceView mSurfaceView;
55
58 //TODO static because of registerCxxCompositor() function, should be fixed in the future
60
61 /* Flags used to determine when to show the painted surface. The integer
62 * order must correspond to the order in which these states occur. */
63 public static final int PAINT_NONE = 0;
64 public static final int PAINT_BEFORE_FIRST = 1;
65 public static final int PAINT_AFTER_FIRST = 2;
66
67 public LayerView(Context context, AttributeSet attrs) {
68 super(context, attrs);
70
71 mSurfaceView = new SurfaceView(context);
72 addView(mSurfaceView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
73
74 SurfaceHolder holder = mSurfaceView.getHolder();
75 holder.addCallback(new SurfaceListener());
76 holder.setFormat(PixelFormat.RGB_565);
77
78 mGLController = new GLController(this);
79 }
80
81 void connect(GeckoLayerClient layerClient) {
82 mLayerClient = layerClient;
83 mPanZoomController = mLayerClient.getPanZoomController();
84 mRenderer = new LayerRenderer(this);
86
87 setFocusable(true);
88 setFocusableInTouchMode(true);
89
91 setOnTouchListener(new OnSlideSwipeListener(getContext(), mLayerClient));
92 }
93
94 public void show() {
95 // Fix this if TextureView support is turned back on above
96 mSurfaceView.setVisibility(View.VISIBLE);
97 }
98
99 public void hide() {
100 // Fix this if TextureView support is turned back on above
101 mSurfaceView.setVisibility(View.INVISIBLE);
102 }
103
104 public void destroy() {
105 if (mLayerClient != null) {
107 }
108 if (mRenderer != null) {
110 }
111 }
112
113 public void setTouchIntercepter(final OnInterceptTouchListener touchIntercepter) {
114 // this gets run on the gecko thread, but for thread safety we want the assignment
115 // on the UI thread.
116 post(new Runnable() {
117 public void run() {
118 mTouchIntercepter = touchIntercepter;
119 }
120 });
121 }
122
123 public void setInputConnectionHandler(InputConnectionHandler inputConnectionHandler) {
124 mInputConnectionHandler = inputConnectionHandler;
125 }
126
127 @Override
128 public boolean onTouchEvent(MotionEvent event) {
129 if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
130 requestFocus();
131 }
132
133 if (mTouchIntercepter != null && mTouchIntercepter.onInterceptTouchEvent(this, event)) {
134 return true;
135 }
136 if (mPanZoomController != null && mPanZoomController.onTouchEvent(event)) {
137 return true;
138 }
139 if (mTouchIntercepter != null && mTouchIntercepter.onTouch(this, event)) {
140 return true;
141 }
142 return false;
143 }
144
145 @Override
146 public boolean onHoverEvent(MotionEvent event) {
147 return mTouchIntercepter != null && mTouchIntercepter.onTouch(this, event);
148 }
149
150 @Override
151 public boolean onGenericMotionEvent(MotionEvent event) {
152 return mPanZoomController != null && mPanZoomController.onMotionEvent(event);
153 }
154
156 public PanZoomController getPanZoomController() { return mPanZoomController; }
157
160 }
161
162 @Override
163 public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
164 if (mInputConnectionHandler != null)
166 return null;
167 }
168
169 @Override
170 public boolean onKeyPreIme(int keyCode, KeyEvent event) {
171 return mInputConnectionHandler != null && mInputConnectionHandler.onKeyPreIme(keyCode, event);
172 }
173
174 @Override
175 public boolean onKeyDown(int keyCode, KeyEvent event) {
176 return mInputConnectionHandler != null && mInputConnectionHandler.onKeyDown(keyCode, event);
177 }
178
179 @Override
180 public boolean onKeyLongPress(int keyCode, KeyEvent event) {
181 return mInputConnectionHandler != null && mInputConnectionHandler.onKeyLongPress(keyCode, event);
182 }
183
184 @Override
185 public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
186 return mInputConnectionHandler != null && mInputConnectionHandler.onKeyMultiple(keyCode, repeatCount, event);
187 }
188
189 @Override
190 public boolean onKeyUp(int keyCode, KeyEvent event) {
191 return mInputConnectionHandler != null && mInputConnectionHandler.onKeyUp(keyCode, event);
192 }
193
194 public void requestRender() {
195 if (mListener != null) {
197 }
198 }
199
200 public void addLayer(Layer layer) {
201 mRenderer.addLayer(layer);
202 }
203
204 public void removeLayer(Layer layer) {
205 mRenderer.removeLayer(layer);
206 }
207
208 public int getMaxTextureSize() {
210 }
211
212 public void setLayerRenderer(LayerRenderer renderer) {
213 mRenderer = renderer;
214 }
215
217 return mRenderer;
218 }
219
220 /* paintState must be a PAINT_xxx constant. The state will only be changed
221 * if paintState represents a state that occurs after the current state. */
222 public void setPaintState(int paintState) {
223 if (paintState > mPaintState) {
224 Log.d(LOGTAG, "LayerView paint state set to " + paintState);
225 mPaintState = paintState;
226 }
227 }
228
229 public int getPaintState() {
230 return mPaintState;
231 }
232
234 return mRenderer;
235 }
236
237 public void setListener(Listener listener) {
238 mListener = listener;
239 }
240
241 Listener getListener() {
242 return mListener;
243 }
244
246 return mGLController;
247 }
248
249 public Bitmap getDrawable(String name) {
250 Context context = getContext();
251 Resources resources = context.getResources();
252 String packageName = resources.getResourcePackageName(R.id.dummy_id_for_package_name_resolution);
253 int resourceID = resources.getIdentifier(name, "drawable", packageName);
254 BitmapFactory.Options options = new BitmapFactory.Options();
255 options.inScaled = false;
256 return BitmapFactory.decodeResource(context.getResources(), resourceID, options);
257 }
258
259 Bitmap getBackgroundPattern() {
260 return getDrawable("background");
261 }
262
263 Bitmap getShadowPattern() {
264 return getDrawable("shadow");
265 }
266
267 private void onSizeChanged(int width, int height) {
268 mGLController.surfaceChanged(width, height);
269
270 mLayerClient.setViewportSize(new FloatSize(width, height), false);
271
272 if (mListener != null) {
273 mListener.surfaceChanged(width, height);
274 }
275
277 }
278
279 private void onDestroyed() {
280 mGLController.surfaceDestroyed();
281
282 if (mListener != null) {
284 }
285 }
286
288 return mSurfaceView.getHolder();
289 }
290
293 try {
295 layerView.mListener.compositorCreated();
296 return layerView.getGLController();
297 } catch (Exception e) {
298 Log.e(LOGTAG, "Error registering compositor!", e);
299 return null;
300 }
301 }
302
303 public interface Listener {
307 void compositionResumeRequested(int width, int height);
308 void surfaceChanged(int width, int height);
309 }
310
311 private class SurfaceListener implements SurfaceHolder.Callback {
312 public void surfaceChanged(SurfaceHolder holder, int format, int width,
313 int height) {
314 onSizeChanged(width, height);
315 }
316
317 public void surfaceCreated(SurfaceHolder holder) {
318 if (mRenderControllerThread != null) {
320 }
321 }
322
323 public void surfaceDestroyed(SurfaceHolder holder) {
324 onDestroyed();
325 }
326 }
327
328 @Override
329 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
330 super.onLayout(changed, left, top, right, bottom);
331 if (changed) {
332 mLayerClient.setViewportSize(new FloatSize(right - left, bottom - top), true);
333 }
334 }
335
337
338 public synchronized void createGLThread() {
339 if (mRenderControllerThread != null) {
340 throw new LayerViewException ("createGLThread() called with a GL thread already in place!");
341 }
342
343 Log.e(LOGTAG, "### Creating GL thread!");
347 notifyAll();
348 }
349
350 public synchronized Thread destroyGLThread() {
351 // Wait for the GL thread to be started.
352 Log.e(LOGTAG, "### Waiting for GL thread to be created...");
353 while (mRenderControllerThread == null) {
354 try {
355 wait();
356 } catch (InterruptedException e) {
357 throw new RuntimeException(e);
358 }
359 }
360
361 Log.e(LOGTAG, "### Destroying GL thread!");
362 Thread thread = mRenderControllerThread;
364 setListener(null);
366 return thread;
367 }
368
369 public static class LayerViewException extends RuntimeException {
370 public static final long serialVersionUID = 1L;
371
372 LayerViewException(String e) {
373 super(e);
374 }
375 }
376
377 public void setFullScreen(boolean fullScreen) {
378 mFullScreen = fullScreen;
379 }
380
381 public boolean isFullScreen() {
382 return mFullScreen;
383 }
384}
Events and data that is queued and processed by LOKitThread.
Definition: LOEvent.java:21
static final int UPDATE_ZOOM_CONSTRAINTS
Definition: LOEvent.java:39
Common static LOKit functions, functions to send events.
Definition: LOKitShell.java:26
static void sendEvent(LOEvent event)
Make sure LOKitThread is running and send event to it.
Definition: LOKitShell.java:72
Main activity of the LibreOffice App.
ImmutableViewportMetrics getViewportMetrics()
Implementation of PanZoomTarget.
ImmutableViewportMetrics are used to store the viewport metrics in way that we can access a version o...
The layer renderer implements the rendering logic for a layer view.
void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
Definition: LayerView.java:312
void surfaceDestroyed(SurfaceHolder holder)
Definition: LayerView.java:323
A view rendered by the layer compositor.
Definition: LayerView.java:41
static final int PAINT_BEFORE_FIRST
Definition: LayerView.java:64
static GLController registerCxxCompositor()
This function is invoked by Gecko (compositor thread) via JNI; be careful when modifying signature.
Definition: LayerView.java:292
RenderControllerThread mRenderControllerThread
Definition: LayerView.java:336
LayerView(Context context, AttributeSet attrs)
Definition: LayerView.java:67
static LibreOfficeMainActivity mContext
Definition: LayerView.java:59
boolean onKeyLongPress(int keyCode, KeyEvent event)
Definition: LayerView.java:180
PanZoomController getPanZoomController()
Definition: LayerView.java:156
void setListener(Listener listener)
Definition: LayerView.java:237
OnInterceptTouchListener mTouchIntercepter
Definition: LayerView.java:57
LayerRenderer getLayerRenderer()
Definition: LayerView.java:216
void setTouchIntercepter(final OnInterceptTouchListener touchIntercepter)
Definition: LayerView.java:113
GeckoLayerClient mLayerClient
Definition: LayerView.java:44
void setLayerRenderer(LayerRenderer renderer)
Definition: LayerView.java:212
boolean onGenericMotionEvent(MotionEvent event)
Definition: LayerView.java:151
boolean onTouchEvent(MotionEvent event)
Definition: LayerView.java:128
void setFullScreen(boolean fullScreen)
Definition: LayerView.java:377
boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
Definition: LayerView.java:185
PanZoomController mPanZoomController
Definition: LayerView.java:45
synchronized Thread destroyGLThread()
Definition: LayerView.java:350
InputConnectionHandler mInputConnectionHandler
Definition: LayerView.java:47
void setPaintState(int paintState)
Definition: LayerView.java:222
GeckoLayerClient getLayerClient()
Definition: LayerView.java:155
InputConnection onCreateInputConnection(EditorInfo outAttrs)
Definition: LayerView.java:163
Bitmap getDrawable(String name)
Definition: LayerView.java:249
boolean onHoverEvent(MotionEvent event)
Definition: LayerView.java:146
boolean onKeyUp(int keyCode, KeyEvent event)
Definition: LayerView.java:190
void setInputConnectionHandler(InputConnectionHandler inputConnectionHandler)
Definition: LayerView.java:123
void removeLayer(Layer layer)
Definition: LayerView.java:204
synchronized void createGLThread()
Definition: LayerView.java:338
void onLayout(boolean changed, int left, int top, int right, int bottom)
Definition: LayerView.java:329
ImmutableViewportMetrics getViewportMetrics()
Definition: LayerView.java:158
void onSizeChanged(int width, int height)
Definition: LayerView.java:267
static final int PAINT_AFTER_FIRST
Definition: LayerView.java:65
boolean onKeyDown(int keyCode, KeyEvent event)
Definition: LayerView.java:175
boolean onKeyPreIme(int keyCode, KeyEvent event)
Definition: LayerView.java:170
Thread which controls the rendering to OpenGL context.
OString right
OString top
OString bottom
const char * name
boolean onInterceptTouchEvent(View view, MotionEvent event)
Override this method for a chance to consume events before the view or its children.
InputConnection onCreateInputConnection(EditorInfo outAttrs)
boolean onKeyPreIme(int keyCode, KeyEvent event)
boolean onKeyLongPress(int keyCode, KeyEvent event)
boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
boolean onKeyUp(int keyCode, KeyEvent event)
boolean onKeyDown(int keyCode, KeyEvent event)
void compositionResumeRequested(int width, int height)
void surfaceChanged(int width, int height)
void SAL_CALL changed(::sal_Int32 ID, const css::uno::Sequence< css::beans::NamedValue > &Properties) override
def run(arg=None, arg2=-1)
@ Exception
PixelFormat
sal_uInt64 left
const sal_uInt8 R