You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
NOTE: the main addition in this commit is WIP support for apps which render on an EGL surface obtained using ANativeWindow_fromSurface currently, this EGL surface is obtained by creating a 700x700 pixel window with GLFW (the 700x700 size is hardcoded in several places) and only Wayland is supported ideally, we'd want to use a wayland subsurface to position the EGL surface above the Surface widget it's associated with (and do whatever for X11)
197 lines
5.0 KiB
Java
197 lines
5.0 KiB
Java
package android.view;
|
|
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Rect;
|
|
|
|
import android.content.Context;
|
|
|
|
public class SurfaceView extends View {
|
|
|
|
public SurfaceView(Context context) {
|
|
super(context);
|
|
|
|
native_constructor(context);
|
|
}
|
|
|
|
private native void native_constructor(Context context);
|
|
|
|
public SurfaceHolder getHolder() {
|
|
return mSurfaceHolder;
|
|
}
|
|
|
|
void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {}
|
|
|
|
final Surface mSurface = new Surface();
|
|
|
|
private final SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
|
|
private static final String LOG_TAG = "SurfaceHolder";
|
|
|
|
@Override
|
|
public boolean isCreating() {
|
|
// return mIsCreating;
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public void addCallback(Callback callback) {
|
|
/* synchronized (mCallbacks) {
|
|
// This is a linear search, but in practice we'll
|
|
// have only a couple callbacks, so it doesn't matter.
|
|
if (mCallbacks.contains(callback) == false) {
|
|
mCallbacks.add(callback);
|
|
}
|
|
}*/
|
|
}
|
|
|
|
@Override
|
|
public void removeCallback(Callback callback) {
|
|
/* synchronized (mCallbacks) {
|
|
mCallbacks.remove(callback);
|
|
}*/
|
|
}
|
|
|
|
@Override
|
|
public void setFixedSize(int width, int height) {
|
|
/* if (mRequestedWidth != width || mRequestedHeight != height) {
|
|
mRequestedWidth = width;
|
|
mRequestedHeight = height;
|
|
requestLayout();
|
|
}*/
|
|
}
|
|
|
|
@Override
|
|
public void setSizeFromLayout() {
|
|
/* if (mRequestedWidth != -1 || mRequestedHeight != -1) {
|
|
mRequestedWidth = mRequestedHeight = -1;
|
|
requestLayout();
|
|
}*/
|
|
}
|
|
|
|
@Override
|
|
public void setFormat(int format) {
|
|
/*
|
|
// for backward compatibility reason, OPAQUE always
|
|
// means 565 for SurfaceView
|
|
if (format == PixelFormat.OPAQUE)
|
|
format = PixelFormat.RGB_565;
|
|
|
|
mRequestedFormat = format;
|
|
if (mWindow != null) {
|
|
updateWindow(false, false);
|
|
}*/
|
|
}
|
|
|
|
/**
|
|
* @deprecated setType is now ignored.
|
|
*/
|
|
@Override
|
|
@Deprecated
|
|
public void setType(int type) { }
|
|
|
|
@Override
|
|
public void setKeepScreenOn(boolean screenOn) {
|
|
// Message msg = mHandler.obtainMessage(KEEP_SCREEN_ON_MSG);
|
|
// msg.arg1 = screenOn ? 1 : 0;
|
|
// mHandler.sendMessage(msg);
|
|
}
|
|
|
|
/**
|
|
* Gets a {@link Canvas} for drawing into the SurfaceView's Surface
|
|
*
|
|
* After drawing into the provided {@link Canvas}, the caller must
|
|
* invoke {@link #unlockCanvasAndPost} to post the new contents to the surface.
|
|
*
|
|
* The caller must redraw the entire surface.
|
|
* @return A canvas for drawing into the surface.
|
|
*/
|
|
@Override
|
|
public Canvas lockCanvas() {
|
|
// return internalLockCanvas(null);
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Gets a {@link Canvas} for drawing into the SurfaceView's Surface
|
|
*
|
|
* After drawing into the provided {@link Canvas}, the caller must
|
|
* invoke {@link #unlockCanvasAndPost} to post the new contents to the surface.
|
|
*
|
|
* @param inOutDirty A rectangle that represents the dirty region that the caller wants
|
|
* to redraw. This function may choose to expand the dirty rectangle if for example
|
|
* the surface has been resized or if the previous contents of the surface were
|
|
* not available. The caller must redraw the entire dirty region as represented
|
|
* by the contents of the inOutDirty rectangle upon return from this function.
|
|
* The caller may also pass <code>null</code> instead, in the case where the
|
|
* entire surface should be redrawn.
|
|
* @return A canvas for drawing into the surface.
|
|
*/
|
|
@Override
|
|
public Canvas lockCanvas(Rect inOutDirty) {
|
|
// return internalLockCanvas(inOutDirty);
|
|
return null;
|
|
}
|
|
|
|
private final Canvas internalLockCanvas(Rect dirty) {
|
|
/* mSurfaceLock.lock();
|
|
|
|
if (DEBUG) Log.i(TAG, "Locking canvas... stopped="
|
|
+ mDrawingStopped + ", win=" + mWindow);
|
|
|
|
Canvas c = null;
|
|
if (!mDrawingStopped && mWindow != null) {
|
|
try {
|
|
c = mSurface.lockCanvas(dirty);
|
|
} catch (Exception e) {
|
|
Log.e(LOG_TAG, "Exception locking surface", e);
|
|
}
|
|
}
|
|
|
|
if (DEBUG) Log.i(TAG, "Returned canvas: " + c);
|
|
if (c != null) {
|
|
mLastLockTime = SystemClock.uptimeMillis();
|
|
return c;
|
|
}
|
|
|
|
// If the Surface is not ready to be drawn, then return null,
|
|
// but throttle calls to this function so it isn't called more
|
|
// than every 100ms.
|
|
long now = SystemClock.uptimeMillis();
|
|
long nextTime = mLastLockTime + 100;
|
|
if (nextTime > now) {
|
|
try {
|
|
Thread.sleep(nextTime-now);
|
|
} catch (InterruptedException e) {
|
|
}
|
|
now = SystemClock.uptimeMillis();
|
|
}
|
|
mLastLockTime = now;
|
|
mSurfaceLock.unlock();
|
|
*/
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Posts the new contents of the {@link Canvas} to the surface and
|
|
* releases the {@link Canvas}.
|
|
*
|
|
* @param canvas The canvas previously obtained from {@link #lockCanvas}.
|
|
*/
|
|
@Override
|
|
public void unlockCanvasAndPost(Canvas canvas) {
|
|
// mSurface.unlockCanvasAndPost(canvas);
|
|
// mSurfaceLock.unlock();
|
|
}
|
|
|
|
@Override
|
|
public Surface getSurface() {
|
|
return mSurface;
|
|
}
|
|
|
|
@Override
|
|
public Rect getSurfaceFrame() {
|
|
// return mSurfaceFrame;
|
|
return null;
|
|
}
|
|
};
|
|
}
|