aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/org
diff options
context:
space:
mode:
authorJoel Blumen <jbcode42@gmail.com>2015-10-07 16:26:32 -0500
committerJoel Blumen <jbcode42@gmail.com>2015-10-07 16:26:32 -0500
commitcb578fe3aed5625fd4d1d31318a9af4ac1c76aff (patch)
tree9341537b725ddde982948109af40f5c2bba87760 /app/src/main/java/org
parent34c8c09dae068ffbbf59d46e843dc05829dee73b (diff)
parentfde40fdcb62c764df90e889ae95e28b86ac5f746 (diff)
downloadconnectbot-cb578fe3aed5625fd4d1d31318a9af4ac1c76aff.tar.gz
connectbot-cb578fe3aed5625fd4d1d31318a9af4ac1c76aff.tar.bz2
connectbot-cb578fe3aed5625fd4d1d31318a9af4ac1c76aff.zip
Merge branch 'master' into master
Diffstat (limited to 'app/src/main/java/org')
-rw-r--r--app/src/main/java/org/connectbot/HelpActivity.java51
-rw-r--r--app/src/main/java/org/connectbot/HintsActivity.java (renamed from app/src/main/java/org/connectbot/HelpTopicActivity.java)28
-rw-r--r--app/src/main/java/org/connectbot/HostEditorFragment.java157
-rw-r--r--app/src/main/java/org/connectbot/HostListActivity.java1
-rw-r--r--app/src/main/java/org/connectbot/PortForwardListActivity.java18
-rw-r--r--app/src/main/java/org/connectbot/util/HelpTopicView.java62
6 files changed, 176 insertions, 141 deletions
diff --git a/app/src/main/java/org/connectbot/HelpActivity.java b/app/src/main/java/org/connectbot/HelpActivity.java
index 3df8b2f..2a522dc 100644
--- a/app/src/main/java/org/connectbot/HelpActivity.java
+++ b/app/src/main/java/org/connectbot/HelpActivity.java
@@ -17,30 +17,20 @@
package org.connectbot;
-import java.io.IOException;
-
import android.app.AlertDialog;
import android.content.Intent;
-import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
-import android.widget.LinearLayout;
/**
* @author Kenny Root
*
*/
public class HelpActivity extends AppCompatActivity {
- public final static String TAG = "CB.HelpActivity";
-
- public final static String HELPDIR = "help";
- public final static String SUFFIX = ".html";
-
private LayoutInflater inflater = null;
@@ -49,54 +39,33 @@ public class HelpActivity extends AppCompatActivity {
super.onCreate(icicle);
setContentView(R.layout.act_help);
- AssetManager am = this.getAssets();
- LinearLayout content = (LinearLayout) findViewById(R.id.topics);
-
- try {
- for (String name : am.list(HELPDIR)) {
- if (name.endsWith(SUFFIX)) {
- Button button = new Button(this);
- final String topic = name.substring(0, name.length() - SUFFIX.length());
- button.setText(topic);
-
- button.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- Intent intent = new Intent(HelpActivity.this, HelpTopicActivity.class);
- intent.putExtra(Intent.EXTRA_TITLE, topic);
- HelpActivity.this.startActivity(intent);
- }
- });
-
- content.addView(button);
- }
+ Button hintsButton = (Button) findViewById(R.id.hints_button);
+ hintsButton.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ Intent intent = new Intent(HelpActivity.this, HintsActivity.class);
+ HelpActivity.this.startActivity(intent);
}
- } catch (IOException e) {
- // 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));
+ Button shortcutsButton = (Button) findViewById(R.id.shortcuts_button);
shortcutsButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
- final View shortcuts = inflater.inflate(R.layout.dia_keyboard_shortcuts, null, false);
+ 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));
+ Button eulaButton = (Button) findViewById(R.id.eula_button);
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/HelpTopicActivity.java b/app/src/main/java/org/connectbot/HintsActivity.java
index 9f5573a..25bc691 100644
--- a/app/src/main/java/org/connectbot/HelpTopicActivity.java
+++ b/app/src/main/java/org/connectbot/HintsActivity.java
@@ -1,6 +1,6 @@
/*
* ConnectBot: simple, powerful, open-source SSH client for Android
- * Copyright 2007 Kenny Root, Jeffrey Sharkey
+ * 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.
@@ -17,32 +17,14 @@
package org.connectbot;
-import org.connectbot.util.HelpTopicView;
-
-import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
-/**
- * @author Kenny Root
- *
- */
-public class HelpTopicActivity extends AppCompatActivity {
- public final static String TAG = "CB.HelpActivity";
+public class HintsActivity extends AppCompatActivity {
@Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setContentView(R.layout.act_help_topic);
-
- String topic = getIntent().getStringExtra(Intent.EXTRA_TITLE);
-
- this.setTitle(String.format("%s: %s",
- getResources().getText(R.string.title_help),
- topic));
-
- HelpTopicView helpTopic = (HelpTopicView) findViewById(R.id.topic_text);
-
- helpTopic.setTopic(topic);
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.act_hints);
}
}
diff --git a/app/src/main/java/org/connectbot/HostEditorFragment.java b/app/src/main/java/org/connectbot/HostEditorFragment.java
index f0a8c4f..6646b4a 100644
--- a/app/src/main/java/org/connectbot/HostEditorFragment.java
+++ b/app/src/main/java/org/connectbot/HostEditorFragment.java
@@ -25,6 +25,8 @@ import android.os.Bundle;
import android.os.Parcelable;
import android.support.design.widget.TextInputLayout;
import android.support.v4.app.Fragment;
+import android.support.v7.widget.AppCompatCheckBox;
+import android.support.v7.widget.SwitchCompat;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
@@ -32,6 +34,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.SeekBar;
@@ -76,6 +79,12 @@ public class HostEditorFragment extends Fragment {
// the text in the Spinner because the text is localized while these values are not.
private TypedArray mColorValues;
+ // Likewise, but for SSH auth agent values.
+ private TypedArray mSshAuthValues;
+
+ // Likewise, but for DEL key values.
+ private TypedArray mDelKeyValues;
+
private Spinner mTransportSpinner;
private TextInputLayout mQuickConnectContainer;
private EditText mQuickConnectField;
@@ -91,6 +100,17 @@ public class HostEditorFragment extends Fragment {
private Spinner mColorSelector;
private TextView mFontSizeText;
private SeekBar mFontSizeSeekBar;
+ private Spinner mPubkeySpinner;
+ private View mUseSshConfirmationContainer;
+ private SwitchCompat mUseSshAuthSwitch;
+ private AppCompatCheckBox mSshAuthConfirmationCheckbox;
+ private SwitchCompat mCompressionSwitch;
+ private SwitchCompat mStartShellSwitch;
+ private SwitchCompat mStayConnectedSwitch;
+ private SwitchCompat mCloseOnDisconnectSwitch;
+ private EditText mPostLoginAutomationField;
+ private Spinner mDelKeySpinner;
+ private Spinner mEncodingSpinner;
public static HostEditorFragment newInstance(HostBean existingHost) {
HostEditorFragment fragment = new HostEditorFragment();
@@ -128,12 +148,17 @@ public class HostEditorFragment extends Fragment {
View view = inflater.inflate(R.layout.fragment_host_editor, container, false);
mTransportSpinner = (Spinner) view.findViewById(R.id.transport_selector);
+ String[] transportNames = TransportFactory.getTransportNames();
ArrayAdapter<String> transportSelection = new ArrayAdapter<>(
- getActivity(),
- android.R.layout.simple_spinner_item,
- TransportFactory.getTransportNames());
+ getActivity(), android.R.layout.simple_spinner_item, transportNames);
transportSelection.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mTransportSpinner.setAdapter(transportSelection);
+ for (int i = 0; i < transportNames.length; i++) {
+ if (transportNames.equals(mHost.getProtocol())) {
+ mTransportSpinner.setSelection(i);
+ break;
+ }
+ }
mTransportSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
@@ -240,14 +265,10 @@ public class HostEditorFragment extends Fragment {
new HostTextFieldWatcher(HostDatabase.FIELD_HOST_NICKNAME));
mColorSelector = (Spinner) view.findViewById(R.id.color_selector);
- if (mHost.getColor() != null) {
- // Unfortunately, TypedArray doesn't have an indexOf(String) function, so search through
- // the array for the saved color.
- for (int i = 0; i < mColorValues.getIndexCount(); i++) {
- if (mHost.getColor().equals(mColorValues.getString(i))) {
- mColorSelector.setSelection(i);
- break;
- }
+ for (int i = 0; i < mColorValues.getIndexCount(); i++) {
+ if (mHost.getColor().equals(mColorValues.getString(i))) {
+ mColorSelector.setSelection(i);
+ break;
}
}
mColorSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@@ -281,6 +302,88 @@ public class HostEditorFragment extends Fragment {
});
mFontSizeSeekBar.setProgress(mHost.getFontSize() - MINIMUM_FONT_SIZE);
+ mPubkeySpinner = (Spinner) view.findViewById(R.id.pubkey_spinner);
+ // TODO: Set up spinner. This requires passing pubkey data into the fragment from the
+ // activity and will be part of an upcoming PR.
+
+ mUseSshConfirmationContainer = view.findViewById(R.id.ssh_confirmation_container);
+ mUseSshAuthSwitch = (SwitchCompat) view.findViewById(R.id.use_ssh_auth_switch);
+ mSshAuthConfirmationCheckbox =
+ (AppCompatCheckBox) view.findViewById(R.id.ssh_auth_confirmation_checkbox);
+ CompoundButton.OnCheckedChangeListener authSwitchListener = new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mUseSshConfirmationContainer.setVisibility(
+ mUseSshAuthSwitch.isChecked() ? View.VISIBLE : View.GONE);
+ if (mUseSshAuthSwitch.isChecked()) {
+ mHost.setUseAuthAgent(
+ mSshAuthConfirmationCheckbox.isChecked() ?
+ /* require confirmation */ mSshAuthValues.getString(1) :
+ /* don't require confirmation */ mSshAuthValues.getString(2));
+ } else {
+ mHost.setUseAuthAgent(/* don't use */ mSshAuthValues.getString(0));
+ }
+ }
+ };
+ mUseSshAuthSwitch.setOnCheckedChangeListener(authSwitchListener);
+ mSshAuthConfirmationCheckbox.setOnCheckedChangeListener(authSwitchListener);
+ if (mHost.getUseAuthAgent() == null ||
+ mHost.getUseAuthAgent().equals(mSshAuthValues.getString(0))) {
+ mUseSshAuthSwitch.setChecked(false);
+ mSshAuthConfirmationCheckbox.setChecked(false);
+ } else {
+ mUseSshAuthSwitch.setChecked(true);
+ mSshAuthConfirmationCheckbox.setChecked(
+ mHost.getUseAuthAgent().equals(mSshAuthValues.getString(1)));
+ }
+
+ mCompressionSwitch = (SwitchCompat) view.findViewById(R.id.compression_switch);
+ mCompressionSwitch.setChecked(mHost.getCompression());
+ mCompressionSwitch.setOnCheckedChangeListener(
+ new HostSwitchWatcher(HostDatabase.FIELD_HOST_COMPRESSION));
+
+ mStartShellSwitch = (SwitchCompat) view.findViewById(R.id.start_shell_switch);
+ mStartShellSwitch.setChecked(mHost.getWantSession());
+ mStartShellSwitch.setOnCheckedChangeListener(
+ new HostSwitchWatcher(HostDatabase.FIELD_HOST_WANTSESSION));
+
+ mStayConnectedSwitch = (SwitchCompat) view.findViewById(R.id.stay_connected_switch);
+ mStayConnectedSwitch.setChecked(mHost.getStayConnected());
+ mStayConnectedSwitch.setOnCheckedChangeListener(
+ new HostSwitchWatcher(HostDatabase.FIELD_HOST_STAYCONNECTED));
+
+ mCloseOnDisconnectSwitch = (SwitchCompat) view.findViewById(R.id.close_on_disconnect_switch);
+ mCloseOnDisconnectSwitch.setChecked(mHost.getQuickDisconnect());
+ mCloseOnDisconnectSwitch.setOnCheckedChangeListener(
+ new HostSwitchWatcher(HostDatabase.FIELD_HOST_QUICKDISCONNECT));
+
+ mPostLoginAutomationField = (EditText) view.findViewById(R.id.post_login_automation_field);
+ mPostLoginAutomationField.setText(mHost.getPostLogin());
+ mPostLoginAutomationField.addTextChangedListener(
+ new HostTextFieldWatcher(HostDatabase.FIELD_HOST_POSTLOGIN));
+
+ mDelKeySpinner = (Spinner) view.findViewById(R.id.del_key_spinner);
+ for (int i = 0; i < mDelKeyValues.getIndexCount(); i++) {
+ if (mHost.getDelKey().equals(mDelKeyValues.getString(i))) {
+ mDelKeySpinner.setSelection(i);
+ break;
+ }
+ }
+ mDelKeySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+ mHost.setDelKey(mDelKeyValues.getString(position));
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView<?> parent) {
+ }
+ });
+
+ mEncodingSpinner = (Spinner) view.findViewById(R.id.encoding_spinner);
+ // TODO: Set up spinner. This requires passing pubkey data into the fragment from the
+ // activity and will be part of an upcoming PR.
+
setUriPartsContainerExpanded(mIsUriEditorExpanded);
return view;
@@ -295,9 +398,11 @@ public class HostEditorFragment extends Fragment {
throw new ClassCastException(context.toString() + " must implement Listener");
}
- // Now that the fragment is attached to an Activity, fetch the array from the attached
+ // Now that the fragment is attached to an Activity, fetch the arrays from the attached
// Activity's resources.
mColorValues = getResources().obtainTypedArray(R.array.list_color_values);
+ mSshAuthValues = getResources().obtainTypedArray(R.array.list_authagent_values);
+ mDelKeyValues = getResources().obtainTypedArray(R.array.list_delkey_values);
}
@Override
@@ -305,6 +410,8 @@ public class HostEditorFragment extends Fragment {
super.onDetach();
mListener = null;
mColorValues.recycle();
+ mSshAuthValues.recycle();
+ mDelKeyValues.recycle();
}
@Override
@@ -392,6 +499,8 @@ public class HostEditorFragment extends Fragment {
}
} else if (HostDatabase.FIELD_HOST_NICKNAME.equals(mFieldType)) {
mHost.setNickname(text);
+ } else if (HostDatabase.FIELD_HOST_POSTLOGIN.equals(mFieldType)) {
+ mHost.setPostLogin(text);
} else {
throw new RuntimeException("Invalid field type.");
}
@@ -414,4 +523,28 @@ public class HostEditorFragment extends Fragment {
HostDatabase.FIELD_HOST_PORT.equals(fieldType);
}
}
+
+ private class HostSwitchWatcher implements CompoundButton.OnCheckedChangeListener {
+
+ private final String mFieldType;
+
+ public HostSwitchWatcher(String fieldType) {
+ mFieldType = fieldType;
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (HostDatabase.FIELD_HOST_COMPRESSION.equals(mFieldType)) {
+ mHost.setCompression(isChecked);
+ } else if (HostDatabase.FIELD_HOST_WANTSESSION.equals(mFieldType)) {
+ mHost.setWantSession(isChecked);
+ } else if (HostDatabase.FIELD_HOST_STAYCONNECTED.equals(mFieldType)) {
+ mHost.setStayConnected(isChecked);
+ } else if (HostDatabase.FIELD_HOST_QUICKDISCONNECT.equals(mFieldType)) {
+ mHost.setQuickDisconnect(isChecked);
+ } else {
+ throw new RuntimeException("Invalid field type.");
+ }
+ }
+ }
}
diff --git a/app/src/main/java/org/connectbot/HostListActivity.java b/app/src/main/java/org/connectbot/HostListActivity.java
index d844c50..3ad8c55 100644
--- a/app/src/main/java/org/connectbot/HostListActivity.java
+++ b/app/src/main/java/org/connectbot/HostListActivity.java
@@ -173,6 +173,7 @@ public class HostListActivity extends AppCompatListActivity implements OnHostSta
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.act_hostlist);
+ setTitle(R.string.title_hosts_list);
mListView = (RecyclerView) findViewById(R.id.list);
mListView.setHasFixedSize(true);
diff --git a/app/src/main/java/org/connectbot/PortForwardListActivity.java b/app/src/main/java/org/connectbot/PortForwardListActivity.java
index c7f0e7c..e5d3210 100644
--- a/app/src/main/java/org/connectbot/PortForwardListActivity.java
+++ b/app/src/main/java/org/connectbot/PortForwardListActivity.java
@@ -188,11 +188,23 @@ public class PortForwardListActivity extends AppCompatListActivity {
break;
}
+ // Why length(), not isEmpty(), is used: http://stackoverflow.com/q/10606725
+ String sourcePort = sourcePortEdit.getText().toString();
+ if (sourcePort.length() == 0) {
+ sourcePort = sourcePortEdit.getHint().toString();
+ }
+
+ String destination = destEdit.getText().toString();
+ if (destination.length() == 0) {
+ destination = destEdit.getHint().toString();
+ }
+
PortForwardBean portForward = new PortForwardBean(
host != null ? host.getId() : -1,
- nicknameEdit.getText().toString(), type,
- sourcePortEdit.getText().toString(),
- destEdit.getText().toString());
+ nicknameEdit.getText().toString(),
+ type,
+ sourcePort,
+ destination);
if (hostBridge != null) {
hostBridge.addPortForward(portForward);
diff --git a/app/src/main/java/org/connectbot/util/HelpTopicView.java b/app/src/main/java/org/connectbot/util/HelpTopicView.java
deleted file mode 100644
index 0cbc267..0000000
--- a/app/src/main/java/org/connectbot/util/HelpTopicView.java
+++ /dev/null
@@ -1,62 +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.util;
-
-import org.connectbot.HelpActivity;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.webkit.WebSettings;
-import android.webkit.WebView;
-
-/**
- * @author Kenny Root
- *
- */
-public class HelpTopicView extends WebView {
- public HelpTopicView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- initialize();
- }
-
- public HelpTopicView(Context context, AttributeSet attrs) {
- super(context, attrs);
- initialize();
- }
-
- public HelpTopicView(Context context) {
- super(context);
- initialize();
- }
-
- private void initialize() {
- WebSettings wSet = getSettings();
- wSet.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
- wSet.setUseWideViewPort(false);
- }
-
- public HelpTopicView setTopic(String topic) {
- String path = String.format("file:///android_asset/%s/%s%s",
- HelpActivity.HELPDIR, topic, HelpActivity.SUFFIX);
- loadUrl(path);
-
- computeScroll();
-
- return this;
- }
-}