aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Heroy <johnheroy@gmail.com>2015-10-21 14:23:46 -0700
committerJohn Heroy <johnheroy@gmail.com>2015-10-21 14:23:46 -0700
commit7a3851f2806a061c5ee030ddaed65876ea908e1c (patch)
tree2e7b8f391204a12b7eff0ee06d3d7681f3cacc90
parent9fdcd2b1ce30b456158efe5e12876eb4e445a4c2 (diff)
parentb7f00efd50a7f13156525807a0925e26997bc541 (diff)
downloadconnectbot-7a3851f2806a061c5ee030ddaed65876ea908e1c.tar.gz
connectbot-7a3851f2806a061c5ee030ddaed65876ea908e1c.tar.bz2
connectbot-7a3851f2806a061c5ee030ddaed65876ea908e1c.zip
Merge branch 'master' into volume-seekbar
-rw-r--r--.travis.yml4
-rw-r--r--app/src/main/java/org/connectbot/ConsoleActivity.java15
-rw-r--r--app/src/main/java/org/connectbot/EditHostActivity.java69
-rw-r--r--app/src/main/java/org/connectbot/HostEditorFragment.java584
-rw-r--r--app/src/main/java/org/connectbot/bean/HostBean.java2
-rw-r--r--app/src/main/res/drawable-hdpi/ic_save.pngbin0 -> 247 bytes
-rw-r--r--app/src/main/res/drawable-mdpi/ic_save.pngbin0 -> 168 bytes
-rw-r--r--app/src/main/res/drawable-xhdpi/ic_save.pngbin0 -> 273 bytes
-rw-r--r--app/src/main/res/drawable-xxhdpi/ic_save.pngbin0 -> 391 bytes
-rw-r--r--app/src/main/res/drawable-xxxhdpi/ic_save.pngbin0 -> 504 bytes
-rw-r--r--app/src/main/res/layout/fragment_host_editor.xml461
-rw-r--r--app/src/main/res/menu/edit_host_activity_edit_menu.xml2
-rw-r--r--app/src/main/res/values-ca/strings.xml1
-rw-r--r--app/src/main/res/values-cs/strings.xml1
-rw-r--r--app/src/main/res/values-da/strings.xml1
-rw-r--r--app/src/main/res/values-de/strings.xml1
-rw-r--r--app/src/main/res/values-es/strings.xml42
-rw-r--r--app/src/main/res/values-eu/strings.xml15
-rw-r--r--app/src/main/res/values-fi/strings.xml1
-rw-r--r--app/src/main/res/values-fr/strings.xml1
-rw-r--r--app/src/main/res/values-gl/strings.xml1
-rw-r--r--app/src/main/res/values-he/strings.xml1
-rw-r--r--app/src/main/res/values-hu/strings.xml1
-rw-r--r--app/src/main/res/values-id/strings.xml1
-rw-r--r--app/src/main/res/values-is/strings.xml7
-rw-r--r--app/src/main/res/values-it/strings.xml1
-rw-r--r--app/src/main/res/values-ja/strings.xml35
-rw-r--r--app/src/main/res/values-ko/strings.xml1
-rw-r--r--app/src/main/res/values-nb/strings.xml1
-rw-r--r--app/src/main/res/values-nl/strings.xml1
-rw-r--r--app/src/main/res/values-pl/strings.xml1
-rw-r--r--app/src/main/res/values-pt-rBR/strings.xml1
-rw-r--r--app/src/main/res/values-pt/strings.xml1
-rw-r--r--app/src/main/res/values-ru/strings.xml1
-rw-r--r--app/src/main/res/values-sk/strings.xml1
-rw-r--r--app/src/main/res/values-sr/strings.xml1
-rw-r--r--app/src/main/res/values-sv/strings.xml1
-rw-r--r--app/src/main/res/values-tr/strings.xml1
-rw-r--r--app/src/main/res/values-v11/styles.xml13
-rw-r--r--app/src/main/res/values-zh-rCN/strings.xml34
-rw-r--r--app/src/main/res/values-zh-rTW/strings.xml1
-rw-r--r--app/src/main/res/values/dimens.xml25
-rw-r--r--app/src/main/res/values/strings.xml6
-rw-r--r--app/src/main/res/values/styles.xml36
-rwxr-xr-xscripts/check-lint-count.bash57
-rwxr-xr-xscripts/check-lint-count.sh57
46 files changed, 1020 insertions, 467 deletions
diff --git a/.travis.yml b/.travis.yml
index c3ea0d5..ef9e16c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -25,7 +25,7 @@ addons:
- ia32-libs-multiarch
- libgd2-xpm
- p7zip-full
- - libxml2-utils # ./scripts/check-lint-count.sh
+ - xqilla # ./scripts/check-lint-count.bash
coverity_scan:
project:
name: "connectbot/connectbot"
@@ -55,6 +55,6 @@ android:
script:
- ./gradlew clean build check jacocoUnitTestDebugReport
- - ./scripts/check-lint-count.sh app/build/outputs/lint-results.xml $HOME/.cache/lint/lint-results.xml
+ - ./scripts/check-lint-count.bash app/build/outputs/lint-results.xml $HOME/.cache/lint/lint-results.xml
after_success: ./gradlew coveralls
diff --git a/app/src/main/java/org/connectbot/ConsoleActivity.java b/app/src/main/java/org/connectbot/ConsoleActivity.java
index 3aebd41..0bb7858 100644
--- a/app/src/main/java/org/connectbot/ConsoleActivity.java
+++ b/app/src/main/java/org/connectbot/ConsoleActivity.java
@@ -170,17 +170,22 @@ public class ConsoleActivity extends AppCompatActivity implements BridgeDisconne
// create views for all bridges on this service
adapter.notifyDataSetChanged();
- int requestedIndex = bound.getBridges().indexOf(requestedBridge);
+ final int requestedIndex = bound.getBridges().indexOf(requestedBridge);
if (requestedIndex != -1) {
- setDisplayedTerminal(requestedIndex);
+ pager.post(new Runnable() {
+ @Override
+ public void run() {
+ setDisplayedTerminal(requestedIndex);
+ }
+ });
}
}
public void onServiceDisconnected(ComponentName className) {
+ bound = null;
adapter.notifyDataSetChanged();
updateEmptyVisible();
- bound = null;
}
};
@@ -1035,8 +1040,8 @@ public class ConsoleActivity extends AppCompatActivity implements BridgeDisconne
// Maintain selected host if connected.
if (adapter.getCurrentTerminalView() != null
&& !adapter.getCurrentTerminalView().bridge.isDisconnected()) {
- Uri uri = adapter.getCurrentTerminalView().bridge.host.getUri();
- savedInstanceState.putString(STATE_SELECTED_URI, uri.toString());
+ requested = adapter.getCurrentTerminalView().bridge.host.getUri();
+ savedInstanceState.putString(STATE_SELECTED_URI, requested.toString());
}
super.onSaveInstanceState(savedInstanceState);
diff --git a/app/src/main/java/org/connectbot/EditHostActivity.java b/app/src/main/java/org/connectbot/EditHostActivity.java
index f61924f..d5e2458 100644
--- a/app/src/main/java/org/connectbot/EditHostActivity.java
+++ b/app/src/main/java/org/connectbot/EditHostActivity.java
@@ -24,6 +24,7 @@ import java.util.Map;
import android.content.ComponentName;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.res.TypedArray;
@@ -46,6 +47,8 @@ public class EditHostActivity extends AppCompatActivity implements HostEditorFra
private static final String EXTRA_EXISTING_HOST_ID = "org.connectbot.existing_host_id";
private static final long NO_HOST_ID = -1;
+ private static final int ENABLED_ALPHA = 255;
+ private static final int DISABLED_ALPHA = 130;
private HostDatabase mHostDb;
private PubkeyDatabase mPubkeyDb;
@@ -135,7 +138,7 @@ public class EditHostActivity extends AppCompatActivity implements HostEditorFra
mSaveHostButton = menu.getItem(0);
// If the new host is being created, it can't be added until modifications have been made.
- mSaveHostButton.setEnabled(!mIsCreating);
+ setAddSaveButtonEnabled(!mIsCreating);
return super.onCreateOptionsMenu(menu);
}
@@ -144,14 +147,8 @@ public class EditHostActivity extends AppCompatActivity implements HostEditorFra
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.save:
- mHostDb.saveHost(mHost);
-
- if (mBridge != null) {
- // If the console is already open, apply the new encoding now. If the console
- // was not yet opened, this will be applied automatically when it is opened.
- mBridge.setCharset(mHost.getEncoding());
- }
- finish();
+ case android.R.id.home:
+ attemptSaveAndExit();
return true;
default:
return super.onOptionsItemSelected(item);
@@ -200,14 +197,64 @@ public class EditHostActivity extends AppCompatActivity implements HostEditorFra
public void onValidHostConfigured(HostBean host) {
mHost = host;
if (mSaveHostButton != null)
- mSaveHostButton.setEnabled(true);
+ setAddSaveButtonEnabled(true);
}
@Override
public void onHostInvalidated() {
mHost = null;
if (mSaveHostButton != null)
- mSaveHostButton.setEnabled(false);
+ setAddSaveButtonEnabled(false);
+ }
+
+ @Override
+ public void onBackPressed() {
+ attemptSaveAndExit();
+ }
+
+ /**
+ * If the host represents a valid URI, save it and exit; otherwise, pop up a dialog asking
+ * the user if he/she wants to discard the changes.
+ */
+ private void attemptSaveAndExit() {
+ if (mHost == null) {
+ showDiscardDialog();
+ return;
+ }
+
+ mHostDb.saveHost(mHost);
+
+ if (mBridge != null) {
+ // If the console is already open, apply the new encoding now. If the console
+ // was not yet opened, this will be applied automatically when it is opened.
+ mBridge.setCharset(mHost.getEncoding());
+ }
+ finish();
+ }
+
+ private void showDiscardDialog() {
+ android.support.v7.app.AlertDialog.Builder builder =
+ new android.support.v7.app.AlertDialog.Builder(this);
+ builder.setMessage(R.string.discard_host_changes_message)
+ .setPositiveButton(R.string.discard_host_button, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Do not save to the database - just exit.
+ finish();
+ }
+ })
+ .setNegativeButton(R.string.discard_host_cancel_button, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Do nothing.
+ }
+ });
+ builder.show();
+ }
+
+ private void setAddSaveButtonEnabled(boolean enabled) {
+ mSaveHostButton.setEnabled(enabled);
+ mSaveHostButton.getIcon().setAlpha(enabled ? ENABLED_ALPHA : DISABLED_ALPHA);
}
// Private static class used to generate a list of available Charsets. Note that this class
diff --git a/app/src/main/java/org/connectbot/HostEditorFragment.java b/app/src/main/java/org/connectbot/HostEditorFragment.java
index 56022d7..fe6f838 100644
--- a/app/src/main/java/org/connectbot/HostEditorFragment.java
+++ b/app/src/main/java/org/connectbot/HostEditorFragment.java
@@ -18,6 +18,7 @@
package org.connectbot;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.Map;
import android.content.ContentValues;
@@ -29,19 +30,18 @@ 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.PopupMenu;
import android.support.v7.widget.SwitchCompat;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
+import android.view.MenuItem;
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;
-import android.widget.Spinner;
import android.widget.TextView;
import org.connectbot.bean.HostBean;
@@ -59,7 +59,10 @@ public class HostEditorFragment extends Fragment {
private static final String ARG_PUBKEY_VALUES = "pubkeyValues";
private static final String ARG_QUICKCONNECT_STRING = "quickConnectString";
+ // Note: The "max" value for mFontSizeSeekBar is 32. If these font values change, this value
+ // must be changed in the SeekBar's XML.
private static final int MINIMUM_FONT_SIZE = 8;
+ private static final int MAXIMUM_FONT_SIZE = 40;
// The host being edited.
private HostBean mHost;
@@ -68,10 +71,6 @@ public class HostEditorFragment extends Fragment {
// Lists because Bundles can only contain ArrayLists, not general Lists.
private ArrayList<String> mPubkeyNames;
private ArrayList<String> mPubkeyValues;
-
- // Whether the host is being created for the first time (as opposed to an existing one being
- // edited).
- private boolean mIsCreating;
// The listener for changes to this host.
private Listener mListener;
@@ -86,17 +85,24 @@ public class HostEditorFragment extends Fragment {
// first field, etc.
private boolean mUriFieldEditInProgress = false;
- // Values for the colors displayed in the color Spinner. These are not necessarily the same as
- // the text in the Spinner because the text is localized while these values are not.
+ // Names and values for the colors displayed in the color Spinner. Names are localized, while
+ // values are the same across languages, so the values are the ones saved to the database.
+ private TypedArray mColorNames;
private TypedArray mColorValues;
- // Likewise, but for SSH auth agent values.
+ // Likewise, but for SSH auth agent.
+ private TypedArray mSshAuthNames;
private TypedArray mSshAuthValues;
- // Likewise, but for DEL key values.
+ // Likewise, but for DEL key.
+ private TypedArray mDelKeyNames;
private TypedArray mDelKeyValues;
- private Spinner mTransportSpinner;
+ // A map from Charset display name to Charset value (i.e., unique ID for the Charset).
+ private Map<String, String> mCharsetData;
+
+ private View mTransportItem;
+ private TextView mTransportText;
private TextInputLayout mQuickConnectContainer;
private EditText mQuickConnectField;
private ImageButton mExpandCollapseButton;
@@ -108,20 +114,29 @@ public class HostEditorFragment extends Fragment {
private View mPortContainer;
private EditText mPortField;
private EditText mNicknameField;
- private Spinner mColorSelector;
- private TextView mFontSizeText;
+ private View mColorItem;
+ private TextView mColorText;
+ private EditText mFontSizeText;
private SeekBar mFontSizeSeekBar;
- private Spinner mPubkeySpinner;
- private View mUseSshConfirmationContainer;
+ private View mPubkeyItem;
+ private TextView mPubkeyText;
+ private View mDelKeyItem;
+ private TextView mDelKeyText;
+ private View mEncodingItem;
+ private TextView mEncodingText;
+ private View mUseSshAuthItem;
private SwitchCompat mUseSshAuthSwitch;
- private AppCompatCheckBox mSshAuthConfirmationCheckbox;
+ private View mUseSshConfirmationItem;
+ private AppCompatCheckBox mUseSshConfirmationCheckbox;
+ private View mCompressionItem;
private SwitchCompat mCompressionSwitch;
+ private View mStartShellItem;
private SwitchCompat mStartShellSwitch;
+ private View mStayConnectedItem;
private SwitchCompat mStayConnectedSwitch;
+ private View mCloseOnDisconnectItem;
private SwitchCompat mCloseOnDisconnectSwitch;
private EditText mPostLoginAutomationField;
- private Spinner mDelKeySpinner;
- private Spinner mEncodingSpinner;
public static HostEditorFragment newInstance(
HostBean existingHost, ArrayList<String> pubkeyNames, ArrayList<String> pubkeyValues) {
@@ -147,7 +162,6 @@ public class HostEditorFragment extends Fragment {
Bundle bundle = savedInstanceState == null ? getArguments() : savedInstanceState;
Parcelable existingHostParcelable = bundle.getParcelable(ARG_EXISTING_HOST);
- mIsCreating = existingHostParcelable == null;
if (existingHostParcelable != null) {
mHost = HostBean.fromContentValues((ContentValues) existingHostParcelable);
mHost.setId(bundle.getLong(ARG_EXISTING_HOST_ID));
@@ -166,59 +180,28 @@ public class HostEditorFragment extends Fragment {
Bundle savedInstanceState) {
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, transportNames);
- transportSelection.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mTransportSpinner.setAdapter(transportSelection);
- for (int i = 0; i < transportNames.length; i++) {
- if (transportNames[i].equals(mHost.getProtocol())) {
- mTransportSpinner.setSelection(i);
- break;
- }
- }
- mTransportSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ mTransportItem = view.findViewById(R.id.protocol_item);
+ mTransportItem.setOnClickListener(new View.OnClickListener() {
@Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- String protocol = (String) mTransportSpinner.getSelectedItem();
- if (protocol == null) {
- // During initialization, protocol can be null before the list of dropdown items
- // has been generated. Return early in that case.
- return;
- }
-
- mHost.setProtocol(protocol);
- mHost.setPort(TransportFactory.getTransport(protocol).getDefaultPort());
- handleHostChange();
-
- mQuickConnectContainer.setHint(
- TransportFactory.getFormatHint(protocol, getActivity()));
-
- // Different protocols have different field types, so show only the fields needed.
- if (SSH.getProtocolName().equals(protocol)) {
- mUsernameContainer.setVisibility(View.VISIBLE);
- mHostnameContainer.setVisibility(View.VISIBLE);
- mPortContainer.setVisibility(View.VISIBLE);
- mExpandCollapseButton.setVisibility(View.VISIBLE);
- } else if (Telnet.getProtocolName().equals(protocol)) {
- mUsernameContainer.setVisibility(View.GONE);
- mHostnameContainer.setVisibility(View.VISIBLE);
- mPortContainer.setVisibility(View.VISIBLE);
- mExpandCollapseButton.setVisibility(View.VISIBLE);
- } else {
- // Local protocol has only one field, so no need to show the URI parts
- // container.
- setUriPartsContainerExpanded(false);
- mExpandCollapseButton.setVisibility(View.INVISIBLE);
+ public void onClick(View v) {
+ PopupMenu menu = new PopupMenu(getActivity(), v);
+ for (String name : TransportFactory.getTransportNames()) {
+ menu.getMenu().add(name);
}
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
+ menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ setTransportType(
+ item.getTitle().toString(), /* setDefaultPortInModel */ true);
+ return true;
+ }
+ });
+ menu.show();
}
});
+ mTransportText = (TextView) view.findViewById(R.id.protocol_text);
+
mQuickConnectContainer =
(TextInputLayout) view.findViewById(R.id.quickconnect_field_container);
@@ -237,15 +220,8 @@ public class HostEditorFragment extends Fragment {
@Override
public void afterTextChanged(Editable s) {
- if (mTransportSpinner.getSelectedItem() == null) {
- // During initialization, protocol can be null before the list of dropdown items
- // has been generated. Return early in that case.
- return;
- }
-
if (!mUriFieldEditInProgress) {
- applyQuickConnectString(
- s.toString(), (String) mTransportSpinner.getSelectedItem());
+ applyQuickConnectString(s.toString(), mHost.getProtocol());
mUriFieldEditInProgress = true;
mUsernameField.setText(mHost.getUsername());
@@ -281,39 +257,63 @@ public class HostEditorFragment extends Fragment {
mPortField.setText(Integer.toString(mHost.getPort()));
mPortField.addTextChangedListener(new HostTextFieldWatcher(HostDatabase.FIELD_HOST_PORT));
+ setTransportType(mHost.getProtocol(), /* setDefaultPortInModel */ false);
+
mNicknameField = (EditText) view.findViewById(R.id.nickname_field);
mNicknameField.setText(mHost.getNickname());
mNicknameField.addTextChangedListener(
new HostTextFieldWatcher(HostDatabase.FIELD_HOST_NICKNAME));
- mColorSelector = (Spinner) view.findViewById(R.id.color_selector);
+ mColorItem = view.findViewById(R.id.color_item);
+ mColorItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ PopupMenu menu = new PopupMenu(getActivity(), v);
+ for (int i = 0; i < mColorNames.length(); i++) {
+ menu.getMenu().add(mColorNames.getText(i));
+ }
+ menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ for (int i = 0; i < mColorNames.length(); i++) {
+ if (item.getTitle().toString().equals(mColorNames.getText(i).toString())) {
+ mHost.setColor(mColorValues.getText(i).toString());
+ mColorText.setText(mColorNames.getText(i));
+ return true;
+ }
+ }
+ return false;
+ }
+ });
+ menu.show();
+ }
+ });
+
+ mColorText = (TextView) view.findViewById(R.id.color_text);
for (int i = 0; i < mColorValues.length(); i++) {
- if (mColorValues.getString(i).equals(mHost.getColor())) {
- mColorSelector.setSelection(i);
+ if (mColorValues.getText(i).toString().equals(mHost.getColor())) {
+ mColorText.setText(mColorNames.getText(i));
break;
}
}
- mColorSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- mHost.setColor(mColorValues.getString(position));
- handleHostChange();
- }
+ mFontSizeText = (EditText) view.findViewById(R.id.font_size_text);
+ mFontSizeText.setText(Integer.toString(mHost.getFontSize()));
+ mFontSizeText.addTextChangedListener(
+ new HostTextFieldWatcher(HostDatabase.FIELD_HOST_FONTSIZE));
+ mFontSizeText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
- public void onNothingSelected(AdapterView<?> parent) {
+ public void onFocusChange(View v, boolean hasFocus) {
+ if (!hasFocus)
+ mFontSizeText.setText(Integer.toString(mHost.getFontSize()));
}
});
- mFontSizeText = (TextView) view.findViewById(R.id.font_size_text);
mFontSizeSeekBar = (SeekBar) view.findViewById(R.id.font_size_bar);
mFontSizeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
- int fontSize = MINIMUM_FONT_SIZE + progress;
- mHost.setFontSize(fontSize);
- handleHostChange();
- mFontSizeText.setText(Integer.toString(fontSize));
+ setFontSize(MINIMUM_FONT_SIZE + progress);
}
@Override
@@ -326,116 +326,292 @@ public class HostEditorFragment extends Fragment {
});
mFontSizeSeekBar.setProgress(mHost.getFontSize() - MINIMUM_FONT_SIZE);
- mPubkeySpinner = (Spinner) view.findViewById(R.id.pubkey_spinner);
- final String[] pubkeyNames = new String[mPubkeyNames.size()];
- mPubkeyNames.toArray(pubkeyNames);
- ArrayAdapter<String> pubkeySelection = new ArrayAdapter<String>(
- getActivity(), android.R.layout.simple_spinner_item, pubkeyNames);
- pubkeySelection.setDropDownViewResource(
- android.R.layout.simple_spinner_dropdown_item);
- mPubkeySpinner.setAdapter(pubkeySelection);
- for (int i = 0; i < pubkeyNames.length; i++) {
- if (mHost.getPubkeyId() == Integer.parseInt(mPubkeyValues.get(i))) {
- mPubkeySpinner.setSelection(i);
+ mPubkeyItem = view.findViewById(R.id.pubkey_item);
+ mPubkeyItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ PopupMenu menu = new PopupMenu(getActivity(), v);
+ for (String name : mPubkeyNames) {
+ menu.getMenu().add(name);
+ }
+ menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ for (int i = 0; i < mPubkeyNames.size(); i++) {
+ if (mPubkeyNames.get(i).equals(item.getTitle())) {
+ mHost.setPubkeyId(Long.parseLong(mPubkeyValues.get(i)));
+ mPubkeyText.setText(mPubkeyNames.get(i));
+ return true;
+ }
+ }
+ return false;
+ }
+ });
+ menu.show();
+ }
+ });
+
+ mPubkeyText = (TextView) view.findViewById(R.id.pubkey_text);
+ for (int i = 0; i < mPubkeyValues.size(); i++) {
+ if (mHost.getPubkeyId() == Long.parseLong(mPubkeyValues.get(i))) {
+ mPubkeyText.setText(mPubkeyNames.get(i));
break;
}
}
- mPubkeySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+
+ mDelKeyItem = view.findViewById(R.id.delkey_item);
+ mDelKeyItem.setOnClickListener(new View.OnClickListener() {
@Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- mHost.setPubkeyId(Integer.parseInt(mPubkeyValues.get(position)));
- handleHostChange();
+ public void onClick(View v) {
+ PopupMenu menu = new PopupMenu(getActivity(), v);
+ for (int i = 0; i < mDelKeyNames.length(); i++) {
+ menu.getMenu().add(mDelKeyNames.getText(i));
+ }
+ menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ for (int i = 0; i < mDelKeyNames.length(); i++) {
+ if (mDelKeyNames.getText(i).equals(item.getTitle())) {
+ mHost.setDelKey(mDelKeyValues.getText(i).toString());
+ mDelKeyText.setText(mDelKeyNames.getText(i));
+ return true;
+ }
+ }
+ return false;
+ }
+ });
+ menu.show();
+ }
+ });
+
+ mDelKeyText = (TextView) view.findViewById(R.id.delkey_text);
+ for (int i = 0; i < mDelKeyValues.length(); i++) {
+ if (mDelKeyValues.getText(i).toString().equals(mHost.getDelKey())) {
+ mDelKeyText.setText(mDelKeyNames.getText(i));
+ break;
+ }
+ }
+
+ mEncodingItem = view.findViewById(R.id.encoding_item);
+ mEncodingItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ PopupMenu menu = new PopupMenu(getActivity(), v);
+ for (String displayName : mCharsetData.keySet()) {
+ menu.getMenu().add(displayName);
+ }
+ menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ for (String displayName : mCharsetData.keySet()) {
+ if (displayName.equals(item.getTitle())) {
+ mHost.setEncoding(mCharsetData.get(displayName));
+ mEncodingText.setText(displayName);
+ return true;
+ }
+ }
+ return false;
+ }
+ });
+ menu.show();
}
+ });
+
+ // The encoding text is initialized in setCharsetData() because Charset data is not always
+ // available when this fragment is created.
+ mEncodingText = (TextView) view.findViewById(R.id.encoding_text);
+ mUseSshAuthItem = view.findViewById(R.id.use_ssh_auth_item);
+ mUseSshAuthItem.setOnClickListener(new View.OnClickListener() {
@Override
- public void onNothingSelected(AdapterView<?> parent) {
+ public void onClick(View v) {
+ mUseSshAuthSwitch.toggle();
}
});
- mUseSshConfirmationContainer = view.findViewById(R.id.ssh_confirmation_container);
mUseSshAuthSwitch = (SwitchCompat) view.findViewById(R.id.use_ssh_auth_switch);
- mSshAuthConfirmationCheckbox =
+ mUseSshAuthSwitch.setChecked(mHost.getUseAuthAgent() != null &&
+ !mHost.getUseAuthAgent().equals(mSshAuthValues.getString(0)));
+ mUseSshAuthSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ processSshAuthChange();
+ }
+ });
+
+ mUseSshConfirmationItem = view.findViewById(R.id.ssh_auth_confirmation_item);
+ mUseSshConfirmationItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mUseSshConfirmationCheckbox.toggle();
+ }
+ });
+
+ mUseSshConfirmationCheckbox =
(AppCompatCheckBox) view.findViewById(R.id.ssh_auth_confirmation_checkbox);
- CompoundButton.OnCheckedChangeListener authSwitchListener = new CompoundButton.OnCheckedChangeListener() {
+ mUseSshConfirmationCheckbox.setChecked(mHost.getUseAuthAgent() != null &&
+ mHost.getUseAuthAgent().equals(mSshAuthValues.getString(1)));
+ mUseSshConfirmationCheckbox.setOnCheckedChangeListener(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));
- }
- handleHostChange();
+ processSshAuthChange();
}
- };
- if (mHost.getUseAuthAgent() == null ||
- mHost.getUseAuthAgent().equals(mSshAuthValues.getString(0))) {
- mUseSshAuthSwitch.setChecked(false);
- mSshAuthConfirmationCheckbox.setChecked(false);
- } else {
- mUseSshAuthSwitch.setChecked(true);
- mUseSshConfirmationContainer.setVisibility(View.VISIBLE);
- mSshAuthConfirmationCheckbox.setChecked(
- mHost.getUseAuthAgent().equals(mSshAuthValues.getString(1)));
- }
- mUseSshAuthSwitch.setOnCheckedChangeListener(authSwitchListener);
- mSshAuthConfirmationCheckbox.setOnCheckedChangeListener(authSwitchListener);
+ });
+
+ processSshAuthChange();
+
+ mCompressionItem = view.findViewById(R.id.compression_item);
+ mCompressionItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mCompressionSwitch.toggle();
+ }
+ });
mCompressionSwitch = (SwitchCompat) view.findViewById(R.id.compression_switch);
mCompressionSwitch.setChecked(mHost.getCompression());
- mCompressionSwitch.setOnCheckedChangeListener(
- new HostSwitchWatcher(HostDatabase.FIELD_HOST_COMPRESSION));
+ mCompressionSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mHost.setCompression(isChecked);
+ handleHostChange();
+ }
+ });
+
+ mStartShellItem = view.findViewById(R.id.start_shell_item);
+ mStartShellItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mStartShellSwitch.toggle();
+ }
+ });
mStartShellSwitch = (SwitchCompat) view.findViewById(R.id.start_shell_switch);
mStartShellSwitch.setChecked(mHost.getWantSession());
- mStartShellSwitch.setOnCheckedChangeListener(
- new HostSwitchWatcher(HostDatabase.FIELD_HOST_WANTSESSION));
+ mStartShellSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mHost.setWantSession(isChecked);
+ handleHostChange();
+ }
+ });
+
+ mStayConnectedItem = view.findViewById(R.id.stay_connected_item);
+ mStayConnectedItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mStayConnectedSwitch.toggle();
+ }
+ });
mStayConnectedSwitch = (SwitchCompat) view.findViewById(R.id.stay_connected_switch);
mStayConnectedSwitch.setChecked(mHost.getStayConnected());
- mStayConnectedSwitch.setOnCheckedChangeListener(
- new HostSwitchWatcher(HostDatabase.FIELD_HOST_STAYCONNECTED));
+ mStayConnectedSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mHost.setStayConnected(isChecked);
+ handleHostChange();
+ }
+ });
+
+ mCloseOnDisconnectItem = view.findViewById(R.id.close_on_disconnect_item);
+ mCloseOnDisconnectItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mCloseOnDisconnectSwitch.toggle();
+ }
+ });
mCloseOnDisconnectSwitch = (SwitchCompat) view.findViewById(R.id.close_on_disconnect_switch);
mCloseOnDisconnectSwitch.setChecked(mHost.getQuickDisconnect());
- mCloseOnDisconnectSwitch.setOnCheckedChangeListener(
- new HostSwitchWatcher(HostDatabase.FIELD_HOST_QUICKDISCONNECT));
+ mCloseOnDisconnectSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mHost.setQuickDisconnect(isChecked);
+ handleHostChange();
+ }
+ });
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.length(); i++) {
- if (mHost.getDelKey().equals(mDelKeyValues.getString(i))) {
- mDelKeySpinner.setSelection(i);
- break;
- }
+ setUriPartsContainerExpanded(mIsUriEditorExpanded);
+
+ return view;
+ }
+
+ /**
+ * @param protocol The protocol to set.
+ * @param setDefaultPortInModel True if the model's port should be updated to the default port
+ * for the given protocol.
+ */
+ private void setTransportType(String protocol, boolean setDefaultPortInModel) {
+ mHost.setProtocol(protocol);
+ if (setDefaultPortInModel)
+ mHost.setPort(TransportFactory.getTransport(protocol).getDefaultPort());
+ handleHostChange();
+
+ mTransportText.setText(protocol);
+
+ mQuickConnectContainer.setHint(
+ TransportFactory.getFormatHint(protocol, getActivity()));
+
+ // Different protocols have different field types, so show only the fields needed.
+ if (SSH.getProtocolName().equals(protocol)) {
+ mUsernameContainer.setVisibility(View.VISIBLE);
+ mHostnameContainer.setVisibility(View.VISIBLE);
+ mPortContainer.setVisibility(View.VISIBLE);
+ mExpandCollapseButton.setVisibility(View.VISIBLE);
+ } else if (Telnet.getProtocolName().equals(protocol)) {
+ mUsernameContainer.setVisibility(View.GONE);
+ mHostnameContainer.setVisibility(View.VISIBLE);
+ mPortContainer.setVisibility(View.VISIBLE);
+ mExpandCollapseButton.setVisibility(View.VISIBLE);
+ } else {
+ // Local protocol has only one field, so no need to show the URI parts
+ // container.
+ setUriPartsContainerExpanded(false);
+ mExpandCollapseButton.setVisibility(View.INVISIBLE);
}
- mDelKeySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- mHost.setDelKey(mDelKeyValues.getString(position));
- handleHostChange();
- }
+ }
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- });
+ private void setFontSize(int fontSize) {
+ if (fontSize < MINIMUM_FONT_SIZE)
+ fontSize = MINIMUM_FONT_SIZE;
- mEncodingSpinner = (Spinner) view.findViewById(R.id.encoding_spinner);
- // The spinner is initialized in setCharsetData() because Charset data is not always
- // available when this fragment is created.
+ if (fontSize > MAXIMUM_FONT_SIZE)
+ fontSize = MAXIMUM_FONT_SIZE;
- setUriPartsContainerExpanded(mIsUriEditorExpanded);
+ mHost.setFontSize(fontSize);
- return view;
+ if (mFontSizeSeekBar.getProgress() + MINIMUM_FONT_SIZE != fontSize) {
+ mFontSizeSeekBar.setProgress(fontSize - MINIMUM_FONT_SIZE);
+ }
+
+ if (!mFontSizeText.isFocused() &&
+ Integer.parseInt(mFontSizeText.getText().toString()) != fontSize) {
+ mFontSizeText.setText(Integer.toString(fontSize));
+ }
+
+ handleHostChange();
+ }
+
+ private void processSshAuthChange() {
+ mUseSshConfirmationItem.setVisibility(
+ mUseSshAuthSwitch.isChecked() ? View.VISIBLE : View.GONE);
+
+ if (mUseSshAuthSwitch.isChecked()) {
+ mHost.setUseAuthAgent(
+ mUseSshConfirmationCheckbox.isChecked() ?
+ /* require confirmation */ mSshAuthValues.getString(1) :
+ /* don't require confirmation */ mSshAuthValues.getString(2));
+ } else {
+ mHost.setUseAuthAgent(/* don't use */ mSshAuthValues.getString(0));
+ }
+
+ handleHostChange();
}
@Override
@@ -449,8 +625,11 @@ public class HostEditorFragment extends Fragment {
// Now that the fragment is attached to an Activity, fetch the arrays from the attached
// Activity's resources.
+ mColorNames = getResources().obtainTypedArray(R.array.list_colors);
mColorValues = getResources().obtainTypedArray(R.array.list_color_values);
+ mSshAuthNames = getResources().obtainTypedArray(R.array.list_authagent);
mSshAuthValues = getResources().obtainTypedArray(R.array.list_authagent_values);
+ mDelKeyNames = getResources().obtainTypedArray(R.array.list_delkey);
mDelKeyValues = getResources().obtainTypedArray(R.array.list_delkey_values);
}
@@ -458,8 +637,11 @@ public class HostEditorFragment extends Fragment {
public void onDetach() {
super.onDetach();
mListener = null;
+ mColorNames.recycle();
mColorValues.recycle();
+ mSshAuthNames.recycle();
mSshAuthValues.recycle();
+ mDelKeyNames.recycle();
mDelKeyValues.recycle();
}
@@ -482,32 +664,17 @@ public class HostEditorFragment extends Fragment {
* Charset).
*/
public void setCharsetData(final Map<String, String> data) {
- if (mEncodingSpinner != null) {
- final String[] encodingNames = new String[data.keySet().size()];
- data.keySet().toArray(encodingNames);
- ArrayAdapter<String> encodingSelection = new ArrayAdapter<String>(
- getActivity(), android.R.layout.simple_spinner_item, encodingNames);
- encodingSelection.setDropDownViewResource(
- android.R.layout.simple_spinner_dropdown_item);
- mEncodingSpinner.setAdapter(encodingSelection);
- for (int i = 0; i < encodingNames.length; i++) {
- if (mHost.getEncoding() != null &&
- mHost.getEncoding().equals(data.get(encodingNames[i]))) {
- mEncodingSpinner.setSelection(i);
- break;
+ mCharsetData = data;
+
+ if (mEncodingText != null) {
+ Iterator it = data.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry<String, String> pair = (Map.Entry) it.next();
+ if (pair.getValue().equals(mHost.getEncoding())) {
+ mEncodingText.setText(pair.getKey());
+ return;
}
}
- mEncodingSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
- mHost.setEncoding(data.get(encodingNames[position]));
- handleHostChange();
- }
-
- @Override
- public void onNothingSelected(AdapterView<?> parent) {
- }
- });
}
}
@@ -560,16 +727,14 @@ public class HostEditorFragment extends Fragment {
* notified.
*/
private void handleHostChange() {
- String protocol = (String) mTransportSpinner.getSelectedItem();
String quickConnectString = mQuickConnectField.getText().toString();
- if (protocol == null || protocol.equals("") ||
- quickConnectString == null || quickConnectString.equals("")) {
+ if (quickConnectString == null || quickConnectString.equals("")) {
// Invalid protocol and/or string, so don't do anything.
mListener.onHostInvalidated();
return;
}
- Uri uri = TransportFactory.getUri(protocol, quickConnectString);
+ Uri uri = TransportFactory.getUri(mHost.getProtocol(), quickConnectString);
if (uri == null) {
// Valid string, but does not accurately describe a URI.
mListener.onHostInvalidated();
@@ -581,8 +746,8 @@ public class HostEditorFragment extends Fragment {
}
public interface Listener {
- public void onValidHostConfigured(HostBean host);
- public void onHostInvalidated();
+ void onValidHostConfigured(HostBean host);
+ void onHostInvalidated();
}
private class HostTextFieldWatcher implements TextWatcher {
@@ -617,6 +782,14 @@ public class HostEditorFragment extends Fragment {
mHost.setNickname(text);
} else if (HostDatabase.FIELD_HOST_POSTLOGIN.equals(mFieldType)) {
mHost.setPostLogin(text);
+ } else if (HostDatabase.FIELD_HOST_FONTSIZE.equals(mFieldType)) {
+ int fontSize = HostBean.DEFAULT_FONT_SIZE;
+ try {
+ fontSize = Integer.parseInt(text);
+ } catch (NumberFormatException e) {
+ } finally {
+ setFontSize(fontSize);
+ }
} else {
throw new RuntimeException("Invalid field type.");
}
@@ -640,29 +813,4 @@ 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.");
- }
- handleHostChange();
- }
- }
}
diff --git a/app/src/main/java/org/connectbot/bean/HostBean.java b/app/src/main/java/org/connectbot/bean/HostBean.java
index 438713e..a31f9ec 100644
--- a/app/src/main/java/org/connectbot/bean/HostBean.java
+++ b/app/src/main/java/org/connectbot/bean/HostBean.java
@@ -33,7 +33,7 @@ import android.net.Uri;
public class HostBean extends AbstractBean {
public static final String BEAN_NAME = "host";
- private static final int DEFAULT_FONT_SIZE = 10;
+ public static final int DEFAULT_FONT_SIZE = 10;
/* Database fields */
private long id = -1;
diff --git a/app/src/main/res/drawable-hdpi/ic_save.png b/app/src/main/res/drawable-hdpi/ic_save.png
new file mode 100644
index 0000000..dd3f106
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/ic_save.png
Binary files differ
diff --git a/app/src/main/res/drawable-mdpi/ic_save.png b/app/src/main/res/drawable-mdpi/ic_save.png
new file mode 100644
index 0000000..015062e
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/ic_save.png
Binary files differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_save.png b/app/src/main/res/drawable-xhdpi/ic_save.png
new file mode 100644
index 0000000..adda095
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/ic_save.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_save.png b/app/src/main/res/drawable-xxhdpi/ic_save.png
new file mode 100644
index 0000000..3e0ce1a
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/ic_save.png
Binary files differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_save.png b/app/src/main/res/drawable-xxxhdpi/ic_save.png
new file mode 100644
index 0000000..bd80bf1
--- /dev/null
+++ b/app/src/main/res/drawable-xxxhdpi/ic_save.png
Binary files differ
diff --git a/app/src/main/res/layout/fragment_host_editor.xml b/app/src/main/res/layout/fragment_host_editor.xml
index 5e809d8..e4a2094 100644
--- a/app/src/main/res/layout/fragment_host_editor.xml
+++ b/app/src/main/res/layout/fragment_host_editor.xml
@@ -19,7 +19,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="match_parent"
+ android:fillViewport="true"
tools:context="org.connectbot.HostEditorFragment"
>
@@ -29,31 +30,42 @@
android:orientation="vertical"
>
- <LinearLayout
- android:layout_width="wrap_content"
+ <RelativeLayout
+ android:id="@+id/protocol_item"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginStart="4dp"
- android:layout_marginLeft="4dp"
- android:layout_marginBottom="4dp"
>
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/protocol_spinner_label"
+ style="@style/ListItemIcon"
+ />
+
<TextView
+ android:id="@+id/protocol_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/protocol_spinner_label"
- android:textSize="12sp"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
- <Spinner
- android:id="@+id/transport_selector"
+ <TextView
+ android:id="@+id/protocol_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_below="@id/protocol_title"
+ tools:text="ssh"
+ style="@style/ListItemSecondLineText.WithIcon"
/>
- </LinearLayout>
+ </RelativeLayout>
<LinearLayout
+ android:layout_marginLeft="68dp"
+ android:layout_marginStart="68dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
@@ -96,8 +108,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:layout_marginLeft="56dp"
- android:layout_marginStart="56dp"
+ android:layout_marginLeft="68dp"
+ android:layout_marginStart="68dp"
+ android:layout_marginRight="48dp"
+ android:layout_marginEnd="48dp"
android:visibility="gone"
android:animateLayoutChanges="true"
tools:ignore="UnusedAttribute"
@@ -156,118 +170,219 @@
</LinearLayout>
- <View style="@style/Divider"
- />
-
- <android.support.design.widget.TextInputLayout
+ <RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
- <EditText
- android:id="@+id/nickname_field"
+ <android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:maxLines="1"
- android:inputType="text"
- android:hint="@string/hostpref_nickname_title"
- />
+ android:layout_marginLeft="68dp"
+ android:layout_marginStart="68dp"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ >
+
+ <EditText
+ android:id="@+id/nickname_field"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:maxLines="1"
+ android:inputType="text"
+ android:hint="@string/hostpref_nickname_title"
+ />
- </android.support.design.widget.TextInputLayout>
+ </android.support.design.widget.TextInputLayout>
- <LinearLayout
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/color_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginStart="4dp"
- android:layout_marginLeft="4dp"
- android:layout_marginBottom="4dp"
>
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_color_title"
+ style="@style/ListItemIcon"
+ />
+
<TextView
+ android:id="@+id/color_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hostpref_color_title"
- android:textSize="12sp"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
- <Spinner
- android:id="@+id/color_selector"
+ <TextView
+ android:id="@+id/color_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:entries="@array/list_colors"
- android:entryValues="@array/list_color_values"
+ android:layout_below="@id/color_title"
+ tools:text="gray"
+ style="@style/ListItemSecondLineText.WithIcon"
/>
- </LinearLayout>
+ </RelativeLayout>
- <LinearLayout
+ <RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginStart="4dp"
- android:layout_marginLeft="4dp"
- android:layout_marginBottom="4dp"
>
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_fontsize_title"
+ style="@style/ListItemIcon"
+ />
+
+ <TextView
+ android:id="@+id/font_size_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/hostpref_fontsize_title"
+ style="@style/ListItemFirstLineText.WithIcon"
+ />
+
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginLeft="62dp"
+ android:layout_marginStart="62dp"
+ android:paddingBottom="8dp"
+ android:layout_below="@id/font_size_title"
>
- <TextView
- android:layout_width="wrap_content"
+ <SeekBar
+ android:id="@+id/font_size_bar"
+ android:layout_width="0dp"
+ android:layout_weight="1"
android:layout_height="wrap_content"
- android:text="@string/hostpref_fontsize_title"
- android:textSize="12sp"
+ android:layout_gravity="center"
+ android:max="32"
/>
- <TextView
+ <EditText
android:id="@+id/font_size_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textSize="12sp"
+ android:layout_gravity="center_vertical"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:inputType="number"
+ android:maxLines="1"
+ tools:text="10"
/>
</LinearLayout>
- <SeekBar
- android:id="@+id/font_size_bar"
- android:layout_width="match_parent"
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/pubkey_item"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ >
+
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_pubkeyid_title"
+ style="@style/ListItemIcon"
+ />
+
+ <TextView
+ android:id="@+id/pubkey_title"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:max="32"
+ android:text="@string/hostpref_pubkeyid_title"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
- </LinearLayout>
+ <TextView
+ android:id="@+id/pubkey_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/pubkey_title"
+ tools:text="Use any key"
+ style="@style/ListItemSecondLineText.WithIcon"
+ />
- <View style="@style/Divider"
- />
+ </RelativeLayout>
- <LinearLayout
- android:layout_width="wrap_content"
+ <RelativeLayout
+ android:id="@+id/delkey_item"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginStart="4dp"
- android:layout_marginLeft="4dp"
- android:layout_marginBottom="4dp"
>
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_delkey_title"
+ style="@style/ListItemIcon"
+ />
+
<TextView
+ android:id="@+id/delkey_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/hostpref_pubkeyid_title"
- android:textSize="12sp"
+ android:text="@string/hostpref_delkey_title"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
- <Spinner
- android:id="@+id/pubkey_spinner"
+ <TextView
+ android:id="@+id/delkey_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:entries="@array/list_pubkeyids"
- android:entryValues="@array/list_pubkeyids_value"
+ android:layout_below="@id/delkey_title"
+ tools:text="Delete"
+ style="@style/ListItemSecondLineText.WithIcon"
/>
- </LinearLayout>
+ </RelativeLayout>
+
+ <RelativeLayout
+ android:id="@+id/encoding_item"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ >
+
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_encoding_title"
+ style="@style/ListItemIcon"
+ />
+
+ <TextView
+ android:id="@+id/encoding_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/hostpref_encoding_title"
+ style="@style/ListItemFirstLineText.WithIcon"
+ />
+
+ <TextView
+ android:id="@+id/encoding_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/encoding_title"
+ tools:text="UTF-8"
+ style="@style/ListItemSecondLineText.WithIcon"
+ />
+
+ </RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
@@ -276,14 +391,17 @@
>
<RelativeLayout
+ android:id="@+id/use_ssh_auth_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/hostpref_authagent_title"
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_authagent_title"
+ style="@style/ListItemIcon"
/>
<android.support.v7.widget.SwitchCompat
@@ -292,14 +410,28 @@
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:layout_centerVertical="true"
+ />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@id/use_ssh_auth_switch"
+ android:layout_toStartOf="@id/use_ssh_auth_switch"
+ android:text="@string/hostpref_authagent_title"
+ android:paddingBottom="24dp"
+ style="@style/ListItemFirstLineText.WithIcon"
+ tools:ignore="RelativeOverlap"
/>
</RelativeLayout>
<RelativeLayout
- android:id="@+id/ssh_confirmation_container"
+ android:id="@+id/ssh_auth_confirmation_item"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="32dp"
android:visibility="gone"
>
@@ -307,6 +439,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hostpref_authagent_with_confirmation"
+ android:textSize="14sp"
+ android:layout_marginTop="8dp"
+ android:layout_marginLeft="72dp"
+ android:layout_marginStart="72dp"
/>
<android.support.v7.widget.AppCompatCheckBox
@@ -315,6 +451,7 @@
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
+ android:padding="16dp"
/>
</RelativeLayout>
@@ -322,14 +459,25 @@
</LinearLayout>
<RelativeLayout
+ android:id="@+id/compression_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_compression_title"
+ style="@style/ListItemIcon"
+ />
+
<TextView
- android:layout_width="match_parent"
+ android:id="@+id/compression_title"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hostpref_compression_title"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
<android.support.v7.widget.SwitchCompat
@@ -338,19 +486,43 @@
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:layout_centerVertical="true"
+ />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_toLeftOf="@id/compression_switch"
+ android:layout_toStartOf="@id/compression_switch"
+ android:layout_below="@id/compression_title"
+ android:text="@string/hostpref_compression_summary"
+ style="@style/ListItemSecondLineText.WithIcon"
/>
</RelativeLayout>
<RelativeLayout
+ android:id="@+id/start_shell_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_wantsession_title"
+ style="@style/ListItemIcon"
+ />
+
<TextView
- android:layout_width="match_parent"
+ android:id="@+id/shell_session_title"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hostpref_wantsession_title"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
<android.support.v7.widget.SwitchCompat
@@ -359,19 +531,43 @@
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:layout_centerVertical="true"
+ />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/hostpref_wantsession_summary"
+ android:layout_toLeftOf="@id/start_shell_switch"
+ android:layout_toStartOf="@id/start_shell_switch"
+ android:layout_below="@id/shell_session_title"
+ style="@style/ListItemSecondLineText.WithIcon"
/>
</RelativeLayout>
<RelativeLayout
+ android:id="@+id/stay_connected_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_stayconnected_title"
+ style="@style/ListItemIcon"
+ />
+
<TextView
- android:layout_width="match_parent"
+ android:id="@+id/stay_connected_title"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hostpref_stayconnected_title"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
<android.support.v7.widget.SwitchCompat
@@ -380,19 +576,43 @@
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:layout_centerVertical="true"
+ />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/hostpref_stayconnected_summary"
+ android:layout_toLeftOf="@id/stay_connected_switch"
+ android:layout_toStartOf="@id/stay_connected_switch"
+ android:layout_below="@id/stay_connected_title"
+ style="@style/ListItemSecondLineText.WithIcon"
/>
</RelativeLayout>
<RelativeLayout
+ android:id="@+id/close_on_disconnect_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_quickdisconnect_title"
+ style="@style/ListItemIcon"
+ />
+
<TextView
- android:layout_width="match_parent"
+ android:id="@+id/close_on_disconnect_title"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hostpref_quickdisconnect_title"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
<android.support.v7.widget.SwitchCompat
@@ -401,81 +621,70 @@
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
+ android:layout_marginRight="16dp"
+ android:layout_marginEnd="16dp"
+ android:layout_centerVertical="true"
/>
- </RelativeLayout>
-
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- >
-
<TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/hostpref_postlogin_title"
- />
-
- <EditText
- android:id="@+id/post_login_automation_field"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_width="fill_parent"
- android:inputType="textMultiLine"
- android:lines="8"
- android:minLines="2"
+ android:text="@string/hostpref_quickdisconnect_summary"
+ android:layout_toLeftOf="@id/close_on_disconnect_switch"
+ android:layout_toStartOf="@id/close_on_disconnect_switch"
+ android:layout_below="@id/close_on_disconnect_title"
+ style="@style/ListItemSecondLineText.WithIcon"
/>
</RelativeLayout>
- <LinearLayout
- android:layout_width="wrap_content"
+ <RelativeLayout
+ android:id="@+id/postlogin_item"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginStart="4dp"
- android:layout_marginLeft="4dp"
- android:layout_marginBottom="4dp"
>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/hostpref_delkey_title"
- android:textSize="12sp"
+ <ImageView
+ android:layout_width="24dp"
+ android:layout_height="24dp"
+ android:src="@drawable/icon"
+ android:contentDescription="@string/hostpref_postlogin_title"
+ style="@style/ListItemIcon"
/>
- <Spinner
- android:id="@+id/del_key_spinner"
+ <TextView
+ android:id="@+id/postlogin_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:entries="@array/list_delkey"
- android:entryValues="@array/list_delkey_values"
+ android:text="@string/hostpref_postlogin_title"
+ style="@style/ListItemFirstLineText.WithIcon"
/>
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginStart="4dp"
- android:layout_marginLeft="4dp"
- android:layout_marginBottom="4dp"
- >
-
<TextView
+ android:id="@+id/postlogin_summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/hostpref_encoding_title"
- android:textSize="12sp"
+ android:text="@string/hostpref_postlogin_summary"
+ android:layout_below="@id/postlogin_title"
+ android:layout_alignParentBottom="false"
+ android:paddingBottom="2dp"
+ style="@style/ListItemSecondLineText.WithIcon"
/>
- <Spinner
- android:id="@+id/encoding_spinner"
- android:layout_width="wrap_content"
+ <EditText
+ android:id="@+id/post_login_automation_field"
android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:layout_marginLeft="72dp"
+ android:layout_marginStart="72dp"
+ android:layout_below="@id/postlogin_summary"
+ android:inputType="textMultiLine"
+ android:lines="8"
+ android:minLines="2"
/>
- </LinearLayout>
+
+ </RelativeLayout>
</LinearLayout>
diff --git a/app/src/main/res/menu/edit_host_activity_edit_menu.xml b/app/src/main/res/menu/edit_host_activity_edit_menu.xml
index 564e211..ecc8171 100644
--- a/app/src/main/res/menu/edit_host_activity_edit_menu.xml
+++ b/app/src/main/res/menu/edit_host_activity_edit_menu.xml
@@ -22,7 +22,7 @@
>
<item android:id="@+id/save"
- android:icon="@drawable/ic_add"
+ android:icon="@drawable/ic_save"
android:title="@string/hostpref_edit_host"
connectbot:showAsAction="always|withText"
/>
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 2c166e2..1d55856 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -91,7 +91,6 @@
<string name="pref_wifilock_title">Manté activa la Wi-Fi</string>
<string name="pref_wifilock_summary">Evita que la Wi-Fi s\'apagui mentre hi ha una sessió activa</string>
<string name="pref_bumpyarrows_title">Cursors vibrants</string>
- <string name="pref_bumpyarrows_summary">Vibra quan s\'envien els cursors de direcció amb la rodeta; útil per connexions lentes</string>
<string name="pref_bell_category">So del Terminal</string>
<string name="pref_bell_title">So activat</string>
<string name="pref_bell_volume_title">Volum del so</string>
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index ddfb44f..42ee1f7 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -89,7 +89,6 @@
<string name="pref_wifilock_title">Ponechat Wi-Fi aktivní</string>
<string name="pref_wifilock_summary">Zabránit Wi-Fi ve vypnutí když je sezení aktivní</string>
<string name="pref_bumpyarrows_title">Hmatová odezva šipek</string>
- <string name="pref_bumpyarrows_summary">Vibrovat při posílání kurzorových kláves z trackballu; užitečná pro špatná spojení</string>
<string name="pref_bell_category">Zvonek terminálu</string>
<string name="pref_bell_title">Zvukové upozornění</string>
<string name="pref_bell_volume_title">Hlasitost zvonku</string>
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 1f6b466..9163a54 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -89,7 +89,6 @@
<string name="pref_wifilock_title">Hold Wi-Fi aktiv</string>
<string name="pref_wifilock_summary">Undgå at Wi-Fi slår fra imens en session er aktiv</string>
<string name="pref_bumpyarrows_title">Vibrerende pile</string>
- <string name="pref_bumpyarrows_summary">Vibrér når der afsendes piletaster fra trackballen; nyttig ved langsomme forbindelser</string>
<string name="pref_bell_category">Terminalklokke</string>
<string name="pref_bell_title">Hørbar klokke</string>
<string name="pref_bell_volume_title">Klokke volume</string>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 2fd8715..14ed4c7 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -91,7 +91,6 @@
<string name="pref_wifilock_title">WLAN aktiviert lassen</string>
<string name="pref_wifilock_summary">Verhindern, dass während einer aktiven Sitzung WLAN deaktiviert wird</string>
<string name="pref_bumpyarrows_title">Vibrierende Pfeiltasten</string>
- <string name="pref_bumpyarrows_summary">Vibirieren, wenn Pfeiltasten vom Trackball gesendet werden; nützlich bei laggenden Verbindungen</string>
<string name="pref_bell_category">Terminalglocke</string>
<string name="pref_bell_title">Hörbare Glocke</string>
<string name="pref_bell_volume_title">Glockenlautstärke</string>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index ccd0327..6ed169b 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -1,14 +1,16 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
- <string name="app_desc">Cliente de SSH sencillo, potente y open-source</string>
- <string name="service_desc">Mantiene conexiones SSH y las claves públicas guardadas</string>
- <string name="title_hosts_list">Máquinas</string>
+ <string name="app_desc">Cliente de SSH sencillo, potente y de código abierto.</string>
+ <string name="service_desc">Mantiene las conexiones SSH y las claves públicas cargadas</string>
+ <string name="title_hosts_list">Servidores</string>
<string name="title_pubkey_list">Claves Publicas</string>
<string name="title_port_forwards_list">Traducciones de puerto</string>
<string name="title_host_editor">Editar equipo remoto</string>
<string name="title_help">Ayuda</string>
<string name="title_colors">Colores</string>
<string name="title_color_picker">Escoger un color</string>
+ <string name="title_settings">Ajustes</string>
+ <string name="title_pubkey_generate">Generar</string>
<string name="resolve_connect">Conectar</string>
<string name="resolve_entropy">Recolectar entropía</string>
<string name="menu_insert">Añadir equipo remoto</string>
@@ -17,6 +19,10 @@
<string name="help_intro">Por favor seleccione un tema a continuación para más información sobre una materia en particular.</string>
<string name="help_about">Acerca de ConnectBot</string>
<string name="help_keyboard">Teclado</string>
+ <string name="terms_and_conditions">Términos y condiciones</string>
+ <string name="keyboard_shortcuts">Atajos de teclado</string>
+ <string name="increase_font_size">Aumentar el tamaño de letra</string>
+ <string name="decrease_font_size">Disminuir el tamaño de letra</string>
<string name="pubkey_generate">Generar</string>
<string name="pubkey_delete">Eliminar clave</string>
<string name="pubkey_gather_entropy">Haciendo acopio de entropía</string>
@@ -62,6 +68,7 @@
<string name="alert_key_corrupted_msg">¡La clave privada parece corrupta!</string>
<string name="alert_sdcard_absent">¡Tarjeta SD no insertada!</string>
<string name="button_add">Añadir</string>
+ <string name="button_cancel">Cancelar</string>
<string name="button_change">Modificar</string>
<string name="button_generate">Generar clave</string>
<string name="button_resize">Redimensionar</string>
@@ -93,6 +100,7 @@
<string name="pref_keymode_title">Secuencia de teclas para directorios</string>
<string name="pref_keymode_summary">Especifique como usar Alt para \'/\' y Shit para Tab</string>
<string name="pref_stickymodifiers_title">Corrección de errores al teclear</string>
+ <string name="pref_stickymodifiers_summary">Los atajos combinados de tecla permanecen activos hasta que otra tecla sea pulsada</string>
<string name="only_alt">Detener solamente</string>
<string name="pref_camera_title">Boton de la Cámara</string>
<string name="pref_camera_summary">Especifique que secuencia de teclas activar cuando presione el botón de la cámara</string>
@@ -101,7 +109,6 @@
<string name="pref_wifilock_title">Mantener la red inálambrica activa</string>
<string name="pref_wifilock_summary">Prevenir que la red inálambrica se apague mientras haya una conexión activa</string>
<string name="pref_bumpyarrows_title">Cursor con vibración</string>
- <string name="pref_bumpyarrows_summary">Vibrar al recibir las teclas del cursor desde el trackball; útil para conexiones con retardos</string>
<string name="pref_bell_category">Timbre del terminal</string>
<string name="pref_bell_title">Timbre audible</string>
<string name="pref_bell_volume_title">Volúmen del timbre</string>
@@ -181,6 +188,9 @@
<string name="delete_message">¿Está seguro de que quiere eliminar \'%1$s\'?</string>
<string name="delete_pos">Sí, eliminar</string>
<string name="delete_neg">Cancelar</string>
+ <string name="disconnect_all_message">¿Está seguro de que quiere desconectarse de todos los equipos host?</string>
+ <string name="disconnect_all_pos">Sí, desconectar</string>
+ <string name="disconnect_all_neg">Cancelar</string>
<string name="terminal_no_hosts_connected">No hay equipos conectados ahora</string>
<string name="terminal_connecting">Conectando a %1$s:%2$d via %3$s</string>
<string name="terminal_sucess">Host (equipo anfitrion) \'%1$s\' clave: %2$s verifiado.</string>
@@ -219,5 +229,29 @@
<string name="image_description_key_is_locked">Clave pública bloqueada.</string>
<string name="image_description_toggle_control_character">Activar el envío de la pulsación de tecla Control.</string>
<string name="image_description_send_escape_character">Enviar una pulsación de la tecla Escape.</string>
+ <string name="image_description_send_tab_character">Enviar una pulsación de la tecla TAB (Tabulador).</string>
<string name="image_description_show_keyboard">Mostrar teclado.</string>
+ <string name="image_description_up">Tecla cursor arriba</string>
+ <string name="image_description_down">Tecla cursor abajo</string>
+ <string name="image_description_left">Tecla cursor a la izquierda</string>
+ <string name="image_description_right">Tecla cursor a la derecha</string>
+ <string name="button_key_esc">Escape</string>
+ <string name="button_key_ctrl">Ctrl</string>
+ <string name="button_key_tab">TAB (Tabulador)</string>
+ <string name="button_key_home">Inicio</string>
+ <string name="button_key_end">Finalizar</string>
+ <string name="button_key_pgup">Re Pág</string>
+ <string name="button_key_pgdn">Av Pág</string>
+ <string name="button_key_f1">F1</string>
+ <string name="button_key_f2">F2</string>
+ <string name="button_key_f3">F3</string>
+ <string name="button_key_f4">F4</string>
+ <string name="button_key_f5">F5</string>
+ <string name="button_key_f6">F6</string>
+ <string name="button_key_f7">F7</string>
+ <string name="button_key_f8">F8</string>
+ <string name="button_key_f9">F9</string>
+ <string name="button_key_f10">F10</string>
+ <string name="button_key_f11">F11</string>
+ <string name="button_key_f12">F12</string>
</resources>
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 52eedc7..edb4915 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -17,6 +17,10 @@
<string name="help_intro">Mesedez, hautatu beheko gaietako bat informazio gehiago nahi izanez gero.</string>
<string name="help_about">ConnectBot-i buruz</string>
<string name="help_keyboard">Teklatua</string>
+ <string name="terms_and_conditions">Baldintzak</string>
+ <string name="keyboard_shortcuts">Laster-teklak</string>
+ <string name="increase_font_size">Handiagotu letra-tamaina</string>
+ <string name="decrease_font_size">Txikiagotu letra-tamaina</string>
<string name="pubkey_generate">Sortu</string>
<string name="pubkey_delete">Ezabatu gakoa</string>
<string name="pubkey_gather_entropy">Entropia biltzen</string>
@@ -96,7 +100,6 @@
<string name="pref_wifilock_title">Mantendu WiFi-a aktibo</string>
<string name="pref_wifilock_summary">Galarazi WiFi-a itzaltzea saio aktibo bat dagoen bitartean</string>
<string name="pref_bumpyarrows_title">Bibraziodun geziak</string>
- <string name="pref_bumpyarrows_summary">Bibratu trackball bidez erakusle-geziak bidaltzean; atzerapendun konexioentzat egokia</string>
<string name="pref_bell_category">Terminalaren txirrina</string>
<string name="pref_bell_title">Txirrin entzungarria</string>
<string name="pref_bell_volume_title">Txirrinaren bolumena</string>
@@ -175,6 +178,8 @@
<string name="delete_message">Ziur zaude \'%1$s\' ezabatu nahi duzula?</string>
<string name="delete_pos">Bai, ezabatu</string>
<string name="delete_neg">Utzi</string>
+ <string name="disconnect_all_pos">Bai, deskonektatu</string>
+ <string name="disconnect_all_neg">Utzi</string>
<string name="terminal_no_hosts_connected">Ez dago ostalaririk konektatuta une honetan</string>
<string name="terminal_connecting">%1$s:%2$d-ra konektatzen %3$s bidez</string>
<string name="terminal_sucess">Egiaztatutako ostalaria \'%1$s\' gakoa: %2$s</string>
@@ -211,5 +216,13 @@
<string name="image_description_key_is_locked">Gakoa blokeatuta dago.</string>
<string name="image_description_toggle_control_character">Txandakatu kontrol karakterea.</string>
<string name="image_description_send_escape_character">Bidali ihes karakterea.</string>
+ <string name="image_description_send_tab_character">Bidali TAB karakterea.</string>
<string name="image_description_show_keyboard">Erakutsi teklatua.</string>
+ <string name="image_description_up">Gora gezia</string>
+ <string name="image_description_down">Behera gezia</string>
+ <string name="image_description_left">Ezkerra gezia</string>
+ <string name="image_description_right">Eskuina gezia</string>
+ <string name="button_key_esc">Esc</string>
+ <string name="button_key_ctrl">Ktrl</string>
+ <string name="button_key_tab">Tab</string>
</resources>
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index b50add6..e67da3d 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -88,7 +88,6 @@
<string name="pref_wifilock_title">Pidä Wi-Fi-yhteys päällä</string>
<string name="pref_wifilock_summary">Estää Wi-Fi-yhteyden katkaisemisen kun istunto on aktiivinen</string>
<string name="pref_bumpyarrows_title">Värinä nuolista</string>
- <string name="pref_bumpyarrows_summary">Värinäefekti aina kun nuolinäppäinten painalluksia lähetetään palvelimelle. Kätevä hitaille yhteyksille.</string>
<string name="pref_bell_category">Päätteen kello</string>
<string name="pref_bell_title">Kellon äänet käytössä</string>
<string name="pref_bell_volume_title">Kellon äänenvoimakkuus</string>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index bb0dee8..7acc678 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -99,7 +99,6 @@
<string name="pref_wifilock_title">Garder le Wi-Fi actif</string>
<string name="pref_wifilock_summary">Empêcher la désactivation du Wi-Fi quand une session est active</string>
<string name="pref_bumpyarrows_title">Flêches vibrantes</string>
- <string name="pref_bumpyarrows_summary">Vibrer lors de l\'envoi d\'une touche directionnelle à partir du trackball ; intéressant pour les connexions lentes</string>
<string name="pref_bell_category">Cloche du terminal</string>
<string name="pref_bell_title">Alerte sonore</string>
<string name="pref_bell_volume_title">Volume de l\'alerte</string>
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 3bc8b23..8e3758d 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -79,7 +79,6 @@
<string name="pref_keepalive_summary">Evitar que a pantalla se apague ao traballar nunha consola</string>
<string name="pref_wifilock_title">Manter a Wi-Fi activa</string>
<string name="pref_wifilock_summary">Evitar que a Wi-Fi se apague mentres a sesión está activa</string>
- <string name="pref_bumpyarrows_summary">Vibrar ao enviar teclas de dirección dende o trackball; útil para conexións con retardos</string>
<string name="pref_bell_category">Timbre do terminal</string>
<string name="pref_bell_title">Timbre audible</string>
<string name="pref_bell_volume_title">Volume do timbre</string>
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index b3cba42..b40db2a 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -90,7 +90,6 @@
<string name="pref_wifilock_title">להשאיר את הרשת האלחוטית פעילה</string>
<string name="pref_wifilock_summary">למנוע את כיבוי מתאם הרשת האלחוטית כאשר ישנו חלון פעיל</string>
<string name="pref_bumpyarrows_title">חצים עם רטט</string>
- <string name="pref_bumpyarrows_summary">המכשיר ירטוט בעת שליחת מקשי חצים מכדור הגלילה; שימוש לחיבורים אטיים</string>
<string name="pref_bell_category">פעמון מסוף</string>
<string name="pref_bell_title">פעמון עם צליל</string>
<string name="pref_bell_volume_title">עצמת הפעמון</string>
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 5a102c7..d1c0f7c 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -89,7 +89,6 @@
<string name="pref_wifilock_title">Tartsa fenn a Wi-Fi kapcsolatot</string>
<string name="pref_wifilock_summary">Akadályozza meg a Wi-Fi kikapcsolását amíg a munka zajlik</string>
<string name="pref_bumpyarrows_title">Ugráló nyilak</string>
- <string name="pref_bumpyarrows_summary">Vibráljon amikor a hanyattegérrel mozgatjuk a kurzort; hasznos lehet lassú kapcsolatoknál</string>
<string name="pref_bell_category">Terminál csengő</string>
<string name="pref_bell_title">Hallható csengő</string>
<string name="pref_bell_volume_title">Csengő hangereje</string>
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index d0bd68f..3f65a82 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -90,7 +90,6 @@
<string name="pref_wifilock_title">Wi-Fi selalu aktif</string>
<string name="pref_wifilock_summary">Jaga Wi-Fi agar tidak padam ketika sesi aktif</string>
<string name="pref_bumpyarrows_title">Panah belok</string>
- <string name="pref_bumpyarrows_summary">Getarkan saat mengirim tombol panah dari trackball, berguna untuk koneksi lambat</string>
<string name="pref_bell_category">Bel terminal</string>
<string name="pref_bell_title">Bel berdering</string>
<string name="pref_bell_volume_title">Volume dering</string>
diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml
index 1ae4b42..f2f2b76 100644
--- a/app/src/main/res/values-is/strings.xml
+++ b/app/src/main/res/values-is/strings.xml
@@ -68,7 +68,7 @@
<string name="pref_ui_category">Notenda viðmót</string>
<string name="pref_rotation_title">Snúnings hamur</string>
<string name="pref_rotation_summary">Hvernig breyta skal snúningnum þegar lyklaborðið er sýnilegt/falið</string>
- <string name="pref_fullscreen_title">Fylla skjáinn</string>
+ <string name="pref_fullscreen_title">Fullskjáhamur</string>
<string name="pref_fullscreen_summary">Fela stöðustiku þegar tenging er virk</string>
<string name="pref_memkeys_title">Geyma lykla í minni</string>
<string name="pref_memkeys_summary">Geyma ólæsta lykla í minni þangað til forritinu er lokað</string>
@@ -82,7 +82,6 @@
<string name="pref_keepalive_summary">Banna skjánum að slokkna þegar tenging er virk</string>
<string name="pref_wifilock_title">Halda þráðlausu neti í gangi</string>
<string name="pref_wifilock_summary">Halda þráðlausu neti í gangi þegar tenging er virk</string>
- <string name="pref_bumpyarrows_summary">Titra þegar örvar eru sendar með trackball; sniðugt fyrir óstöðugar tengingar</string>
<string name="pref_bell_category">Terminal bjalla</string>
<string name="pref_bell_title">Bjalla með hljóði</string>
<string name="pref_bell_volume_title">Hljóðstyrkur bjöllu</string>
@@ -106,7 +105,7 @@
<string name="hostpref_encoding_title">Kóðun</string>
<string name="hostpref_connection_category">Stillingar fyrir tengingu</string>
<string name="hostpref_username_title">Notendanafn</string>
- <string name="hostpref_hostname_title">Þjónn</string>
+ <string name="hostpref_hostname_title">Hýsill</string>
<string name="hostpref_port_title">Port</string>
<string name="bind_never">Aldrei tengt</string>
<string name="console_copy_done">Afritaði %1$d bæti</string>
@@ -159,7 +158,7 @@
<string name="with_confirmation">Með staðfestingu</string>
<string name="yes">Já</string>
<string name="exceptions_submit_message">Það lítur út fyrir að ConnectBot hafi verið í vandræðum síðast þegar það keyrði. Viltu senda villu greiningu á höfunda forritsins?</string>
- <string name="menu_colors_reset">Endurstilla</string>
+ <string name="menu_colors_reset">Frumstilla</string>
<string name="app_is_running">ConnectBot er í gangi</string>
<string name="color_red">rauður</string>
<string name="color_green">grænn</string>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 33144e5..53824b7 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -91,7 +91,6 @@
<string name="pref_wifilock_title">Mantieni Wi-Fi attivo</string>
<string name="pref_wifilock_summary">Non spegne la connessione Wi-Fi quando una sessione è attiva</string>
<string name="pref_bumpyarrows_title">Vibrazione frecce</string>
- <string name="pref_bumpyarrows_summary">Vibra quando si inviano movimenti con la trackball; utile per connessioni lente</string>
<string name="pref_bell_category">Campanella del terminale</string>
<string name="pref_bell_title">Campanella udibile</string>
<string name="pref_bell_volume_title">Volume della campanella</string>
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index ffe5bfd..2c2bdbb 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -9,6 +9,8 @@
<string name="title_help">ヘルプ</string>
<string name="title_colors">配色</string>
<string name="title_color_picker">色の取得</string>
+ <string name="title_settings">設定</string>
+ <string name="title_pubkey_generate">生成</string>
<string name="resolve_connect">接続</string>
<string name="resolve_entropy">エントロピーの取得</string>
<string name="menu_insert">ホストを追加</string>
@@ -17,6 +19,10 @@
<string name="help_intro">特定の情報について知りたいときは、以下のトピックを選択してください。</string>
<string name="help_about">ConnectBotについて</string>
<string name="help_keyboard">キーボード</string>
+ <string name="terms_and_conditions">利用規約</string>
+ <string name="keyboard_shortcuts">キーボードショートカット</string>
+ <string name="increase_font_size">フォントサイズを大きくする</string>
+ <string name="decrease_font_size">フォントサイズを小さくする</string>
<string name="pubkey_generate">生成</string>
<string name="pubkey_delete">鍵を削除</string>
<string name="pubkey_gather_entropy">エントロピー収集中</string>
@@ -62,6 +68,7 @@
<string name="alert_key_corrupted_msg">秘密鍵が壊れています!</string>
<string name="alert_sdcard_absent">SD カードが挿入されていません.</string>
<string name="button_add">追加</string>
+ <string name="button_cancel">キャンセル</string>
<string name="button_change">変更</string>
<string name="button_generate">鍵生成</string>
<string name="button_resize">リサイズ</string>
@@ -102,7 +109,6 @@
<string name="pref_wifilock_title">Wi-Fiをスリープしない</string>
<string name="pref_wifilock_summary">セッションが有効な間Wi-FiがOFFになるのを防ぎます</string>
<string name="pref_bumpyarrows_title">矢印で振動</string>
- <string name="pref_bumpyarrows_summary">トラックボールで矢印キーを送信するときに振動します; ラグがある接続時に便利</string>
<string name="pref_bell_category">端末音設定</string>
<string name="pref_bell_title">ベル音</string>
<string name="pref_bell_volume_title">ボリューム設定</string>
@@ -182,6 +188,9 @@
<string name="delete_message">\'%1$s\'を削除してよろしいですか?</string>
<string name="delete_pos">はい、削除します</string>
<string name="delete_neg">キャンセル</string>
+ <string name="disconnect_all_message">接続されたホストをすべて切断してもよろしいですか?</string>
+ <string name="disconnect_all_pos">はい、切断します</string>
+ <string name="disconnect_all_neg">キャンセル</string>
<string name="terminal_no_hosts_connected">接続済みのホストはありません.</string>
<string name="terminal_connecting">%1$s:%2$dに%3$sで接続しています</string>
<string name="terminal_sucess">ホスト\'%1$s\' キー%2$s を検証しました</string>
@@ -220,5 +229,29 @@
<string name="image_description_key_is_locked">キーがロックされました。</string>
<string name="image_description_toggle_control_character">コントロール文字を切り替えます。</string>
<string name="image_description_send_escape_character">エスケープ文字を送信します。</string>
+ <string name="image_description_send_tab_character">Tabキーを送信します。</string>
<string name="image_description_show_keyboard">キーボードを表示します。</string>
+ <string name="image_description_up">上矢印</string>
+ <string name="image_description_down">下矢印</string>
+ <string name="image_description_left">左矢印</string>
+ <string name="image_description_right">右矢印</string>
+ <string name="button_key_esc">Esc</string>
+ <string name="button_key_ctrl">Ctrl</string>
+ <string name="button_key_tab">Tab</string>
+ <string name="button_key_home">Home</string>
+ <string name="button_key_end">End</string>
+ <string name="button_key_pgup">PgUp</string>
+ <string name="button_key_pgdn">PgDn</string>
+ <string name="button_key_f1">F1</string>
+ <string name="button_key_f2">F2</string>
+ <string name="button_key_f3">F3</string>
+ <string name="button_key_f4">F4</string>
+ <string name="button_key_f5">F5</string>
+ <string name="button_key_f6">F6</string>
+ <string name="button_key_f7">F7</string>
+ <string name="button_key_f8">F8</string>
+ <string name="button_key_f9">F9</string>
+ <string name="button_key_f10">F10</string>
+ <string name="button_key_f11">F11</string>
+ <string name="button_key_f12">F12</string>
</resources>
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index bd33a12..6305e9f 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -82,7 +82,6 @@
<string name="pref_wifilock_title">Wi-Fi 켜짐 유지</string>
<string name="pref_wifilock_summary">세션이 유효한 동안 Wi-Fi가 꺼지지 않도록 함</string>
<string name="pref_bumpyarrows_title">방향키 진동</string>
- <string name="pref_bumpyarrows_summary">트랙볼로 방향키를 보낼 때 진동합니다; 연결이 느린 경우 유용</string>
<string name="pref_bell_category">터미널 벨</string>
<string name="pref_bell_title">벨소리</string>
<string name="pref_bell_volume_title">벨 볼륨</string>
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index c7351e5..78b3c49 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -89,7 +89,6 @@
<string name="pref_wifilock_title">Hold Wi-Fi aktiv</string>
<string name="pref_wifilock_summary">Hindre Wi-Fi å koble fra når en økt er aktiv</string>
<string name="pref_bumpyarrows_title">Vibrerende piler</string>
- <string name="pref_bumpyarrows_summary">Vibrer når pilkommandoer sendes med styrekule; nyttig for trege forbindelser</string>
<string name="pref_bell_category">Terminalklokke</string>
<string name="pref_bell_title">Varselklokke</string>
<string name="pref_bell_volume_title">Klokkevolum</string>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 01a64ae..251cdc0 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -89,7 +89,6 @@
<string name="pref_wifilock_title">Houd Wi-Fi actief</string>
<string name="pref_wifilock_summary">Voorkom Wi-Fi van uitgaan wanneer er een sessie actief is</string>
<string name="pref_bumpyarrows_title">Hobbelige pijlen</string>
- <string name="pref_bumpyarrows_summary">Tril als pijl knoppen worden gestuurd van trackball; handig voor langzame verbindingen</string>
<string name="pref_bell_category">Terminal bel</string>
<string name="pref_bell_title">Hoorbare bel</string>
<string name="pref_bell_volume_title">Bel volume</string>
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 8775a89..e2e0c9d 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -91,7 +91,6 @@
<string name="pref_wifilock_title">Wstrzymaj usypianie Wi-Fi</string>
<string name="pref_wifilock_summary">Wstrzymaj usypianie Wi-Fi gdy sesja jest aktywna</string>
<string name="pref_bumpyarrows_title">Podskakujące strzałki</string>
- <string name="pref_bumpyarrows_summary">Wibruj kiedy emulowane są klawisze strzałek; użyteczne dla wolnych połączeń</string>
<string name="pref_bell_category">Brzęczyk terminalu</string>
<string name="pref_bell_title">Brzęczyk słyszalny</string>
<string name="pref_bell_volume_title">Głośność brzęczyka</string>
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index bfdeb96..ae2477f 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -91,7 +91,6 @@
<string name="pref_wifilock_title">Manter a rede Wi-Fi ativo</string>
<string name="pref_wifilock_summary">Evitar que a rede Wi-Fi seja desligada quando alguma sesão está ativa</string>
<string name="pref_bumpyarrows_title">Feedback de rolagem</string>
- <string name="pref_bumpyarrows_summary">Vibrar quando pressionar o botão principal (trackball)</string>
<string name="pref_bell_category">Alerta do terminal</string>
<string name="pref_bell_title">Alerta audível</string>
<string name="pref_bell_volume_title">Volume dos alerta</string>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index eddd87b..d8c0c91 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -89,7 +89,6 @@
<string name="pref_wifilock_title">Manter Wi-Fi activo</string>
<string name="pref_wifilock_summary">Evitar que o Wi-Fi desligue quando uma sessão está activa</string>
<string name="pref_bumpyarrows_title">Cursores com vibração</string>
- <string name="pref_bumpyarrows_summary">Vibrar quando enviar teclas de cursor com a trackball; útil para ligações com atraso</string>
<string name="pref_bell_category">Aviso sonoro do terminal</string>
<string name="pref_bell_title">Aviso sonoro audível</string>
<string name="pref_bell_volume_title">Volume do aviso sonoro</string>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 52ac1d1..1b14ad7 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -92,7 +92,6 @@
<string name="pref_wifilock_title">Держать Wi-Fi включенным</string>
<string name="pref_wifilock_summary">Препятствовать отключению Wi-Fi при активном сеансе</string>
<string name="pref_bumpyarrows_title">Настройки обратной связи при нажатии</string>
- <string name="pref_bumpyarrows_summary">Вибросигнал при передаче клавиш управления курсором с трекбола; полезно при медленном соединении</string>
<string name="pref_bell_category">Настройки звукового сигнала в терминале</string>
<string name="pref_bell_title">Включить звонок</string>
<string name="pref_bell_volume_title">Громкость сигнала</string>
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index a0c0f2c..dd321d1 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -89,7 +89,6 @@
<string name="pref_wifilock_title">Ponechať Wi-Fi aktívne</string>
<string name="pref_wifilock_summary">Ponechať Wi-Fi aktívne pokiaľ je otvorené spojenie</string>
<string name="pref_bumpyarrows_title">Hrboľaté šípky</string>
- <string name="pref_bumpyarrows_summary">Vibrovať pri posielaní kurzorových tlačidiel z trackballu; užitočné pre chybové spojenia</string>
<string name="pref_bell_category">Zvonček terminálu</string>
<string name="pref_bell_title">Akustický zvonček</string>
<string name="pref_bell_volume_title">Hlasitosť zvončeka</string>
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 669610a..2504470 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -102,7 +102,6 @@
<string name="pref_wifilock_title">Држи бежични активним</string>
<string name="pref_wifilock_summary">Спречи искључивање бежичног кад је сесија активна</string>
<string name="pref_bumpyarrows_title">Џомбасте стрелице</string>
- <string name="pref_bumpyarrows_summary">Вибрирај по слању тастера стрелице са трекбола; корисно при спорим везама</string>
<string name="pref_bell_category">Звоно терминала</string>
<string name="pref_bell_title">Звучно звоно</string>
<string name="pref_bell_volume_title">Јачина звука звона</string>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index e924523..d68673d 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -89,7 +89,6 @@
<string name="pref_wifilock_title">Håll trådlöst nätverk aktivt</string>
<string name="pref_wifilock_summary">Hindra att trådlöst nätverk slås av under en aktiv session</string>
<string name="pref_bumpyarrows_title">Aktiva piltangenter</string>
- <string name="pref_bumpyarrows_summary">Vibrera när piltangenter sänds från pekdon; bra för långsamma anslutningar</string>
<string name="pref_bell_category">Terminal-ljud</string>
<string name="pref_bell_title">Aktivt</string>
<string name="pref_bell_volume_title">Ljudvolym</string>
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 4177a14..d4db960 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -91,7 +91,6 @@
<string name="pref_wifilock_title">Wi-Fi etkin tut</string>
<string name="pref_wifilock_summary">Bir oturum etkinken Wi-Fi kapanmasını engelle</string>
<string name="pref_bumpyarrows_title">dalgalı oklar</string>
- <string name="pref_bumpyarrows_summary">Okları izotop ile kullanırken titret; düşük bağlantılar için kullanışlıdır</string>
<string name="pref_bell_category">Terminal zili</string>
<string name="pref_bell_title">Sesli zil</string>
<string name="pref_bell_volume_title">Zil ses düzeyi</string>
diff --git a/app/src/main/res/values-v11/styles.xml b/app/src/main/res/values-v11/styles.xml
index 79f9633..37c3f6e 100644
--- a/app/src/main/res/values-v11/styles.xml
+++ b/app/src/main/res/values-v11/styles.xml
@@ -25,16 +25,23 @@
</style>
<style name="ListItemFirstLineText" parent="TextAppearance.AppCompat">
+ <item name="android:layout_alignParentTop">true</item>
<item name="android:textColor">?android:textColorPrimary</item>
<item name="android:textSize">16sp</item>
+ <item name="android:paddingTop">20dp</item>
+ <item name="android:layout_alignParentLeft">true</item>
</style>
<style name="ListItemSecondLineText" parent="TextAppearance.AppCompat">
+ <item name="android:layout_alignParentBottom">true</item>
<item name="android:textColor">?android:textColorSecondary</item>
<item name="android:textSize">14sp</item>
+ <item name="android:paddingBottom">20dp</item>
+ <item name="android:layout_alignParentLeft">true</item>
</style>
- <style name="SelectableItem">
- <item name="android:background">?android:attr/selectableItemBackground</item>
- </style>
+ <style name="SelectableItem">
+ <item name="android:background">?android:attr/selectableItemBackground</item>
+ </style>
+
</resources>
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 8a984e6..32be755 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -9,6 +9,8 @@
<string name="title_help">帮助</string>
<string name="title_colors">颜色</string>
<string name="title_color_picker">选取一种颜色</string>
+ <string name="title_settings">设置</string>
+ <string name="title_pubkey_generate">生成</string>
<string name="resolve_connect">连接</string>
<string name="resolve_entropy">收集熵</string>
<string name="menu_insert">添加主机</string>
@@ -17,6 +19,10 @@
<string name="help_intro">请在下面主题中选择一个以查看更多内容</string>
<string name="help_about">关于ConnectBot</string>
<string name="help_keyboard">键盘</string>
+ <string name="terms_and_conditions">条款与条件</string>
+ <string name="keyboard_shortcuts">键盘快捷键</string>
+ <string name="increase_font_size">增加字体大小</string>
+ <string name="decrease_font_size">减少字体大小</string>
<string name="pubkey_generate">生成</string>
<string name="pubkey_delete">删除密钥</string>
<string name="pubkey_gather_entropy">正在收集熵</string>
@@ -62,6 +68,7 @@
<string name="alert_key_corrupted_msg">私钥似乎已损坏!</string>
<string name="alert_sdcard_absent">没有插入SD卡!</string>
<string name="button_add">添加</string>
+ <string name="button_cancel">取消</string>
<string name="button_change">修改</string>
<string name="button_generate">生成密钥</string>
<string name="button_resize">改变窗口大小</string>
@@ -102,7 +109,6 @@
<string name="pref_wifilock_title">保持WI-FI激活</string>
<string name="pref_wifilock_summary">会话运行时禁止Wi-Fi关闭</string>
<string name="pref_bumpyarrows_title">触摸反馈</string>
- <string name="pref_bumpyarrows_summary">轨迹球发出模拟方向键时振动; (对滞后连接特别有用)</string>
<string name="pref_bell_category">终端响铃</string>
<string name="pref_bell_title">响铃</string>
<string name="pref_bell_volume_title">铃声音量</string>
@@ -182,6 +188,9 @@
<string name="delete_message">确定要删除\'%1$s\'吗?</string>
<string name="delete_pos">是,删除</string>
<string name="delete_neg">取消</string>
+ <string name="disconnect_all_message">你确定你要断开所有连接的主机?</string>
+ <string name="disconnect_all_pos">是的,断开</string>
+ <string name="disconnect_all_neg">取消</string>
<string name="terminal_no_hosts_connected">当前没有连接主机</string>
<string name="terminal_connecting">正在通过%3$s连接到 %1$s:%2$d</string>
<string name="terminal_sucess">验证主机 %1$s 键值: %2$s</string>
@@ -222,4 +231,27 @@
<string name="image_description_send_escape_character">发送转义字符。</string>
<string name="image_description_send_tab_character">发送TAB键。</string>
<string name="image_description_show_keyboard">显示键盘。</string>
+ <string name="image_description_up">向上的箭头</string>
+ <string name="image_description_down">向下的箭头</string>
+ <string name="image_description_left">向左的箭头</string>
+ <string name="image_description_right">向右的箭头</string>
+ <string name="button_key_esc">Esc</string>
+ <string name="button_key_ctrl">Ctrl</string>
+ <string name="button_key_tab">Tab</string>
+ <string name="button_key_home">Home</string>
+ <string name="button_key_end">End</string>
+ <string name="button_key_pgup">PgUp</string>
+ <string name="button_key_pgdn">PgDn</string>
+ <string name="button_key_f1">F1</string>
+ <string name="button_key_f2">F2</string>
+ <string name="button_key_f3">F3</string>
+ <string name="button_key_f4">F4</string>
+ <string name="button_key_f5">F5</string>
+ <string name="button_key_f6">F6</string>
+ <string name="button_key_f7">F7</string>
+ <string name="button_key_f8">F8</string>
+ <string name="button_key_f9">F9</string>
+ <string name="button_key_f10">F10</string>
+ <string name="button_key_f11">F11</string>
+ <string name="button_key_f12">F12</string>
</resources>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index ee92ad7..9632700 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -102,7 +102,6 @@
<string name="pref_wifilock_title">保持 Wi-Fi 連線</string>
<string name="pref_wifilock_summary">連線階段未結束前,避免 Wi-Fi 關閉</string>
<string name="pref_bumpyarrows_title">觸覺方向鍵</string>
- <string name="pref_bumpyarrows_summary">當用軌跡球發出模擬方向鍵時振動; 對延遲連線特別有用</string>
<string name="pref_bell_category">終端鈴聲</string>
<string name="pref_bell_title">響鈴</string>
<string name="pref_bell_volume_title">鈴聲音量</string>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..1698002
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+
+<resources>
+ <dimen name="list_item_text_margin_left">72dp</dimen>
+ <dimen name="list_item_left_right_padding">16dp</dimen>
+ <dimen name="list_item_top_bottom_padding">20dp</dimen>
+ <dimen name="list_item_first_line_text_size">16sp</dimen>
+ <dimen name="list_item_second_line_text_size">14sp</dimen>
+</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0d3e1ee..d472353 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -658,5 +658,11 @@
<string name="pubkey_add_new">Add new pubkey</string>
<!-- Text for button which, when clicked, brings up picker to import an existing pubkey. -->
<string name="pubkey_import_existing">Import existing pubkey</string>
+ <!-- Text for dialog which explains that the host URI is invalid and asks to discard. -->
+ <string name="discard_host_changes_message">Host URI is invalid. Would you like to discard changes?</string>
+ <!-- Text for button which discards changes to the host. -->
+ <string name="discard_host_button">Discard</string>
+ <!-- Text for button which does not discard changes and keeps editing. -->
+ <string name="discard_host_cancel_button">Keep editing</string>
</resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index af3bd79..f782fb4 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -16,7 +16,7 @@
~ limitations under the License.
*/
-->
-<resources>
+<resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppTheme" parent="Theme.AppCompat">
<item name="colorPrimary">@color/primary</item>
@@ -36,14 +36,38 @@
<item name="android:background">@drawable/keyboard_button_selector</item>
</style>
+ <style name="ListItemIcon">
+ <item name="android:layout_marginLeft">@dimen/list_item_left_right_padding</item>
+ <item name="android:layout_marginStart" tools:ignore="NewApi">@dimen/list_item_left_right_padding</item>
+ <item name="android:layout_centerVertical">true</item>
+ <item name="android:layout_alignParentLeft">true</item>
+ <item name="android:layout_alignParentStart" tools:ignore="NewApi">true</item>
+ </style>
+
<style name="ListItemFirstLineText">
+ <item name="android:layout_alignParentTop">true</item>
<item name="android:textColor">?android:textColorPrimary</item>
- <item name="android:textSize">16sp</item>
+ <item name="android:textSize">@dimen/list_item_first_line_text_size</item>
+ <item name="android:paddingTop">@dimen/list_item_top_bottom_padding</item>
+ <item name="android:layout_alignParentLeft">true</item>
+ </style>
+
+ <style name="ListItemFirstLineText.WithIcon" parent="ListItemFirstLineText">
+ <item name="android:layout_marginLeft">@dimen/list_item_text_margin_left</item>
+ <item name="android:layout_marginStart" tools:ignore="NewApi">@dimen/list_item_text_margin_left</item>
</style>
<style name="ListItemSecondLineText">
+ <item name="android:layout_alignParentBottom">true</item>
<item name="android:textColor">?android:textColorSecondary</item>
- <item name="android:textSize">14sp</item>
+ <item name="android:textSize">@dimen/list_item_second_line_text_size</item>
+ <item name="android:paddingBottom">@dimen/list_item_top_bottom_padding</item>
+ <item name="android:layout_alignParentLeft">true</item>
+ </style>
+
+ <style name="ListItemSecondLineText.WithIcon" parent="ListItemSecondLineText">
+ <item name="android:layout_marginLeft">@dimen/list_item_text_margin_left</item>
+ <item name="android:layout_marginStart" tools:ignore="NewApi">@dimen/list_item_text_margin_left</item>
</style>
<style name="ListItemFirstLineText.Red" parent="ListItemFirstLineText">
@@ -77,10 +101,4 @@
<item name="colorAccent">@color/accent</item>
</style>
- <style name="Divider">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">1dp</item>
- <item name="android:background">?android:attr/listDivider</item>
- </style>
-
</resources>
diff --git a/scripts/check-lint-count.bash b/scripts/check-lint-count.bash
new file mode 100755
index 0000000..c02f70e
--- /dev/null
+++ b/scripts/check-lint-count.bash
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+#
+# Checks the number of lint issues against historical values. Used in
+# Travis CI builds to fail when the number increases by exploiting the
+# caching mechanism.
+
+if [[ $# != 2 || ! -f $1 ]]; then \
+ echo "Usage: $0 <lint.xml file> <historical.xml file>"
+ exit 1
+fi
+
+lint_file="$1"
+historical_file="$2"
+
+xqilla="$(which xqilla)"
+
+if [[ ! -x $xqilla ]]; then \
+ echo "Error: cannot find xqilla"
+ exit 1
+fi
+
+if [[ ! -f $historical_file ]]; then \
+ # no cache history, store this one and exit
+ cp "$lint_file" "$historical_file"
+ exit 0
+fi
+
+tmp_dir="$(mktemp -d lint.XXXXXXXX)"
+trap 'rm -rf $tmp_dir' ERR EXIT
+
+lint_results="$tmp_dir/lint.txt"
+hist_results="$tmp_dir/hist.txt"
+
+run_query() {
+ local xqilla_script='string-join(//issue/location/(concat("file=", @file, " line=", @line, " column=", @column, " reason=", ../@summary)), "&#10;")'
+ xqilla -i "$1" <(echo "$xqilla_script") | sed "s,$PWD/,,g" > "$2"
+}
+
+run_query "$lint_file" "$lint_results"
+run_query "$historical_file" "$hist_results"
+
+old_count=$(wc -l < "$hist_results")
+new_count=$(wc -l < "$lint_results")
+
+echo "Historical count: $old_count, new count: $new_count"
+
+if [[ $new_count > $old_count ]]; then \
+ echo "FAILURE: lint issues increased from $old_count to $new_count"
+ diff -u "$hist_results" "$lint_results"
+ exit 2
+fi
+
+if [[ $TRAVIS_PULL_REQUEST == false ]]; then \
+ # Okay, we either stayed the same or reduced our number.
+ # Write it out so we can check it next build!
+ cp "$lint_file" "$historical_file"
+fi
diff --git a/scripts/check-lint-count.sh b/scripts/check-lint-count.sh
deleted file mode 100755
index 5184e13..0000000
--- a/scripts/check-lint-count.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env bash
-#
-# Checks the number of lint issues against historical values. Used in
-# Travis CI builds to fail when the number increases by exploiting the
-# caching mechanism.
-
-if [[ $# != 2 || ! -f $1 ]]; then \
- echo "Usage: $0 <lint.xml file> <historical.xml file>"
- exit 1
-fi
-
-lint_file="$1"
-historical_file="$2"
-
-xmllint="$(which xmllint)"
-
-if [[ ! -x $xmllint ]]; then \
- echo "Error: cannot find xmllint"
- exit 1
-fi
-
-if [[ ! -f $historical_file ]]; then \
- # no cache history, store this one and exit
- cp $lint_file $historical_file
- exit 0
-fi
-
-tmp_dir="$(mktemp -d lint.XXXXXXXX)"
-trap "rm -rf $tmp_dir" ERR EXIT
-
-lint_results="$tmp_dir/lint.txt"
-hist_results="$tmp_dir/hist.txt"
-
-echo "cat //issue/location" | \
- xmllint --shell $historical_file | \
- grep '<location' >$lint_results
-
-echo "cat //issue/location" | \
- xmllint --shell $lint_file | \
- grep '<location' >$hist_results
-
-old_count=$(cat $lint_results | wc -l)
-new_count=$(cat $hist_results | wc -l)
-
-echo "Historical count : $old_count, new count : $new_count"
-
-if [[ $new_count > $old_count ]]; then \
- echo "FAILURE: lint issues increased from $old_count to $new_count"
- diff $lint_results $hist_results
- exit 2
-fi
-
-if [[ $TRAVIS_PULL_REQUEST == false ]]; then \
- # Okay, we either stayed the same or reduced our number.
- # Write it out so we can check it next build!
- cp $lint_file $historical_file
-fi