aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/org/connectbot/TerminalView.java
diff options
context:
space:
mode:
authorRyan Hansberry <rhansby@gmail.com>2015-10-07 11:20:21 -0700
committerRyan Hansberry <rhansby@gmail.com>2015-10-07 11:20:21 -0700
commit17f70f5e62c4c5bee31d418bb4c94fd356e36cec (patch)
tree48fb37447e1f98aa26c833764238a911a0f71dfd /app/src/main/java/org/connectbot/TerminalView.java
parent9b8794d04cdfc2c226b6367c5c766bb9a79a1638 (diff)
downloadconnectbot-17f70f5e62c4c5bee31d418bb4c94fd356e36cec.tar.gz
connectbot-17f70f5e62c4c5bee31d418bb4c94fd356e36cec.tar.bz2
connectbot-17f70f5e62c4c5bee31d418bb4c94fd356e36cec.zip
Move old copying logic to TerminalView. Add comments to TerminalView.
Diffstat (limited to 'app/src/main/java/org/connectbot/TerminalView.java')
-rw-r--r--app/src/main/java/org/connectbot/TerminalView.java150
1 files changed, 119 insertions, 31 deletions
diff --git a/app/src/main/java/org/connectbot/TerminalView.java b/app/src/main/java/org/connectbot/TerminalView.java
index 42414b9..914b466 100644
--- a/app/src/main/java/org/connectbot/TerminalView.java
+++ b/app/src/main/java/org/connectbot/TerminalView.java
@@ -70,6 +70,10 @@ import de.mud.terminal.vt320;
* {@link android.app.Activity}. Handles drawing bitmap updates and passing keystrokes down
* to terminal.
*
+ * On Honeycomb devices and above (>= APIv11), a TextView with transparent text (which is identical
+ * to the bitmap) is drawn above the bitmap. This TextView exists to allow the user to
+ * select and copy text.
+ *
* @author jsharkey
*/
public class TerminalView extends TextView implements FontSizeChangedListener {
@@ -84,6 +88,9 @@ public class TerminalView extends TextView implements FontSizeChangedListener {
private ActionMode selectionActionMode = null;
private String currentSelection = "";
+ // These are only used for pre-Honeycomb copying.
+ private int lastTouchedRow, lastTouchedCol;
+
private final Paint paint;
private final Paint cursorPaint;
private final Paint cursorStrokePaint;
@@ -178,43 +185,43 @@ public class TerminalView extends TextView implements FontSizeChangedListener {
setTypeface(Typeface.MONOSPACE);
onFontSizeChanged(bridge.getFontSize());
+ // Allow selection of and copying text for Honeycomb and above devices.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
setTextIsSelectable(true);
-
setCustomSelectionActionModeCallback(new TextSelectionActionModeCallback());
+ }
- gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
- private TerminalBridge bridge = TerminalView.this.bridge;
- private float totalY = 0;
-
- @Override
- public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
- // if releasing then reset total scroll
- if (e2.getAction() == MotionEvent.ACTION_UP) {
- totalY = 0;
- }
+ gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
+ private TerminalBridge bridge = TerminalView.this.bridge;
+ private float totalY = 0;
- totalY += distanceY;
- final int moved = (int) (totalY / bridge.charHeight);
+ @Override
+ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
+ // if releasing then reset total scroll
+ if (e2.getAction() == MotionEvent.ACTION_UP) {
+ totalY = 0;
+ }
- if (moved != 0) {
- int base = bridge.buffer.getWindowBase();
- bridge.buffer.setWindowBase(base + moved);
- totalY = 0;
+ totalY += distanceY;
+ final int moved = (int) (totalY / bridge.charHeight);
- refreshTextFromBuffer();
- }
+ if (moved != 0) {
+ int base = bridge.buffer.getWindowBase();
+ bridge.buffer.setWindowBase(base + moved);
+ totalY = 0;
- return true;
+ refreshTextFromBuffer();
}
- @Override
- public boolean onSingleTapConfirmed(MotionEvent e) {
- viewPager.performClick();
- return super.onSingleTapConfirmed(e);
- }
- });
- }
+ return true;
+ }
+
+ @Override
+ public boolean onSingleTapConfirmed(MotionEvent e) {
+ viewPager.performClick();
+ return super.onSingleTapConfirmed(e);
+ }
+ });
}
@TargetApi(11)
@@ -253,10 +260,6 @@ public class TerminalView extends TextView implements FontSizeChangedListener {
@Override
public boolean onTouchEvent(MotionEvent event) {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
- return false;
- }
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH &&
MotionEventCompat.getSource(event) == InputDevice.SOURCE_MOUSE) {
if (onMouseEvent(event, bridge)) {
@@ -267,6 +270,76 @@ public class TerminalView extends TextView implements FontSizeChangedListener {
gestureDetector.onTouchEvent(event);
}
+ // Old version of copying, only for pre-Honeycomb.
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+ // when copying, highlight the area
+ if (bridge.isSelectingForCopy()) {
+ SelectionArea area = bridge.getSelectionArea();
+ int row = (int) Math.floor(event.getY() / bridge.charHeight);
+ int col = (int) Math.floor(event.getX() / bridge.charWidth);
+
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ // recording starting area
+ viewPager.setPagingEnabled(false);
+ if (area.isSelectingOrigin()) {
+ area.setRow(row);
+ area.setColumn(col);
+ lastTouchedRow = row;
+ lastTouchedCol = col;
+ bridge.redraw();
+ }
+ return true;
+ case MotionEvent.ACTION_MOVE:
+ /* ignore when user hasn't moved since last time so
+ * we can fine-tune with directional pad
+ */
+ if (row == lastTouchedRow && col == lastTouchedCol)
+ return true;
+
+ // if the user moves, start the selection for other corner
+ area.finishSelectingOrigin();
+
+ // update selected area
+ area.setRow(row);
+ area.setColumn(col);
+ lastTouchedRow = row;
+ lastTouchedCol = col;
+ bridge.redraw();
+ return true;
+ case MotionEvent.ACTION_UP:
+ /* If they didn't move their finger, maybe they meant to
+ * select the rest of the text with the directional pad.
+ */
+ if (area.getLeft() == area.getRight() &&
+ area.getTop() == area.getBottom()) {
+ return true;
+ }
+
+ // copy selected area to clipboard
+ String copiedText = area.copyFrom(bridge.buffer);
+
+ clipboard.setText(copiedText);
+ Toast.makeText(
+ context,
+ context.getString(R.string.console_copy_done, copiedText.length()),
+ Toast.LENGTH_LONG).show();
+
+ // fall through to clear state
+
+ case MotionEvent.ACTION_CANCEL:
+ // make sure we clear any highlighted area
+ area.reset();
+ bridge.setSelectingForCopy(false);
+ bridge.redraw();
+ viewPager.setPagingEnabled(true);
+ return true;
+ }
+ }
+
+ return true;
+ }
+
super.onTouchEvent(event);
return true;
@@ -485,6 +558,21 @@ public class TerminalView extends TextView implements FontSizeChangedListener {
setText(buffer);
}
+ /**
+ * Only intended for pre-Honeycomb devices.
+ */
+ public void startPreHoneycombCopyMode() {
+ // mark as copying and reset any previous bounds
+ SelectionArea area = bridge.getSelectionArea();
+ area.reset();
+ area.setBounds(bridge.buffer.getColumns(), bridge.buffer.getRows());
+
+ bridge.setSelectingForCopy(true);
+
+ // Make sure we show the initial selection
+ bridge.redraw();
+ }
+
public void destroy() {
// tell bridge to destroy its bitmap
bridge.parentDestroyed();