package com.google.android.diskusage.opengl; import android.graphics.Canvas; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import com.google.android.diskusage.DiskUsage; import com.google.android.diskusage.FileSystemState; import com.google.android.diskusage.FileSystemState.FileSystemView; import com.google.android.diskusage.FileSystemState.MyMotionEvent; public final class FileSystemViewGPU extends SurfaceView implements FileSystemView, SurfaceHolder.Callback { FileSystemState eventHandler; private AbstractRenderingThread thread; public FileSystemViewGPU(DiskUsage context, FileSystemState eventHandler) { super(context); this.eventHandler = eventHandler; setFocusable(true); setFocusableInTouchMode(true); Log.d("diskusage", "new FileSystemViewGPU"); // setBackgroundColor(Color.GRAY); SurfaceHolder holder = getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); holder.setSizeFromLayout(); holder.addCallback(this); eventHandler.setView(this); thread = new RenderingThread(context, eventHandler); thread.start(); } @Override public final boolean onTouchEvent(final MotionEvent ev) { final MyMotionEvent myev = eventHandler.multitouchHandler.newMyMotionEvent(ev); ; thread.addEvent(new Runnable() { @Override public void run() { eventHandler.onTouchEvent(myev); } }); return true; } public final void runInRenderThread(final Runnable r) { thread.addEvent(r); } public void requestRepaintGPU() { if (thread != null) { thread.addEmptyEvent(); } } public void requestRepaint() {} public void requestRepaint(int l, int t, int r, int b) {} @Override protected final void onDraw(final Canvas canvas) {} @Override public final boolean onKeyDown(final int keyCode, final KeyEvent event) { thread.addEvent(new Runnable() { @Override public void run() { eventHandler.onKeyDown(keyCode, event); } }); switch (keyCode) { case KeyEvent.KEYCODE_BACK: case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_UP: case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_SEARCH: return true; }; return super.onKeyDown(keyCode, event); } @Override protected final void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); // eventHandler.onLayout(changed, left, top, right, bottom, getWidth(), getHeight()); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d("diskusage", "surfaceChange = " + width + "x" + height); thread.addEvent(thread.new SurfaceChangedEvent(holder, width, height)); requestRepaintGPU(); } @Override public void surfaceCreated(SurfaceHolder holder) { thread.addEvent(thread.new SurfaceAvailableEvent(holder, true)); } @Override public void surfaceDestroyed(SurfaceHolder holder) { holder.removeCallback(this); thread.addEvent(thread.new SurfaceAvailableEvent(holder, false)); } @Override protected void onDetachedFromWindow() { Log.d("diskusage", "FileSystemViewGPU.onDetachedFromWindow"); super.onDetachedFromWindow(); thread.addEvent(thread.new ExitEvent()); } @Override public void invalidate() { super.invalidate(); requestRepaintGPU(); } @Override public void killRenderThread() { thread.addEvent(thread.new ExitEvent()); // FIXME: doesn't work // try { // thread.join(); // } catch (InterruptedException e) { // thread.interrupt(); // } } }