From a8fce6845cf50e9ff515b5d60fe0282b2a96da05 Mon Sep 17 00:00:00 2001 From: Kyle Horimoto Date: Tue, 20 Oct 2015 14:38:14 -0700 Subject: Add save dialog and adjust icons. --- .../main/java/org/connectbot/EditHostActivity.java | 71 +++++++++++++++++---- app/src/main/res/drawable-hdpi/ic_save.png | Bin 0 -> 247 bytes app/src/main/res/drawable-mdpi/ic_save.png | Bin 0 -> 168 bytes app/src/main/res/drawable-xhdpi/ic_save.png | Bin 0 -> 273 bytes app/src/main/res/drawable-xxhdpi/ic_save.png | Bin 0 -> 391 bytes app/src/main/res/drawable-xxxhdpi/ic_save.png | Bin 0 -> 504 bytes .../main/res/menu/edit_host_activity_edit_menu.xml | 2 +- app/src/main/res/values/strings.xml | 6 ++ 8 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_save.png create mode 100644 app/src/main/res/drawable-mdpi/ic_save.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_save.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_save.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_save.png diff --git a/app/src/main/java/org/connectbot/EditHostActivity.java b/app/src/main/java/org/connectbot/EditHostActivity.java index f61924f..4b7d054 100644 --- a/app/src/main/java/org/connectbot/EditHostActivity.java +++ b/app/src/main/java/org/connectbot/EditHostActivity.java @@ -22,8 +22,10 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import android.app.AlertDialog; 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; @@ -32,6 +34,7 @@ import android.os.IBinder; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -46,6 +49,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 +140,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 +149,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 +199,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/res/drawable-hdpi/ic_save.png b/app/src/main/res/drawable-hdpi/ic_save.png new file mode 100644 index 0000000..dd3f106 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_save.png 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 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_save.png 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 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_save.png 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 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_save.png 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 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_save.png differ 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 @@ > diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 445d894..b087bfd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -655,5 +655,11 @@ Add new pubkey Import existing pubkey + + Host URI is invalid. Would you like to discard changes? + + Discard + + Keep editing -- cgit v1.2.3 From 766ed2875d76fc9a7979fc69616b49a116a6cea6 Mon Sep 17 00:00:00 2001 From: Kyle Horimoto Date: Wed, 21 Oct 2015 12:01:44 -0700 Subject: Lint. --- app/src/main/java/org/connectbot/EditHostActivity.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/org/connectbot/EditHostActivity.java b/app/src/main/java/org/connectbot/EditHostActivity.java index 4b7d054..d5e2458 100644 --- a/app/src/main/java/org/connectbot/EditHostActivity.java +++ b/app/src/main/java/org/connectbot/EditHostActivity.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -34,7 +33,6 @@ import android.os.IBinder; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -- cgit v1.2.3 From d57ab6f788707defad29df2432eafe1bc4dd4e79 Mon Sep 17 00:00:00 2001 From: Kyle Horimoto Date: Tue, 20 Oct 2015 11:52:14 -0700 Subject: Polish UI for add/edit host. --- .../java/org/connectbot/HostEditorFragment.java | 581 +++++++++++++-------- .../main/java/org/connectbot/bean/HostBean.java | 2 +- app/src/main/res/layout/fragment_host_editor.xml | 439 +++++++++++----- app/src/main/res/values-v11/styles.xml | 13 +- app/src/main/res/values/styles.xml | 32 +- 5 files changed, 718 insertions(+), 349 deletions(-) diff --git a/app/src/main/java/org/connectbot/HostEditorFragment.java b/app/src/main/java/org/connectbot/HostEditorFragment.java index 56022d7..2a6514e 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,10 +30,12 @@ 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; @@ -59,7 +62,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 +74,6 @@ public class HostEditorFragment extends Fragment { // Lists because Bundles can only contain ArrayLists, not general Lists. private ArrayList mPubkeyNames; private ArrayList 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 +88,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 mCharsetData; + + private View mTransportItem; + private TextView mTransportText; private TextInputLayout mQuickConnectContainer; private EditText mQuickConnectField; private ImageButton mExpandCollapseButton; @@ -108,20 +117,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 pubkeyNames, ArrayList pubkeyValues) { @@ -147,7 +165,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 +183,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 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 +223,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 +260,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 +329,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 pubkeySelection = new ArrayAdapter( - 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 +628,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 +640,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 +667,17 @@ public class HostEditorFragment extends Fragment { * Charset). */ public void setCharsetData(final Map data) { - if (mEncodingSpinner != null) { - final String[] encodingNames = new String[data.keySet().size()]; - data.keySet().toArray(encodingNames); - ArrayAdapter encodingSelection = new ArrayAdapter( - 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 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 +730,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 +749,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 +785,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 +816,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/layout/fragment_host_editor.xml b/app/src/main/res/layout/fragment_host_editor.xml index 5e809d8..20d835d 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,41 @@ android:orientation="vertical" > - + + - - + - - - - + android:layout_marginLeft="68dp" + android:layout_marginStart="68dp" + android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" + > - + - + + + + + + - - + - + + + + - - - + + + + + + - + - + - + + - - + + + + + + + + + + + + + @@ -307,6 +429,9 @@ 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" /> @@ -322,14 +448,24 @@ + + + + + + + + + + + + + + - - - - - - - - - - - - - - - + + 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 @@ - + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index af3bd79..12aea8e 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. */ --> - + + + + + + + - - -- cgit v1.2.3 From 4caf205c1abfd17dc4c605ec579df23df8f72d0e Mon Sep 17 00:00:00 2001 From: Kyle Horimoto Date: Tue, 20 Oct 2015 18:18:47 -0700 Subject: Lint and jlklein comments. --- .../java/org/connectbot/HostEditorFragment.java | 3 -- app/src/main/res/layout/fragment_host_editor.xml | 34 ++++++++++++++++------ app/src/main/res/values/dimens.xml | 23 +++++++++++++++ app/src/main/res/values/styles.xml | 18 ++++++------ 4 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/src/main/java/org/connectbot/HostEditorFragment.java b/app/src/main/java/org/connectbot/HostEditorFragment.java index 2a6514e..fe6f838 100644 --- a/app/src/main/java/org/connectbot/HostEditorFragment.java +++ b/app/src/main/java/org/connectbot/HostEditorFragment.java @@ -38,13 +38,10 @@ 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; diff --git a/app/src/main/res/layout/fragment_host_editor.xml b/app/src/main/res/layout/fragment_host_editor.xml index 20d835d..e4a2094 100644 --- a/app/src/main/res/layout/fragment_host_editor.xml +++ b/app/src/main/res/layout/fragment_host_editor.xml @@ -40,6 +40,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/protocol_spinner_label" style="@style/ListItemIcon" /> @@ -206,6 +207,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_color_title" style="@style/ListItemIcon" /> @@ -237,6 +239,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_fontsize_title" style="@style/ListItemIcon" /> @@ -270,9 +273,9 @@ android:id="@+id/font_size_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentRight="true" android:layout_gravity="center_vertical" android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:inputType="number" android:maxLines="1" tools:text="10" @@ -292,6 +295,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_pubkeyid_title" style="@style/ListItemIcon" /> @@ -324,6 +328,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_delkey_title" style="@style/ListItemIcon" /> @@ -356,6 +361,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_encoding_title" style="@style/ListItemIcon" /> @@ -394,17 +400,10 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_authagent_title" style="@style/ListItemIcon" /> - - + + @@ -501,6 +513,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_wantsession_title" style="@style/ListItemIcon" /> @@ -545,6 +558,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_stayconnected_title" style="@style/ListItemIcon" /> @@ -589,6 +603,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_quickdisconnect_title" style="@style/ListItemIcon" /> @@ -633,6 +648,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:src="@drawable/icon" + android:contentDescription="@string/hostpref_postlogin_title" style="@style/ListItemIcon" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..1889eb4 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,23 @@ + + + + + 72dp + 16dp + 20dp + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 12aea8e..93bf690 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -37,8 +37,8 @@ @@ -60,7 +60,7 @@ -- cgit v1.2.3 From 9a8eeb4b2c497025718610a17f0e807de65e0ff0 Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Wed, 21 Oct 2015 12:57:11 -0700 Subject: Import translations --- app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 42 +++++++++++++++++++++++++++--- app/src/main/res/values-eu/strings.xml | 15 ++++++++++- app/src/main/res/values-fi/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-gl/strings.xml | 1 - app/src/main/res/values-he/strings.xml | 1 - app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-id/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 7 +++-- app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ja/strings.xml | 35 ++++++++++++++++++++++++- app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-nb/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values-tr/strings.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 34 +++++++++++++++++++++++- app/src/main/res/values-zh-rTW/strings.xml | 1 - 28 files changed, 122 insertions(+), 34 deletions(-) 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 @@ Manté activa la Wi-Fi Evita que la Wi-Fi s\'apagui mentre hi ha una sessió activa Cursors vibrants - Vibra quan s\'envien els cursors de direcció amb la rodeta; útil per connexions lentes So del Terminal So activat Volum del so 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 @@ Ponechat Wi-Fi aktivní Zabránit Wi-Fi ve vypnutí když je sezení aktivní Hmatová odezva šipek - Vibrovat při posílání kurzorových kláves z trackballu; užitečná pro špatná spojení Zvonek terminálu Zvukové upozornění Hlasitost zvonku 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 @@ Hold Wi-Fi aktiv Undgå at Wi-Fi slår fra imens en session er aktiv Vibrerende pile - Vibrér når der afsendes piletaster fra trackballen; nyttig ved langsomme forbindelser Terminalklokke Hørbar klokke Klokke volume 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 @@ WLAN aktiviert lassen Verhindern, dass während einer aktiven Sitzung WLAN deaktiviert wird Vibrierende Pfeiltasten - Vibirieren, wenn Pfeiltasten vom Trackball gesendet werden; nützlich bei laggenden Verbindungen Terminalglocke Hörbare Glocke Glockenlautstärke 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 @@ - Cliente de SSH sencillo, potente y open-source - Mantiene conexiones SSH y las claves públicas guardadas - Máquinas + Cliente de SSH sencillo, potente y de código abierto. + Mantiene las conexiones SSH y las claves públicas cargadas + Servidores Claves Publicas Traducciones de puerto Editar equipo remoto Ayuda Colores Escoger un color + Ajustes + Generar Conectar Recolectar entropía Añadir equipo remoto @@ -17,6 +19,10 @@ Por favor seleccione un tema a continuación para más información sobre una materia en particular. Acerca de ConnectBot Teclado + Términos y condiciones + Atajos de teclado + Aumentar el tamaño de letra + Disminuir el tamaño de letra Generar Eliminar clave Haciendo acopio de entropía @@ -62,6 +68,7 @@ ¡La clave privada parece corrupta! ¡Tarjeta SD no insertada! Añadir + Cancelar Modificar Generar clave Redimensionar @@ -93,6 +100,7 @@ Secuencia de teclas para directorios Especifique como usar Alt para \'/\' y Shit para Tab Corrección de errores al teclear + Los atajos combinados de tecla permanecen activos hasta que otra tecla sea pulsada Detener solamente Boton de la Cámara Especifique que secuencia de teclas activar cuando presione el botón de la cámara @@ -101,7 +109,6 @@ Mantener la red inálambrica activa Prevenir que la red inálambrica se apague mientras haya una conexión activa Cursor con vibración - Vibrar al recibir las teclas del cursor desde el trackball; útil para conexiones con retardos Timbre del terminal Timbre audible Volúmen del timbre @@ -181,6 +188,9 @@ ¿Está seguro de que quiere eliminar \'%1$s\'? Sí, eliminar Cancelar + ¿Está seguro de que quiere desconectarse de todos los equipos host? + Sí, desconectar + Cancelar No hay equipos conectados ahora Conectando a %1$s:%2$d via %3$s Host (equipo anfitrion) \'%1$s\' clave: %2$s verifiado. @@ -219,5 +229,29 @@ Clave pública bloqueada. Activar el envío de la pulsación de tecla Control. Enviar una pulsación de la tecla Escape. + Enviar una pulsación de la tecla TAB (Tabulador). Mostrar teclado. + Tecla cursor arriba + Tecla cursor abajo + Tecla cursor a la izquierda + Tecla cursor a la derecha + Escape + Ctrl + TAB (Tabulador) + Inicio + Finalizar + Re Pág + Av Pág + F1 + F2 + F3 + F4 + F5 + F6 + F7 + F8 + F9 + F10 + F11 + F12 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 @@ Mesedez, hautatu beheko gaietako bat informazio gehiago nahi izanez gero. ConnectBot-i buruz Teklatua + Baldintzak + Laster-teklak + Handiagotu letra-tamaina + Txikiagotu letra-tamaina Sortu Ezabatu gakoa Entropia biltzen @@ -96,7 +100,6 @@ Mantendu WiFi-a aktibo Galarazi WiFi-a itzaltzea saio aktibo bat dagoen bitartean Bibraziodun geziak - Bibratu trackball bidez erakusle-geziak bidaltzean; atzerapendun konexioentzat egokia Terminalaren txirrina Txirrin entzungarria Txirrinaren bolumena @@ -175,6 +178,8 @@ Ziur zaude \'%1$s\' ezabatu nahi duzula? Bai, ezabatu Utzi + Bai, deskonektatu + Utzi Ez dago ostalaririk konektatuta une honetan %1$s:%2$d-ra konektatzen %3$s bidez Egiaztatutako ostalaria \'%1$s\' gakoa: %2$s @@ -211,5 +216,13 @@ Gakoa blokeatuta dago. Txandakatu kontrol karakterea. Bidali ihes karakterea. + Bidali TAB karakterea. Erakutsi teklatua. + Gora gezia + Behera gezia + Ezkerra gezia + Eskuina gezia + Esc + Ktrl + Tab 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 @@ Pidä Wi-Fi-yhteys päällä Estää Wi-Fi-yhteyden katkaisemisen kun istunto on aktiivinen Värinä nuolista - Värinäefekti aina kun nuolinäppäinten painalluksia lähetetään palvelimelle. Kätevä hitaille yhteyksille. Päätteen kello Kellon äänet käytössä Kellon äänenvoimakkuus 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 @@ Garder le Wi-Fi actif Empêcher la désactivation du Wi-Fi quand une session est active Flêches vibrantes - Vibrer lors de l\'envoi d\'une touche directionnelle à partir du trackball ; intéressant pour les connexions lentes Cloche du terminal Alerte sonore Volume de l\'alerte 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 @@ Evitar que a pantalla se apague ao traballar nunha consola Manter a Wi-Fi activa Evitar que a Wi-Fi se apague mentres a sesión está activa - Vibrar ao enviar teclas de dirección dende o trackball; útil para conexións con retardos Timbre do terminal Timbre audible Volume do timbre 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 @@ להשאיר את הרשת האלחוטית פעילה למנוע את כיבוי מתאם הרשת האלחוטית כאשר ישנו חלון פעיל חצים עם רטט - המכשיר ירטוט בעת שליחת מקשי חצים מכדור הגלילה; שימוש לחיבורים אטיים פעמון מסוף פעמון עם צליל עצמת הפעמון 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 @@ Tartsa fenn a Wi-Fi kapcsolatot Akadályozza meg a Wi-Fi kikapcsolását amíg a munka zajlik Ugráló nyilak - Vibráljon amikor a hanyattegérrel mozgatjuk a kurzort; hasznos lehet lassú kapcsolatoknál Terminál csengő Hallható csengő Csengő hangereje 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 @@ Wi-Fi selalu aktif Jaga Wi-Fi agar tidak padam ketika sesi aktif Panah belok - Getarkan saat mengirim tombol panah dari trackball, berguna untuk koneksi lambat Bel terminal Bel berdering Volume dering 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 @@ Notenda viðmót Snúnings hamur Hvernig breyta skal snúningnum þegar lyklaborðið er sýnilegt/falið - Fylla skjáinn + Fullskjáhamur Fela stöðustiku þegar tenging er virk Geyma lykla í minni Geyma ólæsta lykla í minni þangað til forritinu er lokað @@ -82,7 +82,6 @@ Banna skjánum að slokkna þegar tenging er virk Halda þráðlausu neti í gangi Halda þráðlausu neti í gangi þegar tenging er virk - Titra þegar örvar eru sendar með trackball; sniðugt fyrir óstöðugar tengingar Terminal bjalla Bjalla með hljóði Hljóðstyrkur bjöllu @@ -106,7 +105,7 @@ Kóðun Stillingar fyrir tengingu Notendanafn - Þjónn + Hýsill Port Aldrei tengt Afritaði %1$d bæti @@ -159,7 +158,7 @@ Með staðfestingu Það lítur út fyrir að ConnectBot hafi verið í vandræðum síðast þegar það keyrði. Viltu senda villu greiningu á höfunda forritsins? - Endurstilla + Frumstilla ConnectBot er í gangi rauður grænn 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 @@ Mantieni Wi-Fi attivo Non spegne la connessione Wi-Fi quando una sessione è attiva Vibrazione frecce - Vibra quando si inviano movimenti con la trackball; utile per connessioni lente Campanella del terminale Campanella udibile Volume della campanella 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 @@ ヘルプ 配色 色の取得 + 設定 + 生成 接続 エントロピーの取得 ホストを追加 @@ -17,6 +19,10 @@ 特定の情報について知りたいときは、以下のトピックを選択してください。 ConnectBotについて キーボード + 利用規約 + キーボードショートカット + フォントサイズを大きくする + フォントサイズを小さくする 生成 鍵を削除 エントロピー収集中 @@ -62,6 +68,7 @@ 秘密鍵が壊れています! SD カードが挿入されていません. 追加 + キャンセル 変更 鍵生成 リサイズ @@ -102,7 +109,6 @@ Wi-Fiをスリープしない セッションが有効な間Wi-FiがOFFになるのを防ぎます 矢印で振動 - トラックボールで矢印キーを送信するときに振動します; ラグがある接続時に便利 端末音設定 ベル音 ボリューム設定 @@ -182,6 +188,9 @@ \'%1$s\'を削除してよろしいですか? はい、削除します キャンセル + 接続されたホストをすべて切断してもよろしいですか? + はい、切断します + キャンセル 接続済みのホストはありません. %1$s:%2$dに%3$sで接続しています ホスト\'%1$s\' キー%2$s を検証しました @@ -220,5 +229,29 @@ キーがロックされました。 コントロール文字を切り替えます。 エスケープ文字を送信します。 + Tabキーを送信します。 キーボードを表示します。 + 上矢印 + 下矢印 + 左矢印 + 右矢印 + Esc + Ctrl + Tab + Home + End + PgUp + PgDn + F1 + F2 + F3 + F4 + F5 + F6 + F7 + F8 + F9 + F10 + F11 + F12 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 @@ Wi-Fi 켜짐 유지 세션이 유효한 동안 Wi-Fi가 꺼지지 않도록 함 방향키 진동 - 트랙볼로 방향키를 보낼 때 진동합니다; 연결이 느린 경우 유용 터미널 벨 벨소리 벨 볼륨 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 @@ Hold Wi-Fi aktiv Hindre Wi-Fi å koble fra når en økt er aktiv Vibrerende piler - Vibrer når pilkommandoer sendes med styrekule; nyttig for trege forbindelser Terminalklokke Varselklokke Klokkevolum 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 @@ Houd Wi-Fi actief Voorkom Wi-Fi van uitgaan wanneer er een sessie actief is Hobbelige pijlen - Tril als pijl knoppen worden gestuurd van trackball; handig voor langzame verbindingen Terminal bel Hoorbare bel Bel volume 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 @@ Wstrzymaj usypianie Wi-Fi Wstrzymaj usypianie Wi-Fi gdy sesja jest aktywna Podskakujące strzałki - Wibruj kiedy emulowane są klawisze strzałek; użyteczne dla wolnych połączeń Brzęczyk terminalu Brzęczyk słyszalny Głośność brzęczyka 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 @@ Manter a rede Wi-Fi ativo Evitar que a rede Wi-Fi seja desligada quando alguma sesão está ativa Feedback de rolagem - Vibrar quando pressionar o botão principal (trackball) Alerta do terminal Alerta audível Volume dos alerta 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 @@ Manter Wi-Fi activo Evitar que o Wi-Fi desligue quando uma sessão está activa Cursores com vibração - Vibrar quando enviar teclas de cursor com a trackball; útil para ligações com atraso Aviso sonoro do terminal Aviso sonoro audível Volume do aviso sonoro 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 @@ Держать Wi-Fi включенным Препятствовать отключению Wi-Fi при активном сеансе Настройки обратной связи при нажатии - Вибросигнал при передаче клавиш управления курсором с трекбола; полезно при медленном соединении Настройки звукового сигнала в терминале Включить звонок Громкость сигнала 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 @@ Ponechať Wi-Fi aktívne Ponechať Wi-Fi aktívne pokiaľ je otvorené spojenie Hrboľaté šípky - Vibrovať pri posielaní kurzorových tlačidiel z trackballu; užitočné pre chybové spojenia Zvonček terminálu Akustický zvonček Hlasitosť zvončeka 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 @@ Држи бежични активним Спречи искључивање бежичног кад је сесија активна Џомбасте стрелице - Вибрирај по слању тастера стрелице са трекбола; корисно при спорим везама Звоно терминала Звучно звоно Јачина звука звона 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 @@ Håll trådlöst nätverk aktivt Hindra att trådlöst nätverk slås av under en aktiv session Aktiva piltangenter - Vibrera när piltangenter sänds från pekdon; bra för långsamma anslutningar Terminal-ljud Aktivt Ljudvolym 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 @@ Wi-Fi etkin tut Bir oturum etkinken Wi-Fi kapanmasını engelle dalgalı oklar - Okları izotop ile kullanırken titret; düşük bağlantılar için kullanışlıdır Terminal zili Sesli zil Zil ses düzeyi 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 @@ 帮助 颜色 选取一种颜色 + 设置 + 生成 连接 收集熵 添加主机 @@ -17,6 +19,10 @@ 请在下面主题中选择一个以查看更多内容 关于ConnectBot 键盘 + 条款与条件 + 键盘快捷键 + 增加字体大小 + 减少字体大小 生成 删除密钥 正在收集熵 @@ -62,6 +68,7 @@ 私钥似乎已损坏! 没有插入SD卡! 添加 + 取消 修改 生成密钥 改变窗口大小 @@ -102,7 +109,6 @@ 保持WI-FI激活 会话运行时禁止Wi-Fi关闭 触摸反馈 - 轨迹球发出模拟方向键时振动; (对滞后连接特别有用) 终端响铃 响铃 铃声音量 @@ -182,6 +188,9 @@ 确定要删除\'%1$s\'吗? 是,删除 取消 + 你确定你要断开所有连接的主机? + 是的,断开 + 取消 当前没有连接主机 正在通过%3$s连接到 %1$s:%2$d 验证主机 %1$s 键值: %2$s @@ -222,4 +231,27 @@ 发送转义字符。 发送TAB键。 显示键盘。 + 向上的箭头 + 向下的箭头 + 向左的箭头 + 向右的箭头 + Esc + Ctrl + Tab + Home + End + PgUp + PgDn + F1 + F2 + F3 + F4 + F5 + F6 + F7 + F8 + F9 + F10 + F11 + F12 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 @@ 保持 Wi-Fi 連線 連線階段未結束前,避免 Wi-Fi 關閉 觸覺方向鍵 - 當用軌跡球發出模擬方向鍵時振動; 對延遲連線特別有用 終端鈴聲 響鈴 鈴聲音量 -- cgit v1.2.3