diff options
author | Kenny Root <kenny@the-b.org> | 2009-07-09 18:14:17 +0000 |
---|---|---|
committer | Kenny Root <kenny@the-b.org> | 2009-07-09 18:14:17 +0000 |
commit | fac1309bac44d6ba4294ff397197ddb7baffb8ba (patch) | |
tree | be48fbda36e6c8745d8174f451e30211803ae501 | |
parent | d9ff9718e72836b418e0c9f33ba3fdc197e66055 (diff) | |
download | connectbot-fac1309bac44d6ba4294ff397197ddb7baffb8ba.tar.gz connectbot-fac1309bac44d6ba4294ff397197ddb7baffb8ba.tar.bz2 connectbot-fac1309bac44d6ba4294ff397197ddb7baffb8ba.zip |
Add menu item to scan for URLs in the current console
git-svn-id: https://connectbot.googlecode.com/svn/trunk/connectbot@365 df292f66-193f-0410-a5fc-6d59da041ff2
-rw-r--r-- | AndroidManifest.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 2 | ||||
-rw-r--r-- | src/org/connectbot/ConsoleActivity.java | 64 | ||||
-rw-r--r-- | src/org/connectbot/service/TerminalBridge.java | 25 |
4 files changed, 91 insertions, 2 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 49e923c..bc102c6 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2,7 +2,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.connectbot" android:versionName="1.6-dev" - android:versionCode="170"> + android:versionCode="171"> <application android:icon="@drawable/icon" diff --git a/res/values/strings.xml b/res/values/strings.xml index 999150e..1dd7441 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -290,6 +290,8 @@ <string name="console_menu_portforwards">Port Forwards</string> <!-- Button that brings user to the terminal resizing dialog where they can force a size. --> <string name="console_menu_resize">Force Size</string> + <!-- Button that brings up the list of URLs on the current screen --> + <string name="console_menu_urlscan">URL Scan</string> <!-- Selection for a "local" port forward. E.g., connections to a port listening locally is forwarded to the remote end's listening port. --> <string name="portforward_local">Local</string> diff --git a/src/org/connectbot/ConsoleActivity.java b/src/org/connectbot/ConsoleActivity.java index 2f217c2..2fff48d 100644 --- a/src/org/connectbot/ConsoleActivity.java +++ b/src/org/connectbot/ConsoleActivity.java @@ -18,6 +18,9 @@ package org.connectbot; +import java.lang.ref.WeakReference; +import java.util.List; + import org.connectbot.bean.HostBean; import org.connectbot.bean.PortForwardBean; import org.connectbot.bean.SelectionArea; @@ -28,6 +31,7 @@ import org.connectbot.util.PreferenceConstants; import android.app.Activity; import android.app.AlertDialog; +import android.app.Dialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -62,13 +66,17 @@ import android.view.View.OnTouchListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; +import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewFlipper; +import android.widget.AdapterView.OnItemClickListener; import com.nullwire.trace.ExceptionHandler; @@ -112,7 +120,7 @@ public class ConsoleActivity extends Activity { private InputMethodManager inputManager; - private MenuItem disconnect, copy, paste, portForward, resize; + private MenuItem disconnect, copy, paste, portForward, resize, urlscan; protected TerminalBridge copySource = null; private int lastTouchRow, lastTouchCol; @@ -718,6 +726,30 @@ public class ConsoleActivity extends Activity { } }); + urlscan = menu.add(R.string.console_menu_urlscan); + urlscan.setAlphabeticShortcut('u'); + urlscan.setIcon(android.R.drawable.ic_menu_search); + urlscan.setOnMenuItemClickListener(new OnMenuItemClickListener() { + public boolean onMenuItemClick(MenuItem item) { + final TerminalView terminalView = (TerminalView) findCurrentView(R.id.console_flip); + + List<String> urls = terminalView.bridge.scanForURLs(); + + Dialog urlDialog = new Dialog(ConsoleActivity.this); + urlDialog.setTitle(R.string.console_menu_urlscan); + + ListView urlListView = new ListView(ConsoleActivity.this); + URLItemListener urlListener = new URLItemListener(ConsoleActivity.this); + urlListView.setOnItemClickListener(urlListener); + + urlListView.setAdapter(new ArrayAdapter<String>(ConsoleActivity.this, android.R.layout.simple_list_item_1, urls)); + urlDialog.setContentView(urlListView); + urlDialog.show(); + + return true; + } + }); + resize = menu.add(R.string.console_menu_resize); resize.setAlphabeticShortcut('s'); resize.setIcon(android.R.drawable.ic_menu_crop); @@ -945,6 +977,36 @@ public class ConsoleActivity extends Activity { } } + private class URLItemListener implements OnItemClickListener { + private WeakReference<Context> contextRef; + + URLItemListener(Context context) { + this.contextRef = new WeakReference<Context>(context); + } + + public void onItemClick(AdapterView<?> arg0, View view, int position, long id) { + Context context = contextRef.get(); + + if (context == null) + return; + + try { + TextView urlView = (TextView) view; + + String url = urlView.getText().toString(); + if (url.indexOf("://") < 0) + url = "http://" + url; + + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + context.startActivity(intent); + } catch (Exception e) { + Log.e(TAG, "couldn't open URL", e); + // We should probably tell the user that we couldn't find a handler... + } + } + + } + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); diff --git a/src/org/connectbot/service/TerminalBridge.java b/src/org/connectbot/service/TerminalBridge.java index de507ad..500a821 100644 --- a/src/org/connectbot/service/TerminalBridge.java +++ b/src/org/connectbot/service/TerminalBridge.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.LinkedList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.connectbot.R; import org.connectbot.TerminalView; @@ -1279,4 +1281,27 @@ public class TerminalBridge implements VDUDisplay, OnKeyListener { color = manager.hostdb.getColorsForHost(host); } + + // This was taken from http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx + private final static String urlRegex = "(?:(?:ht|f)tp(?:s?)\\:\\/\\/|~/|/)?(?:\\w+:\\w+@)?(?:(?:[-\\w]+\\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\\d]{1,5})?(?:(?:(?:/(?:[-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|/)+|\\?|#)?(?:(?:\\?(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=(?:[-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)(?:&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=(?:[-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*(?:#(?:[-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?"; + private static Pattern urlPattern = null; + + /** + * @return + */ + public List<String> scanForURLs() { + List<String> urls = new LinkedList<String>(); + + if (urlPattern == null) + urlPattern = Pattern.compile(urlRegex); + + for (int l = 0; l < buffer.height; l++) { + Matcher urlMatcher = urlPattern.matcher( + new String(buffer.charArray[buffer.windowBase + l])); + while (urlMatcher.find()) + urls.add(urlMatcher.group()); + } + + return urls; + } } |