package org.echoline.drawterm; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.os.SystemClock; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; import android.widget.CheckBox; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.security.spec.ECField; /** * Created by eli on 12/3/17. */ public class MySurfaceView extends SurfaceView { private Bitmap bmp; private int screenWidth, screenHeight; private MainActivity mainActivity; private float ws, hs; private Paint paint = new Paint(); public MySurfaceView(Context context, int w, int h, float ws, float hs) { super(context); screenHeight = h; screenWidth = w; this.ws = ws; this.hs = hs; mainActivity = (MainActivity)context; mainActivity.setWidth(screenWidth); mainActivity.setHeight(screenHeight); mainActivity.setWidthScale(ws); mainActivity.setHeightScale(hs); setWillNotDraw(false); Listener listener = new Listener(); listener.onPrimaryClipChanged(); ClipboardManager cm = (ClipboardManager)mainActivity.getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); if (cm != null) cm.addPrimaryClipChangedListener(listener); setOnTouchListener(new View.OnTouchListener() { private int[] mouse = new int[3]; @Override public boolean onTouch(View v, MotionEvent event) { CheckBox left = (CheckBox)mainActivity.findViewById(R.id.mouseLeft); CheckBox middle = (CheckBox)mainActivity.findViewById(R.id.mouseMiddle); CheckBox right = (CheckBox)mainActivity.findViewById(R.id.mouseRight); CheckBox up = (CheckBox)mainActivity.findViewById(R.id.mouseUp); CheckBox down = (CheckBox)mainActivity.findViewById(R.id.mouseDown); int buttons = (left.isChecked()? 1: 0) | (middle.isChecked()? 2: 0) | (right.isChecked()? 4: 0) | (up.isChecked()? 8: 0) | (down.isChecked()? 16: 0); if (event.getAction() == MotionEvent.ACTION_DOWN) { mouse[0] = Math.round(event.getX()); mouse[1] = Math.round(event.getY()); mouse[2] = buttons; mainActivity.setMouse(mouse); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { mouse[0] = Math.round(event.getX()); mouse[1] = Math.round(event.getY()); mouse[2] = buttons; mainActivity.setMouse(mouse); } else if (event.getAction() == MotionEvent.ACTION_UP) { mouse[0] = Math.round(event.getX()); mouse[1] = Math.round(event.getY()); mouse[2] = 0; mainActivity.setMouse(mouse); } return true; } }); bmp = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); new Thread(new Runnable() { private long last = 0; private long lastcb = 0; @Override public void run() { while (true) { if ((SystemClock.currentThreadTimeMillis() - last) > 15) { mainActivity.runOnUiThread(new Runnable() { @Override public void run() { MySurfaceView.this.invalidate(); } }); last = SystemClock.currentThreadTimeMillis(); } if ((SystemClock.currentThreadTimeMillis() - lastcb) > 1500) { String s = mainActivity.getSnarf(); ClipboardManager cm = (ClipboardManager)mainActivity.getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); if (cm != null) { ClipData cd = cm.getPrimaryClip(); String t = ""; if (cd != null) t = cd.getItemAt(0).coerceToText(mainActivity.getApplicationContext()).toString(); if (cd == null || !t.equals(s)) { cd = ClipData.newPlainText(null, s); cm.setPrimaryClip(cd); } } lastcb = SystemClock.currentThreadTimeMillis(); } try { Thread.sleep(15); } catch(Exception e) { } } } }).start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); IntBuffer intBuffer = ByteBuffer.wrap(mainActivity.getScreenData()).asIntBuffer(); int []ints = new int[intBuffer.remaining()]; intBuffer.get(ints); bmp.setPixels(ints, 0, screenWidth, 0, 0, screenWidth, screenHeight); canvas.save(); canvas.scale(ws, hs); canvas.drawBitmap(bmp, 0, 0, paint); canvas.restore(); } protected class Listener implements ClipboardManager.OnPrimaryClipChangedListener { public void onPrimaryClipChanged() { ClipboardManager cm = (ClipboardManager)mainActivity.getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE); if (cm != null) { ClipData cd = cm.getPrimaryClip(); if (cd != null) mainActivity.setSnarf((String) (cd.getItemAt(0).coerceToText(mainActivity.getApplicationContext()).toString())); } } } }