aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/de/mud/telnet/TelnetProtocolHandler.java2
-rw-r--r--app/src/main/java/org/apache/harmony/niochar/charset/additional/IBM437.java4
-rw-r--r--app/src/main/java/org/connectbot/ActionBarWrapper.java89
-rw-r--r--app/src/main/java/org/connectbot/ConsoleActivity.java317
-rw-r--r--app/src/main/java/org/connectbot/EulaActivity.java34
-rw-r--r--app/src/main/java/org/connectbot/HelpActivity.java29
-rw-r--r--app/src/main/java/org/connectbot/HostListActivity.java21
-rw-r--r--app/src/main/java/org/connectbot/SettingsActivity.java7
-rw-r--r--app/src/main/java/org/connectbot/WizardActivity.java104
-rw-r--r--app/src/main/java/org/connectbot/service/TerminalBridge.java27
-rw-r--r--app/src/main/java/org/connectbot/service/TerminalManager.java13
-rw-r--r--app/src/main/java/org/connectbot/util/HostDatabase.java2
-rw-r--r--app/src/main/java/org/connectbot/util/PreferenceConstants.java2
13 files changed, 350 insertions, 301 deletions
diff --git a/app/src/main/java/de/mud/telnet/TelnetProtocolHandler.java b/app/src/main/java/de/mud/telnet/TelnetProtocolHandler.java
index 74f08bb..a2a5d71 100644
--- a/app/src/main/java/de/mud/telnet/TelnetProtocolHandler.java
+++ b/app/src/main/java/de/mud/telnet/TelnetProtocolHandler.java
@@ -382,7 +382,7 @@ public abstract class TelnetProtocolHandler {
if (b>=128)
b=(byte)(b-256);
if(debug > 2) {
- Byte B = new Byte(b);
+ Byte B = Byte.valueOf(b);
System.err.print("byte: " + B.intValue()+ " ");
}
switch (neg_state) {
diff --git a/app/src/main/java/org/apache/harmony/niochar/charset/additional/IBM437.java b/app/src/main/java/org/apache/harmony/niochar/charset/additional/IBM437.java
index d61ef59..2835d1b 100644
--- a/app/src/main/java/org/apache/harmony/niochar/charset/additional/IBM437.java
+++ b/app/src/main/java/org/apache/harmony/niochar/charset/additional/IBM437.java
@@ -53,7 +53,7 @@ public class IBM437 extends Charset {
}
- private native int nDecode(char[] array, int arrPosition, int remaining, long outAddr, int absolutePos);
+// private native int nDecode(char[] array, int arrPosition, int remaining, long outAddr, int absolutePos);
protected CoderResult decodeLoop(ByteBuffer bb, CharBuffer cb){
@@ -151,7 +151,7 @@ public class IBM437 extends Charset {
super(cs, 1, 1);
}
- private native void nEncode(long outAddr, int absolutePos, char[] array, int arrPosition, int[] res);
+// private native void nEncode(long outAddr, int absolutePos, char[] array, int arrPosition, int[] res);
protected CoderResult encodeLoop(CharBuffer cb, ByteBuffer bb){
int bbRemaining = bb.remaining();
diff --git a/app/src/main/java/org/connectbot/ActionBarWrapper.java b/app/src/main/java/org/connectbot/ActionBarWrapper.java
deleted file mode 100644
index f6bed8c..0000000
--- a/app/src/main/java/org/connectbot/ActionBarWrapper.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot;
-
-import org.connectbot.util.PreferenceConstants;
-
-import android.annotation.TargetApi;
-import android.app.Activity;
-import android.app.ActionBar;
-
-public abstract class ActionBarWrapper {
- public interface OnMenuVisibilityListener {
- public void onMenuVisibilityChanged(boolean isVisible);
- }
-
- public static ActionBarWrapper getActionBar(Activity activity) {
- if (PreferenceConstants.PRE_HONEYCOMB)
- return new DummyActionBar();
- else
- return new RealActionBar(activity);
- }
-
- public void hide() {
- }
-
- public void show() {
- }
-
- public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {
- }
-
- public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
- }
-
- private static class DummyActionBar extends ActionBarWrapper {
- }
-
- /**
- * Real ActionBar delegate that is only invoked on Honeycomb
- * and later.
- */
- @TargetApi(11)
- private static class RealActionBar extends ActionBarWrapper {
- private final ActionBar actionBar;
-
- public RealActionBar(Activity activity) {
- actionBar = activity.getActionBar();
- }
-
- @Override
- public void hide() {
- actionBar.hide();
- }
-
- @Override
- public void show() {
- actionBar.show();
- }
-
- @Override
- public void addOnMenuVisibilityListener(final OnMenuVisibilityListener listener) {
- actionBar.addOnMenuVisibilityListener(new ActionBar.OnMenuVisibilityListener() {
- public void onMenuVisibilityChanged(boolean isVisible) {
- listener.onMenuVisibilityChanged(isVisible);
- }
- });
- }
-
- @Override
- public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
- actionBar.setDisplayHomeAsUpEnabled(showHomeAsUp);
- }
- }
-}
diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java
index 214f878..0e23979 100644
--- a/app/src/main/java/org/connectbot/ConsoleActivity.java
+++ b/app/src/main/java/org/connectbot/ConsoleActivity.java
@@ -23,13 +23,13 @@ import java.util.List;
import org.connectbot.bean.HostBean;
import org.connectbot.bean.SelectionArea;
+import org.connectbot.service.BridgeDisconnectedListener;
import org.connectbot.service.PromptHelper;
import org.connectbot.service.TerminalBridge;
import org.connectbot.service.TerminalKeyListener;
import org.connectbot.service.TerminalManager;
import org.connectbot.util.PreferenceConstants;
-import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ComponentName;
@@ -50,9 +50,13 @@ import android.os.Message;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
+import android.support.design.widget.TabLayout;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.text.ClipboardManager;
import android.util.Log;
import android.view.ContextMenu;
@@ -80,6 +84,7 @@ import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
@@ -88,16 +93,20 @@ import android.widget.TextView;
import android.widget.Toast;
import de.mud.terminal.vt320;
-public class ConsoleActivity extends Activity {
+public class ConsoleActivity extends AppCompatActivity implements BridgeDisconnectedListener {
public final static String TAG = "CB.ConsoleActivity";
protected static final int REQUEST_EDIT = 1;
private static final int CLICK_TIME = 400;
private static final float MAX_CLICK_DISTANCE = 25f;
- private static final int KEYBOARD_DISPLAY_TIME = 1500;
+ private static final int KEYBOARD_DISPLAY_TIME = 3000;
+ private static final int KEYBOARD_REPEAT_INITIAL = 500;
+ private static final int KEYBOARD_REPEAT = 100;
protected ViewPager pager = null;
+ protected TabLayout tabs = null;
+ protected Toolbar toolbar = null;
@Nullable
protected TerminalManager bound = null;
protected TerminalPagerAdapter adapter = null;
@@ -143,7 +152,7 @@ public class ConsoleActivity extends Activity {
private ImageView mKeyboardButton;
- private ActionBarWrapper actionBar;
+ private ActionBar actionBar;
private boolean inActionBarMenu = false;
private boolean titleBarHide;
@@ -152,7 +161,7 @@ public class ConsoleActivity extends Activity {
bound = ((TerminalManager.TerminalBinder) service).getService();
// let manager know about our event handling services
- bound.disconnectHandler = disconnectHandler;
+ bound.disconnectListener = ConsoleActivity.this;
bound.setResizeAllowed(true);
final String requestedNickname = (requested != null) ? requested.getFragment() : null;
@@ -192,21 +201,16 @@ public class ConsoleActivity extends Activity {
}
};
- protected Handler disconnectHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
+ public void onDisconnected(TerminalBridge bridge) {
+ synchronized (adapter) {
+ adapter.notifyDataSetChanged();
Log.d(TAG, "Someone sending HANDLE_DISCONNECT to parentHandler");
- // someone below us requested to display a password dialog
- // they are sending nickname and requested
- TerminalBridge bridge = (TerminalBridge) msg.obj;
-
- adapter.notifyDataSetChanged();
if (bridge.isAwaitingClose()) {
closeBridge(bridge);
}
}
- };
+ }
protected OnClickListener emulatedKeysListener = new OnClickListener() {
@Override
@@ -215,38 +219,143 @@ public class ConsoleActivity extends Activity {
}
};
+ protected Handler keyRepeatHandler = new Handler();
+
+
+ /**
+ * Handle repeatable virtual keys and touch events
+ */
+ public class KeyRepeater implements Runnable, OnTouchListener {
+ private View mView;
+ private Handler mHandler;
+ private boolean mDown;
+
+ public KeyRepeater(Handler handler, View view) {
+ mView = view;
+ mHandler = handler;
+ mView.setOnTouchListener(this);
+ mDown = false;
+ }
+
+ @Override
+ public void run() {
+ mDown = true;
+ mHandler.removeCallbacks(this);
+ mHandler.postDelayed(this, KEYBOARD_REPEAT);
+ onEmulatedKeyClicked(mView);
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (BuildConfig.DEBUG) {
+ Log.d(TAG, "KeyRepeater.onTouch(" + v.getId() + ", " +
+ event.getAction() + ", " +
+ event.getActionIndex() + ", " +
+ event.getActionMasked() + ");");
+ }
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ mDown = false;
+ mHandler.postDelayed(this, KEYBOARD_REPEAT_INITIAL);
+ return (true);
+
+ case MotionEvent.ACTION_CANCEL:
+ keyRepeatHandler.removeCallbacks(this);
+ return (true);
+
+ case MotionEvent.ACTION_UP:
+ keyRepeatHandler.removeCallbacks(this);
+ if (!mDown) {
+ onEmulatedKeyClicked(mView);
+ }
+ return (true);
+ }
+ return false;
+ }
+ }
+
private void onEmulatedKeyClicked(View v) {
TerminalView terminal = adapter.getCurrentTerminalView();
if (terminal == null) return;
TerminalKeyListener handler = terminal.bridge.getKeyHandler();
- boolean hideKeys = true;
+ boolean hideKeys = false;
- switch (v.getId()) {
+ switch (v.getId()) {
case R.id.button_ctrl:
handler.metaPress(TerminalKeyListener.OUR_CTRL_ON, true);
+ hideKeys = true;
break;
case R.id.button_esc:
handler.sendEscape();
+ hideKeys = true;
break;
case R.id.button_tab:
handler.sendTab();
+ hideKeys = true;
break;
+
case R.id.button_up:
handler.sendPressedKey(vt320.KEY_UP);
- hideKeys = false;
break;
case R.id.button_down:
handler.sendPressedKey(vt320.KEY_DOWN);
- hideKeys = false;
break;
case R.id.button_left:
handler.sendPressedKey(vt320.KEY_LEFT);
- hideKeys = false;
break;
case R.id.button_right:
handler.sendPressedKey(vt320.KEY_RIGHT);
- hideKeys = false;
+ break;
+
+ case R.id.button_home:
+ handler.sendPressedKey(vt320.KEY_HOME);
+ break;
+ case R.id.button_end:
+ handler.sendPressedKey(vt320.KEY_END);
+ break;
+ case R.id.button_pgup:
+ handler.sendPressedKey(vt320.KEY_PAGE_UP);
+ break;
+ case R.id.button_pgdn:
+ handler.sendPressedKey(vt320.KEY_PAGE_DOWN);
+ break;
+
+ case R.id.button_f1:
+ handler.sendPressedKey(vt320.KEY_F1);
+ break;
+ case R.id.button_f2:
+ handler.sendPressedKey(vt320.KEY_F2);
+ break;
+ case R.id.button_f3:
+ handler.sendPressedKey(vt320.KEY_F3);
+ break;
+ case R.id.button_f4:
+ handler.sendPressedKey(vt320.KEY_F4);
+ break;
+ case R.id.button_f5:
+ handler.sendPressedKey(vt320.KEY_F5);
+ break;
+ case R.id.button_f6:
+ handler.sendPressedKey(vt320.KEY_F6);
+ break;
+ case R.id.button_f7:
+ handler.sendPressedKey(vt320.KEY_F7);
+ break;
+ case R.id.button_f8:
+ handler.sendPressedKey(vt320.KEY_F8);
+ break;
+ case R.id.button_f9:
+ handler.sendPressedKey(vt320.KEY_F9);
+ break;
+ case R.id.button_f10:
+ handler.sendPressedKey(vt320.KEY_F10);
+ break;
+ case R.id.button_f11:
+ handler.sendPressedKey(vt320.KEY_F11);
+ break;
+ case R.id.button_f12:
+ handler.sendPressedKey(vt320.KEY_F12);
break;
}
@@ -256,20 +365,21 @@ public class ConsoleActivity extends Activity {
autoHideEmulatedKeys();
terminal.bridge.tryKeyVibrate();
+ if (titleBarHide) {
+ actionBar.hide();
+ }
}
/**
* @param bridge
*/
private void closeBridge(final TerminalBridge bridge) {
- synchronized (pager) {
- updateEmptyVisible();
- updatePromptVisible();
+ updateEmptyVisible();
+ updatePromptVisible();
- // If we just closed the last bridge, go back to the previous activity.
- if (pager.getChildCount() == 0) {
- finish();
- }
+ // If we just closed the last bridge, go back to the previous activity.
+ if (pager.getChildCount() == 0) {
+ finish();
}
}
@@ -343,7 +453,7 @@ public class ConsoleActivity extends Activity {
titleBarHide = prefs.getBoolean(PreferenceConstants.TITLEBARHIDE, false);
if (titleBarHide) {
- getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
+ supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
}
this.setContentView(R.layout.act_console);
@@ -362,6 +472,7 @@ public class ConsoleActivity extends Activity {
inflater = LayoutInflater.from(this);
+ toolbar = (Toolbar) findViewById(R.id.toolbar);
pager = (ViewPager) findViewById(R.id.console_flip);
registerForContextMenu(pager);
pager.addOnPageChangeListener(
@@ -371,6 +482,8 @@ public class ConsoleActivity extends Activity {
onTerminalChanged();
}
});
+ adapter = new TerminalPagerAdapter();
+ pager.setAdapter(adapter);
empty = (TextView) findViewById(android.R.id.empty);
@@ -445,17 +558,36 @@ public class ConsoleActivity extends Activity {
findViewById(R.id.button_ctrl).setOnClickListener(emulatedKeysListener);
findViewById(R.id.button_esc).setOnClickListener(emulatedKeysListener);
findViewById(R.id.button_tab).setOnClickListener(emulatedKeysListener);
- findViewById(R.id.button_up).setOnClickListener(emulatedKeysListener);
- findViewById(R.id.button_down).setOnClickListener(emulatedKeysListener);
- findViewById(R.id.button_left).setOnClickListener(emulatedKeysListener);
- findViewById(R.id.button_right).setOnClickListener(emulatedKeysListener);
- actionBar = ActionBarWrapper.getActionBar(this);
+ new KeyRepeater(keyRepeatHandler, findViewById(R.id.button_up));
+ new KeyRepeater(keyRepeatHandler, findViewById(R.id.button_down));
+ new KeyRepeater(keyRepeatHandler, findViewById(R.id.button_left));
+ new KeyRepeater(keyRepeatHandler, findViewById(R.id.button_right));
+
+ findViewById(R.id.button_home).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_end).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_pgup).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_pgdn).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f1).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f2).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f3).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f4).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f5).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f6).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f7).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f8).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f9).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f10).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f11).setOnClickListener(emulatedKeysListener);
+ findViewById(R.id.button_f12).setOnClickListener(emulatedKeysListener);
+
+
+ actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
if (titleBarHide) {
actionBar.hide();
}
- actionBar.addOnMenuVisibilityListener(new ActionBarWrapper.OnMenuVisibilityListener() {
+ actionBar.addOnMenuVisibilityListener(new ActionBar.OnMenuVisibilityListener() {
public void onMenuVisibilityChanged(boolean isVisible) {
inActionBarMenu = isVisible;
if (isVisible == false) {
@@ -464,6 +596,35 @@ public class ConsoleActivity extends Activity {
}
});
+ if (!hardKeyboard) {
+ // Show virtual keyboard and scroll back and forth
+ final HorizontalScrollView keyboardScroll = (HorizontalScrollView) findViewById(R.id.keyboard_hscroll);
+ showEmulatedKeys();
+ keyboardScroll.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ final int xscroll = findViewById(R.id.button_f12).getRight();
+ if (BuildConfig.DEBUG) {
+ Log.d(TAG, "smoothScrollBy(toEnd[" + xscroll + "])");
+ }
+ keyboardScroll.smoothScrollBy(xscroll, 0);
+ keyboardScroll.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (BuildConfig.DEBUG) {
+ Log.d(TAG, "smoothScrollBy(toStart[" + (-xscroll) + "])");
+ }
+ keyboardScroll.smoothScrollBy(-xscroll, 0);
+ }
+ }, 1000);
+ }
+ }, 1000);
+ }
+
+ tabs = (TabLayout) findViewById(R.id.tabs);
+ if (tabs != null)
+ setupTabLayoutWithViewPager();
+
// detect fling gestures to switch between terminals
final GestureDetector detect = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
private float totalY = 0;
@@ -635,9 +796,32 @@ public class ConsoleActivity extends Activity {
}
});
+ }
- adapter = new TerminalPagerAdapter();
- pager.setAdapter(adapter);
+ /**
+ * Ties the {@link TabLayout} to the {@link ViewPager}.
+ *
+ * <p>This method will:
+ * <ul>
+ * <li>Add a {@link ViewPager.OnPageChangeListener} that will forward events to
+ * this TabLayout.</li>
+ * <li>Populate the TabLayout's tabs from the ViewPager's {@link PagerAdapter}.</li>
+ * <li>Set our {@link TabLayout.OnTabSelectedListener} which will forward
+ * selected events to the ViewPager</li>
+ * </ul>
+ * </p>
+ */
+ public void setupTabLayoutWithViewPager() {
+ tabs.setTabsFromPagerAdapter(adapter);
+ pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabs));
+ tabs.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(pager));
+
+ if (adapter.getCount() > 0) {
+ final int curItem = pager.getCurrentItem();
+ if (tabs.getSelectedTabPosition() != curItem) {
+ tabs.getTabAt(curItem).select();
+ }
+ }
}
/**
@@ -784,26 +968,26 @@ public class ConsoleActivity extends Activity {
final View resizeView = inflater.inflate(R.layout.dia_resize, null, false);
new AlertDialog.Builder(ConsoleActivity.this)
- .setView(resizeView)
- .setPositiveButton(R.string.button_resize, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- int width, height;
- try {
- width = Integer.parseInt(((EditText) resizeView
- .findViewById(R.id.width))
- .getText().toString());
- height = Integer.parseInt(((EditText) resizeView
- .findViewById(R.id.height))
- .getText().toString());
- } catch (NumberFormatException nfe) {
- // TODO change this to a real dialog where we can
- // make the input boxes turn red to indicate an error.
- return;
+ .setView(resizeView)
+ .setPositiveButton(R.string.button_resize, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ int width, height;
+ try {
+ width = Integer.parseInt(((EditText) resizeView
+ .findViewById(R.id.width))
+ .getText().toString());
+ height = Integer.parseInt(((EditText) resizeView
+ .findViewById(R.id.height))
+ .getText().toString());
+ } catch (NumberFormatException nfe) {
+ // TODO change this to a real dialog where we can
+ // make the input boxes turn red to indicate an error.
+ return;
+ }
+
+ terminalView.forceSize(width, height);
}
-
- terminalView.forceSize(width, height);
- }
- }).setNegativeButton(android.R.string.cancel, null).create().show();
+ }).setNegativeButton(android.R.string.cancel, null).create().show();
return true;
}
@@ -848,13 +1032,13 @@ public class ConsoleActivity extends Activity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case android.R.id.home:
- Intent intent = new Intent(this, HostListActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- return true;
- default:
- return super.onOptionsItemSelected(item);
+ case android.R.id.home:
+ Intent intent = new Intent(this, HostListActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
}
}
@@ -1226,6 +1410,15 @@ public class ConsoleActivity extends Activity {
}
@Override
+ public void notifyDataSetChanged() {
+ super.notifyDataSetChanged();
+ if (tabs != null) {
+ toolbar.setVisibility(this.getCount() > 1 ? View.VISIBLE : View.GONE);
+ tabs.setTabsFromPagerAdapter(this);
+ }
+ }
+
+ @Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
diff --git a/app/src/main/java/org/connectbot/EulaActivity.java b/app/src/main/java/org/connectbot/EulaActivity.java
new file mode 100644
index 0000000..650a5b5
--- /dev/null
+++ b/app/src/main/java/org/connectbot/EulaActivity.java
@@ -0,0 +1,34 @@
+/*
+ * ConnectBot: simple, powerful, open-source SSH client for Android
+ * Copyright 2015 Kenny Root, Jeffrey Sharkey
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.connectbot;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class EulaActivity extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.act_eula);
+
+ this.setTitle(String.format("%s: %s",
+ getResources().getText(R.string.app_name),
+ getResources().getText(R.string.terms_and_conditions)));
+ }
+}
diff --git a/app/src/main/java/org/connectbot/HelpActivity.java b/app/src/main/java/org/connectbot/HelpActivity.java
index 5c4fa79..1e78d72 100644
--- a/app/src/main/java/org/connectbot/HelpActivity.java
+++ b/app/src/main/java/org/connectbot/HelpActivity.java
@@ -20,10 +20,12 @@ package org.connectbot;
import java.io.IOException;
import android.app.Activity;
+import android.app.AlertDialog;
import android.content.Intent;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
@@ -39,6 +41,9 @@ public class HelpActivity extends Activity {
public final static String HELPDIR = "help";
public final static String SUFFIX = ".html";
+ private LayoutInflater inflater = null;
+
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -73,5 +78,29 @@ public class HelpActivity extends Activity {
// TODO Auto-generated catch block
Log.e(TAG, "couldn't get list of help assets", e);
}
+
+ inflater = LayoutInflater.from(this);
+ Button shortcutsButton = new Button(this);
+ shortcutsButton.setText(getResources().getString(R.string.keyboard_shortcuts));
+ shortcutsButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ final View shortcuts = inflater.inflate(R.layout.dia_keyboard_shortcuts, null, false);
+ new AlertDialog.Builder(HelpActivity.this)
+ .setView(shortcuts)
+ .setTitle(R.string.keyboard_shortcuts)
+ .show();
+ }
+ });
+ content.addView(shortcutsButton);
+
+ Button eulaButton = new Button(this);
+ eulaButton.setText(getResources().getString(R.string.terms_and_conditions));
+ eulaButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ Intent intent = new Intent(HelpActivity.this, EulaActivity.class);
+ HelpActivity.this.startActivity(intent);
+ }
+ });
+ content.addView(eulaButton);
}
}
diff --git a/app/src/main/java/org/connectbot/HostListActivity.java b/app/src/main/java/org/connectbot/HostListActivity.java
index a0d7901..2d8e882 100644
--- a/app/src/main/java/org/connectbot/HostListActivity.java
+++ b/app/src/main/java/org/connectbot/HostListActivity.java
@@ -26,7 +26,6 @@ import org.connectbot.transport.TransportFactory;
import org.connectbot.util.HostDatabase;
import org.connectbot.util.PreferenceConstants;
-import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.ComponentName;
@@ -70,8 +69,6 @@ public class HostListActivity extends ListActivity {
public final static int REQUEST_EDIT = 1;
- public final static int REQUEST_EULA = 2;
-
protected TerminalManager bound = null;
protected HostDatabase hostdb;
@@ -175,17 +172,7 @@ public class HostListActivity extends ListActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == REQUEST_EULA) {
- if (resultCode == Activity.RESULT_OK) {
- // yay they agreed, so store that info
- Editor edit = prefs.edit();
- edit.putBoolean(PreferenceConstants.EULA, true);
- edit.commit();
- } else {
- // user didnt agree, so close
- this.finish();
- }
- } else if (requestCode == REQUEST_EDIT) {
+ if (requestCode == REQUEST_EDIT) {
this.updateList();
}
}
@@ -224,12 +211,6 @@ public class HostListActivity extends ListActivity {
}
}
- // check for eula agreement
- boolean agreed = prefs.getBoolean(PreferenceConstants.EULA, false);
- if (!agreed) {
- this.startActivityForResult(new Intent(this, WizardActivity.class), REQUEST_EULA);
- }
-
this.makingShortcut = Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())
|| Intent.ACTION_PICK.equals(getIntent().getAction());
diff --git a/app/src/main/java/org/connectbot/SettingsActivity.java b/app/src/main/java/org/connectbot/SettingsActivity.java
index 38f3367..153f4ba 100644
--- a/app/src/main/java/org/connectbot/SettingsActivity.java
+++ b/app/src/main/java/org/connectbot/SettingsActivity.java
@@ -17,8 +17,6 @@
package org.connectbot;
-import org.connectbot.util.PreferenceConstants;
-
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
@@ -45,11 +43,6 @@ public class SettingsActivity extends PreferenceActivity {
PreferenceManager.setDefaultValues(this, R.xml.preferences, true);
- // Since they were able to get to the Settings activity, they already agreed to the EULA
- editor = preferences.edit();
- editor.putBoolean(PreferenceConstants.EULA, true);
- editor.commit();
-
addPreferencesFromResource(R.xml.preferences);
}
diff --git a/app/src/main/java/org/connectbot/WizardActivity.java b/app/src/main/java/org/connectbot/WizardActivity.java
deleted file mode 100644
index 4069c50..0000000
--- a/app/src/main/java/org/connectbot/WizardActivity.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.connectbot;
-
-import org.connectbot.util.HelpTopicView;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.ViewFlipper;
-
-/**
- * Show a series of wizard-like steps to the user, which might include an EULA,
- * program credits, and helpful hints.
- *
- * @author jsharkey
- */
-public class WizardActivity extends Activity {
- protected ViewFlipper flipper = null;
- private Button next, prev;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.act_wizard);
-
- this.flipper = (ViewFlipper) findViewById(R.id.wizard_flipper);
-
- // inflate the layout for EULA step
- LayoutInflater inflater = LayoutInflater.from(this);
- this.flipper.addView(inflater.inflate(R.layout.wiz_eula, this.flipper, false));
-
- // Add a view for each help topic we want the user to see.
- String[] topics = getResources().getStringArray(R.array.list_wizard_topics);
- for (String topic : topics) {
- flipper.addView(new HelpTopicView(this).setTopic(topic));
- }
-
- next = (Button) findViewById(R.id.action_next);
- next.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- if (isLastDisplayed()) {
- // user walked past end of wizard, so return okay
- WizardActivity.this.setResult(Activity.RESULT_OK);
- WizardActivity.this.finish();
- } else {
- // show next step and update buttons
- flipper.showNext();
- updateButtons();
- }
- }
- });
-
- prev = (Button) findViewById(R.id.action_prev);
- prev.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- if (isFirstDisplayed()) {
- // user walked past beginning of wizard, so return that they cancelled
- WizardActivity.this.setResult(Activity.RESULT_CANCELED);
- WizardActivity.this.finish();
- } else {
- // show previous step and update buttons
- flipper.showPrevious();
- updateButtons();
- }
- }
- });
-
- this.updateButtons();
- }
-
- protected boolean isFirstDisplayed() {
- return (flipper.getDisplayedChild() == 0);
- }
-
- protected boolean isLastDisplayed() {
- return (flipper.getDisplayedChild() == flipper.getChildCount() - 1);
- }
-
- protected void updateButtons() {
- boolean eula = (flipper.getDisplayedChild() == 0);
-
- next.setText(eula ? getString(R.string.wizard_agree) : getString(R.string.wizard_next));
- prev.setText(eula ? getString(R.string.delete_neg) : getString(R.string.wizard_back));
- }
-}
diff --git a/app/src/main/java/org/connectbot/service/TerminalBridge.java b/app/src/main/java/org/connectbot/service/TerminalBridge.java
index 6333c17..6d47f96 100644
--- a/app/src/main/java/org/connectbot/service/TerminalBridge.java
+++ b/app/src/main/java/org/connectbot/service/TerminalBridge.java
@@ -437,8 +437,7 @@ public class TerminalBridge implements VDUDisplay {
if (immediate || (host.getQuickDisconnect() && !host.getStayConnected())) {
awaitingClose = true;
- if (disconnectListener != null)
- disconnectListener.onDisconnected(TerminalBridge.this);
+ triggerDisconnectListener();
} else {
{
final String line = manager.res.getString(R.string.alert_disconnect_msg);
@@ -454,10 +453,7 @@ public class TerminalBridge implements VDUDisplay {
manager.res.getString(R.string.prompt_host_disconnected));
if (result == null || result.booleanValue()) {
awaitingClose = true;
-
- // Tell the TerminalManager that we can be destroyed now.
- if (disconnectListener != null)
- disconnectListener.onDisconnected(TerminalBridge.this);
+ triggerDisconnectListener();
}
}
});
@@ -467,6 +463,25 @@ public class TerminalBridge implements VDUDisplay {
}
}
+ /**
+ * Tells the TerminalManager that we can be destroyed now.
+ */
+ private void triggerDisconnectListener() {
+ if (disconnectListener != null) {
+ // The disconnect listener should be run on the main thread if possible.
+ if (parent != null) {
+ parent.post(new Runnable() {
+ @Override
+ public void run() {
+ disconnectListener.onDisconnected(TerminalBridge.this);
+ }
+ });
+ } else {
+ disconnectListener.onDisconnected(TerminalBridge.this);
+ }
+ }
+ }
+
public void setSelectingForCopy(boolean selectingForCopy) {
this.selectingForCopy = selectingForCopy;
}
diff --git a/app/src/main/java/org/connectbot/service/TerminalManager.java b/app/src/main/java/org/connectbot/service/TerminalManager.java
index 8001561..a15dff0 100644
--- a/app/src/main/java/org/connectbot/service/TerminalManager.java
+++ b/app/src/main/java/org/connectbot/service/TerminalManager.java
@@ -54,9 +54,7 @@ import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Binder;
-import android.os.Handler;
import android.os.IBinder;
-import android.os.Message;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.util.Log;
@@ -81,7 +79,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
public List<HostBean> disconnected = new LinkedList<HostBean>();
- public Handler disconnectHandler = null;
+ public BridgeDisconnectedListener disconnectListener = null;
public Map<String, KeyHolder> loadedKeypairs = new HashMap<String, KeyHolder>();
@@ -329,6 +327,7 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
*/
public void onDisconnected(TerminalBridge bridge) {
boolean shouldHideRunningNotification = false;
+ Log.d(TAG, "Bridge Disconnected. Removing it.");
synchronized (bridges) {
// remove this bridge from our list
@@ -345,6 +344,10 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
mPendingReconnect.size() == 0) {
shouldHideRunningNotification = true;
}
+
+ // pass notification back up to gui
+ if (disconnectListener != null)
+ disconnectListener.onDisconnected(bridge);
}
synchronized (disconnected) {
@@ -354,10 +357,6 @@ public class TerminalManager extends Service implements BridgeDisconnectedListen
if (shouldHideRunningNotification) {
ConnectionNotifier.getInstance().hideRunningNotification(this);
}
-
- // pass notification back up to gui
- if (disconnectHandler != null)
- Message.obtain(disconnectHandler, -1, bridge).sendToTarget();
}
public boolean isKeyLoaded(String nickname) {
diff --git a/app/src/main/java/org/connectbot/util/HostDatabase.java b/app/src/main/java/org/connectbot/util/HostDatabase.java
index 4756157..d8cdf09 100644
--- a/app/src/main/java/org/connectbot/util/HostDatabase.java
+++ b/app/src/main/java/org/connectbot/util/HostDatabase.java
@@ -678,7 +678,7 @@ public class HostDatabase extends RobustSQLiteOpenHelper {
null, null, null);
while (c.moveToNext()) {
- colors[c.getInt(0)] = new Integer(c.getInt(1));
+ colors[c.getInt(0)] = Integer.valueOf(c.getInt(1));
}
c.close();
diff --git a/app/src/main/java/org/connectbot/util/PreferenceConstants.java b/app/src/main/java/org/connectbot/util/PreferenceConstants.java
index d3cd832..eb0e396 100644
--- a/app/src/main/java/org/connectbot/util/PreferenceConstants.java
+++ b/app/src/main/java/org/connectbot/util/PreferenceConstants.java
@@ -66,8 +66,6 @@ public class PreferenceConstants {
public static final String BUMPY_ARROWS = "bumpyarrows";
- public static final String EULA = "eula";
-
public static final String SORT_BY_COLOR = "sortByColor";
public static final String BELL = "bell";