diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9287c4092..b7939f846 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
+### Changed
+- SSH Keygen UI was improved
+- Default key length for SSH Keygen is now 4096 bits
+- Settings items were rearranged and cleaned up
+
+### Fixed
+- Failure to detect if repository was not cloned which broke Git operations
+- Search results were inaccurate if root directory's name started with a dot (.)
+- Saving git username and email did not provide user-facing confirmation
+
## [1.7.1] - 2020-04-23
### Fixed
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index be85558bb..092db9e87 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -91,7 +91,10 @@
android:windowSoftInputMode="adjustResize"
android:configChanges="orientation|screenSize" />
-
+
("general_show_time")
- val clearAfterCopyPreference = findPreference("clear_after_copy")
val clearClipboard20xPreference = findPreference("clear_clipboard_20x")
// Autofill preferences
@@ -129,7 +128,6 @@ class UserPreference : AppCompatActivity() {
viewSshKeyPreference?.isVisible = sharedPreferences.getBoolean("use_generated_key", false)
deleteRepoPreference?.isVisible = !sharedPreferences.getBoolean("git_external", false)
clearHotpIncrementPreference?.isVisible = sharedPreferences.getBoolean("hotp_remember_check", false)
- clearAfterCopyPreference?.isVisible = sharedPreferences.getString("general_show_time", "45")?.toInt() != 0
clearClipboard20xPreference?.isVisible = sharedPreferences.getString("general_show_time", "45")?.toInt() != 0
val selectedKeys = (sharedPreferences.getStringSet("openpgp_key_ids_set", null)
?: HashSet()).toTypedArray()
@@ -273,7 +271,6 @@ class UserPreference : AppCompatActivity() {
showTimePreference?.onPreferenceChangeListener = ChangeListener { _, newValue: Any? ->
try {
val isEnabled = newValue.toString().toInt() != 0
- clearAfterCopyPreference?.isVisible = isEnabled
clearClipboard20xPreference?.isVisible = isEnabled
true
} catch (e: NumberFormatException) {
@@ -282,10 +279,10 @@ class UserPreference : AppCompatActivity() {
}
showTimePreference?.summaryProvider = Preference.SummaryProvider {
- getString(R.string.pref_show_time_summary, sharedPreferences.getString("general_show_time", "45"))
+ getString(R.string.pref_clipboard_timeout_summary, sharedPreferences.getString("general_show_time", "45"))
}
- findPreference("biometric_auth")?.apply {
+ findPreference("biometric_auth")?.apply {
val isFingerprintSupported = BiometricManager.from(requireContext()).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS
if (!isFingerprintSupported) {
isEnabled = false
@@ -337,10 +334,10 @@ class UserPreference : AppCompatActivity() {
val prefIsCustomDict = findPreference("pref_key_is_custom_dict")
val prefCustomDictPicker = findPreference("pref_key_custom_dict")
val prefPwgenType = findPreference("pref_key_pwgen_type")
- showHideDependentPrefs(prefPwgenType?.value, prefIsCustomDict, prefCustomDictPicker)
+ updateXkPasswdPrefsVisibility(prefPwgenType?.value, prefIsCustomDict, prefCustomDictPicker)
prefPwgenType?.onPreferenceChangeListener = ChangeListener { _, newValue ->
- showHideDependentPrefs(newValue, prefIsCustomDict, prefCustomDictPicker)
+ updateXkPasswdPrefsVisibility(newValue, prefIsCustomDict, prefCustomDictPicker)
true
}
@@ -356,7 +353,7 @@ class UserPreference : AppCompatActivity() {
}
}
- private fun showHideDependentPrefs(newValue: Any?, prefIsCustomDict: CheckBoxPreference?, prefCustomDictPicker: Preference?) {
+ private fun updateXkPasswdPrefsVisibility(newValue: Any?, prefIsCustomDict: CheckBoxPreference?, prefCustomDictPicker: Preference?) {
when (newValue as String) {
PgpActivity.KEY_PWGEN_TYPE_CLASSIC -> {
prefIsCustomDict?.isVisible = false
diff --git a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpActivity.kt b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpActivity.kt
index f6d2b1692..c73adc9d4 100644
--- a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpActivity.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpActivity.kt
@@ -831,7 +831,7 @@ class PgpActivity : AppCompatActivity(), OpenPgpServiceConnection.OnBound {
// ignore and keep default
}
- if (settings.getBoolean("clear_after_copy", true) && clearAfter != 0) {
+ if (clearAfter != 0) {
setTimer()
showSnackbar(this.resources.getString(R.string.clipboard_password_toast_text, clearAfter))
} else {
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/GitConfigActivity.kt b/app/src/main/java/com/zeapo/pwdstore/git/GitConfigActivity.kt
index 8ad196183..dbf67d5fe 100644
--- a/app/src/main/java/com/zeapo/pwdstore/git/GitConfigActivity.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/git/GitConfigActivity.kt
@@ -5,9 +5,12 @@
package com.zeapo.pwdstore.git
import android.os.Bundle
+import android.os.Handler
import android.util.Patterns
import androidx.core.content.edit
+import androidx.core.os.postDelayed
import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
import com.zeapo.pwdstore.R
import com.zeapo.pwdstore.databinding.ActivityGitConfigBinding
import com.zeapo.pwdstore.utils.PasswordRepository
@@ -23,7 +26,10 @@ class GitConfigActivity : BaseGitActivity() {
setContentView(binding.root)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
- binding.gitUserName.setText(username)
+ if (username.isEmpty())
+ binding.gitUserName.requestFocus()
+ else
+ binding.gitUserName.setText(username)
binding.gitUserEmail.setText(email)
val repo = PasswordRepository.getRepository(PasswordRepository.getRepositoryDirectory(this))
if (repo != null) {
@@ -55,8 +61,10 @@ class GitConfigActivity : BaseGitActivity() {
putString("git_config_user_email", email)
putString("git_config_user_name", name)
}
- PasswordRepository.setUserName(name)
- PasswordRepository.setUserEmail(email)
+ PasswordRepository.setUserName(name)
+ PasswordRepository.setUserEmail(email)
+ Snackbar.make(binding.root, getString(R.string.git_server_config_save_success), Snackbar.LENGTH_SHORT).show()
+ Handler().postDelayed(500) { finish() }
}
}
}
diff --git a/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt b/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt
index 7fad3c520..8885b038a 100644
--- a/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt
@@ -13,7 +13,6 @@ class SshKeyGenActivity : AppCompatActivity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
- title = "Generate SSH Key"
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
diff --git a/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenFragment.kt b/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenFragment.kt
index e07f71cd5..da7099ad0 100644
--- a/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenFragment.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenFragment.kt
@@ -10,81 +10,124 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
-import android.widget.ArrayAdapter
-import android.widget.Button
-import android.widget.CheckBox
-import android.widget.EditText
-import android.widget.Spinner
+import androidx.core.content.edit
import androidx.core.content.getSystemService
import androidx.fragment.app.Fragment
-import com.google.android.material.textfield.TextInputEditText
+import androidx.lifecycle.lifecycleScope
+import androidx.preference.PreferenceManager
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.jcraft.jsch.JSch
+import com.jcraft.jsch.KeyPair
import com.zeapo.pwdstore.R
+import com.zeapo.pwdstore.databinding.FragmentSshKeygenBinding
+import java.io.File
+import java.io.FileOutputStream
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
class SshKeyGenFragment : Fragment() {
- private lateinit var checkBox: CheckBox
- private lateinit var comment: EditText
- private lateinit var generate: Button
- private lateinit var passphrase: TextInputEditText
- private lateinit var spinner: Spinner
- private lateinit var activity: SshKeyGenActivity
+ private var keyLength = 4096
+ private var _binding: FragmentSshKeygenBinding? = null
+ private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
- return inflater.inflate(R.layout.fragment_ssh_keygen, container, false)
+ _binding = FragmentSshKeygenBinding.inflate(inflater, container, false)
+ return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- activity = requireActivity() as SshKeyGenActivity
- findViews(view)
- val lengths = arrayOf(2048, 4096)
- val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, lengths)
- spinner.adapter = adapter
- generate.setOnClickListener { generate() }
- checkBox.setOnCheckedChangeListener { _, isChecked: Boolean ->
- val selection = passphrase.selectionEnd
- if (isChecked) {
- passphrase.inputType = (
- InputType.TYPE_CLASS_TEXT
- or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
- } else {
- passphrase.inputType = (
- InputType.TYPE_CLASS_TEXT
- or InputType.TYPE_TEXT_VARIATION_PASSWORD)
+ with(binding) {
+ generate.setOnClickListener {
+ lifecycleScope.launch { generate(passphrase.text.toString(), comment.text.toString()) }
+ }
+ showPassphrase.setOnCheckedChangeListener { _, isChecked: Boolean ->
+ val selection = passphrase.selectionEnd
+ if (isChecked) {
+ passphrase.inputType = (
+ InputType.TYPE_CLASS_TEXT
+ or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
+ } else {
+ passphrase.inputType = (
+ InputType.TYPE_CLASS_TEXT
+ or InputType.TYPE_TEXT_VARIATION_PASSWORD)
+ }
+ passphrase.setSelection(selection)
+ }
+ keyLengthGroup.check(R.id.key_length_4096)
+ keyLengthGroup.addOnButtonCheckedListener { _, checkedId, isChecked ->
+ if (isChecked) {
+ when (checkedId) {
+ R.id.key_length_2048 -> keyLength = 2048
+ R.id.key_length_4096 -> keyLength = 4096
+ }
+ }
}
- passphrase.setSelection(selection)
}
}
- private fun findViews(view: View) {
- checkBox = view.findViewById(R.id.show_passphrase)
- comment = view.findViewById(R.id.comment)
- generate = view.findViewById(R.id.generate)
- passphrase = view.findViewById(R.id.passphrase)
- spinner = view.findViewById(R.id.length)
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
}
// Invoked when 'Generate' button of SshKeyGenFragment clicked. Generates a
// private and public key, then replaces the SshKeyGenFragment with a
// ShowSshKeyFragment which displays the public key.
- fun generate() {
- val length = (spinner.selectedItem as Int).toString()
- val passphrase = passphrase.text.toString()
- val comment = comment.text.toString()
- KeyGenerateTask(activity).execute(length, passphrase, comment)
+ private suspend fun generate(passphrase: String, comment: String) {
+ binding.generate.text = getString(R.string.ssh_key_gen_generating_progress)
+ val jsch = JSch()
+ val e = try {
+ withContext(Dispatchers.IO) {
+ val kp = KeyPair.genKeyPair(jsch, KeyPair.RSA, keyLength)
+ var file = File(requireActivity().filesDir, ".ssh_key")
+ var out = FileOutputStream(file, false)
+ if (passphrase.isNotEmpty()) {
+ kp?.writePrivateKey(out, passphrase.toByteArray())
+ } else {
+ kp?.writePrivateKey(out)
+ }
+ file = File(requireActivity().filesDir, ".ssh_key.pub")
+ out = FileOutputStream(file, false)
+ kp?.writePublicKey(out, comment)
+ }
+ null
+ } catch (e: Exception) {
+ e.printStackTrace()
+ e
+ }
+ val activity = requireActivity()
+ binding.generate.text = getString(R.string.ssh_keygen_generating_done)
+ if (e == null) {
+ val df = ShowSshKeyFragment()
+ df.show(requireActivity().supportFragmentManager, "public_key")
+ val prefs = PreferenceManager.getDefaultSharedPreferences(activity)
+ prefs.edit { putBoolean("use_generated_key", true) }
+ } else {
+ MaterialAlertDialogBuilder(activity)
+ .setTitle(activity.getString(R.string.error_generate_ssh_key))
+ .setMessage(activity.getString(R.string.ssh_key_error_dialog_text) + e.message)
+ .setPositiveButton(activity.getString(R.string.dialog_ok)) { _, _ ->
+ requireActivity().finish()
+ }
+ .show()
+ }
hideKeyboard()
}
private fun hideKeyboard() {
- val imm = activity.getSystemService()
+ val activity = activity ?: return
+ val imm = activity.getSystemService() ?: return
var view = activity.currentFocus
if (view == null) {
view = View(activity)
}
- imm?.hideSoftInputFromWindow(view.windowToken, 0)
+ imm.hideSoftInputFromWindow(view.windowToken, 0)
}
}
diff --git a/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeygenTask.kt b/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeygenTask.kt
deleted file mode 100644
index 169a1309e..000000000
--- a/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeygenTask.kt
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved.
- * SPDX-License-Identifier: GPL-3.0-only
- */
-package com.zeapo.pwdstore.sshkeygen
-
-import android.app.ProgressDialog
-import android.os.AsyncTask
-import android.widget.Toast
-import androidx.appcompat.app.AppCompatActivity
-import androidx.core.content.edit
-import androidx.fragment.app.DialogFragment
-import androidx.preference.PreferenceManager
-import com.google.android.material.dialog.MaterialAlertDialogBuilder
-import com.jcraft.jsch.JSch
-import com.jcraft.jsch.KeyPair
-import com.zeapo.pwdstore.R
-import java.io.File
-import java.io.FileOutputStream
-import java.lang.ref.WeakReference
-
-class KeyGenerateTask(activity: AppCompatActivity) : AsyncTask() {
- private var pd: ProgressDialog? = null
- private val weakReference = WeakReference(activity)
- override fun onPreExecute() {
- super.onPreExecute()
- pd = ProgressDialog.show(weakReference.get(), "", "Generating keys")
- }
-
- override fun doInBackground(vararg strings: String?): Exception? {
- val length = strings[0]?.toInt()
- val passphrase = strings[1]
- val comment = strings[2]
- val jsch = JSch()
- try {
- val kp = length?.let { KeyPair.genKeyPair(jsch, KeyPair.RSA, it) }
- var file = File(weakReference.get()!!.filesDir.toString() + "/.ssh_key")
- var out = FileOutputStream(file, false)
- if (passphrase?.isNotEmpty()!!) {
- kp?.writePrivateKey(out, passphrase.toByteArray())
- } else {
- kp?.writePrivateKey(out)
- }
- file = File(weakReference.get()!!.filesDir.toString() + "/.ssh_key.pub")
- out = FileOutputStream(file, false)
- kp?.writePublicKey(out, comment)
- return null
- } catch (e: Exception) {
- e.printStackTrace()
- return e
- }
- }
-
- override fun onPostExecute(e: Exception?) {
- super.onPostExecute(e)
- val activity = weakReference.get()
- if (activity is AppCompatActivity) {
- pd!!.dismiss()
- if (e == null) {
- Toast.makeText(activity, "SSH-key generated", Toast.LENGTH_LONG).show()
- val df: DialogFragment = ShowSshKeyFragment()
- df.show(activity.supportFragmentManager, "public_key")
- val prefs = PreferenceManager.getDefaultSharedPreferences(weakReference.get())
- prefs.edit { putBoolean("use_generated_key", true) }
- } else {
- MaterialAlertDialogBuilder(activity)
- .setTitle(activity.getString(R.string.error_generate_ssh_key))
- .setMessage(activity.getString(R.string.ssh_key_error_dialog_text) + e.message)
- .setPositiveButton(activity.getString(R.string.dialog_ok), null)
- .show()
- }
- } else {
- // TODO: When activity is destroyed
- }
- }
-}
diff --git a/app/src/main/res/layout/activity_git_config.xml b/app/src/main/res/layout/activity_git_config.xml
index 94c09e271..0ea45c55d 100644
--- a/app/src/main/res/layout/activity_git_config.xml
+++ b/app/src/main/res/layout/activity_git_config.xml
@@ -23,7 +23,7 @@
android:id="@+id/git_user_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:inputType="textNoSuggestions|textVisiblePassword" />
+ android:inputType="textPersonName" />
diff --git a/app/src/main/res/layout/fragment_ssh_keygen.xml b/app/src/main/res/layout/fragment_ssh_keygen.xml
index 16c3f512b..90cf4df0a 100644
--- a/app/src/main/res/layout/fragment_ssh_keygen.xml
+++ b/app/src/main/res/layout/fragment_ssh_keygen.xml
@@ -17,11 +17,34 @@
android:gravity="center_vertical"
android:text="@string/ssh_keygen_length" />
-
+ app:selectionRequired="true"
+ app:singleSelection="true">
+
+
+
- تنحية المستودع
التشفير
إختيار مزود الأوبن بي جي بي OpenPGP
- الإعدادات العامة
- مدة الإبقاء على كلمة السر ظاهرة
+ الإعدادات العامة
نسخ كلمة السر تلقائيًا
تم استيراد مفتاح الـ SSH
نص الرسالة : \n
@@ -88,7 +87,6 @@
إستخدم كلمة مرور المستودع الخارجي
إختيار مستودع التخزين الخارجي
إستخدم أداة إختيار الملفات الإفتراضي
- تنظيف الحافظة مباشرةً بعد النسخ
تصدير كلمات السر
النسخة
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 5917ff6bd..6b8c6f440 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -112,8 +112,7 @@
Šifrování
Vybrat poskytovatele OpenPGP
Vybrat ID OpenPGP klíče
- Všeobecné
- Čas zobrazení hesla
+ Všeobecné
Automaticky kopírovat heslo
Automatické kopírování hesla do schránky po úspěšném dešifrování.
SSH-key importován
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index aec047f9c..c94b363cd 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -87,8 +87,7 @@
Kryptografie
Wähle OpenPGP-Provider
Wähle OpenPGP-Key ID
- Allgemein
- Ablaufzeit des Passworts
+ Allgemein
Kopiere Passwort automatisch
Kopiert das Passwort in die Zwischenablage, wenn der Eintrag entschlüsselt wurde.
SSH-Key importiert
@@ -112,8 +111,6 @@
Nutze ein externes Repository
Wähle ein externes Repository
Benutze Standardauswahl für Dateien
- Zwischenablage automatisch leeren
- Nach automatischen oder manuellen Kopieren des Passwords wird die Zwischenablage automatisch geleert
Passwörter exportieren
Exportiert die verschlüsselten Passwörter in ein externes Verzeichnis
Version
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 55cc3cdad..2904e7678 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -113,8 +113,7 @@
Selecciona un proveedor OpenPGP
Selecciona la llave OpenPGP
Ninguna llave seleccionada
- General
- Tiempo para mostrar contraseña
+ General
Copiar contraseña automáticamente
Automáticamente copia la contraseña al portapapeles si el descifrado fue exitoso.
Llave SSH importada
@@ -142,8 +141,6 @@
Usar un repositorio externo para contraseñas
Seleccionar repositorio externo
Usar seleccionador de archivos por defecto
- Limpiar automáticamente el portapapeles después de copiar
- Después de copiar manual o automáticamente la contraseña, el portapapeles será automáticamente limpiado.
Exportar contraseñas
Exporta las contraseñas cifradas a un directorio externo.
Versión
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 7a28dd827..e8a70667e 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -121,8 +121,7 @@
Sélection du prestataire OpenPGP
Sélection de votre identifiant OpenPGP
Aucune clé sélectionnée
- Général
- Durée de disponibilité du mot de passe
+ Général
Copie automatique du mot de passe
Copie automatiquement le mot de passe vers le presse-papier si le déchiffrement a réussi.
Clef SSH importée
@@ -147,8 +146,6 @@
Utilise un dépôt externe pour les mots de passe
Choisissez un dépôt externe
Utiliser le selecteur de fichier par défaut
- Vider le presse-papier automatiquement après la copie
- "Après une copie du mot de passe, le presse papier sera automatiquement vidé "
Exporter les mots de passe
Exporter les mots de passe (chiffrés) vers un répertoire externe
Version
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index a70c56700..4337c6d01 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -73,8 +73,7 @@
暗号化
OpenPGP プロバイダーを選択
OpenPGP 鍵 ID を選択
- 全般
- パスワード表示時間
+ 全般
自動的にパスワードをコピー
復号化が成功した後、自動的にパスワードをクリップボードにコピーします。
SSH 鍵をインポートしました
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 9e192c1d6..3859ac6b6 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -126,9 +126,7 @@
Выберите провайдера OpenPGP
Выберите ключ OpenPGP
Ключи не выбраны
- Общие
- Время в буфере
- Уставить время (в секундах) в течении которого пароль будет находиться в буфере обмена. 0 - останется навсегда. Текущее значение: %1$s
+ Общие
Автоматически копировать пароль
Автоматически копировать пароль в буфер обмена после успешного расшифрования
SSH ключ импортирован
@@ -158,8 +156,6 @@
Использовать внешний репозиторий
Выбрать внешний репозиторий
Использовать стандартное окно выбора файлов
- Автоматически очищать буфер обмена после вставки
- После автоматического или ручного копирования, буфер обмена будет автоматически очищен.
Экспортировать пароли
Экспортировать пароли в открытом виде во внешнее хранилище
Версия
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 76926ce99..1ab16b96a 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -73,8 +73,7 @@
加密
选择 OpenPGP 应用
选择 OpenPGP Key Id
- 通用
- 密码保存时限
+ 通用
自动复制密码
解密成功后自动将密码复制到剪贴板
成功导入SSH密钥
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 7a4b4f1fb..b0f5231aa 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -70,8 +70,7 @@
加密
選擇 OpenPGP app
選擇 OpenPGP Key Id
- 一般
- 密碼保存時限
+ 一般
自動複製密碼
解密成功後自動將密碼複製到剪貼簿
成功匯入 SSH 金鑰
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 37dbfef64..650762eb1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -143,9 +143,10 @@
Select OpenPGP provider
Select OpenPGP key ID
No key selected
- General
- Password show time
- Set the time (in seconds) you want the password to be in clipboard. 0 means forever. Current value: %1$s
+ General
+ Passwords
+ Password copy timeout
+ Set the time (in seconds) you want the password to be in clipboard. 0 means forever. Current value: %1$s
Automatically copy password
Automatically copy the password to the clipboard after decryption was successful.
Selected file does not appear to be an SSH private key.
@@ -177,8 +178,6 @@
Use an external password repository
Select external repository
Use default file picker
- Automatically clear the clipboard after copy
- After an automatic copy or a manual copy of the password, the clipboard will be automatically cleared.
Export passwords
Exports the encrypted passwords to an external directory
Version
@@ -223,6 +222,10 @@
Copy
Provide this public key to your Git server.
Show passphrase
+ Generating keys…
+ Done!
+ 2048
+ 4096
OK
@@ -236,9 +239,9 @@
Pull from remote
Push to remote
Show the password
- Control the visibility of the passwords once decrypted, this does not disable the password copy
+ Control the visibility of the passwords once decrypted. This does not disable copying to clipboard.
Show extra content
- Control the visibility of the extra content once decrypted
+ Control the visibility of the extra content once decrypted.
Generate
Refresh list
No external repository selected
diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml
index abc40a8ea..fe488a357 100644
--- a/app/src/main/res/xml/preference.xml
+++ b/app/src/main/res/xml/preference.xml
@@ -1,61 +1,61 @@
-
-
-
+
-
-
-
-
-
-
+
-
-
+
-
-
-
-
-
+
-
-
-
@@ -63,23 +63,23 @@
app:key="git_external"
app:summary="@string/pref_external_repository_summary"
app:title="@string/pref_external_repository" />
-
-
+
-
+
-
-
+
-
-
+
-
-
-
+
-
+
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
+
+
+
+
+
-
-
+
-
-
+
-
-
+
-
-
+
+