parent
f7dbac4649
commit
f89d5c282f
21 changed files with 241 additions and 254 deletions
10
CHANGELOG.md
10
CHANGELOG.md
|
@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## [Unreleased]
|
## [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
|
## [1.7.1] - 2020-04-23
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
|
@ -91,7 +91,10 @@
|
||||||
android:windowSoftInputMode="adjustResize"
|
android:windowSoftInputMode="adjustResize"
|
||||||
android:configChanges="orientation|screenSize" />
|
android:configChanges="orientation|screenSize" />
|
||||||
<activity android:name=".SelectFolderActivity" />
|
<activity android:name=".SelectFolderActivity" />
|
||||||
<activity android:name=".sshkeygen.SshKeyGenActivity" android:windowSoftInputMode="adjustResize" />
|
<activity
|
||||||
|
android:label="@string/pref_ssh_keygen_title"
|
||||||
|
android:name=".sshkeygen.SshKeyGenActivity"
|
||||||
|
android:windowSoftInputMode="adjustResize" />
|
||||||
<activity android:name=".autofill.oreo.ui.AutofillDecryptActivity" />
|
<activity android:name=".autofill.oreo.ui.AutofillDecryptActivity" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".autofill.oreo.ui.AutofillFilterView"
|
android:name=".autofill.oreo.ui.AutofillFilterView"
|
||||||
|
|
|
@ -101,7 +101,6 @@ class UserPreference : AppCompatActivity() {
|
||||||
|
|
||||||
// General preferences
|
// General preferences
|
||||||
val showTimePreference = findPreference<Preference>("general_show_time")
|
val showTimePreference = findPreference<Preference>("general_show_time")
|
||||||
val clearAfterCopyPreference = findPreference<CheckBoxPreference>("clear_after_copy")
|
|
||||||
val clearClipboard20xPreference = findPreference<CheckBoxPreference>("clear_clipboard_20x")
|
val clearClipboard20xPreference = findPreference<CheckBoxPreference>("clear_clipboard_20x")
|
||||||
|
|
||||||
// Autofill preferences
|
// Autofill preferences
|
||||||
|
@ -129,7 +128,6 @@ class UserPreference : AppCompatActivity() {
|
||||||
viewSshKeyPreference?.isVisible = sharedPreferences.getBoolean("use_generated_key", false)
|
viewSshKeyPreference?.isVisible = sharedPreferences.getBoolean("use_generated_key", false)
|
||||||
deleteRepoPreference?.isVisible = !sharedPreferences.getBoolean("git_external", false)
|
deleteRepoPreference?.isVisible = !sharedPreferences.getBoolean("git_external", false)
|
||||||
clearHotpIncrementPreference?.isVisible = sharedPreferences.getBoolean("hotp_remember_check", 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
|
clearClipboard20xPreference?.isVisible = sharedPreferences.getString("general_show_time", "45")?.toInt() != 0
|
||||||
val selectedKeys = (sharedPreferences.getStringSet("openpgp_key_ids_set", null)
|
val selectedKeys = (sharedPreferences.getStringSet("openpgp_key_ids_set", null)
|
||||||
?: HashSet()).toTypedArray()
|
?: HashSet()).toTypedArray()
|
||||||
|
@ -273,7 +271,6 @@ class UserPreference : AppCompatActivity() {
|
||||||
showTimePreference?.onPreferenceChangeListener = ChangeListener { _, newValue: Any? ->
|
showTimePreference?.onPreferenceChangeListener = ChangeListener { _, newValue: Any? ->
|
||||||
try {
|
try {
|
||||||
val isEnabled = newValue.toString().toInt() != 0
|
val isEnabled = newValue.toString().toInt() != 0
|
||||||
clearAfterCopyPreference?.isVisible = isEnabled
|
|
||||||
clearClipboard20xPreference?.isVisible = isEnabled
|
clearClipboard20xPreference?.isVisible = isEnabled
|
||||||
true
|
true
|
||||||
} catch (e: NumberFormatException) {
|
} catch (e: NumberFormatException) {
|
||||||
|
@ -282,10 +279,10 @@ class UserPreference : AppCompatActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
showTimePreference?.summaryProvider = Preference.SummaryProvider<Preference> {
|
showTimePreference?.summaryProvider = Preference.SummaryProvider<Preference> {
|
||||||
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<SwitchPreferenceCompat>("biometric_auth")?.apply {
|
findPreference<CheckBoxPreference>("biometric_auth")?.apply {
|
||||||
val isFingerprintSupported = BiometricManager.from(requireContext()).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS
|
val isFingerprintSupported = BiometricManager.from(requireContext()).canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS
|
||||||
if (!isFingerprintSupported) {
|
if (!isFingerprintSupported) {
|
||||||
isEnabled = false
|
isEnabled = false
|
||||||
|
@ -337,10 +334,10 @@ class UserPreference : AppCompatActivity() {
|
||||||
val prefIsCustomDict = findPreference<CheckBoxPreference>("pref_key_is_custom_dict")
|
val prefIsCustomDict = findPreference<CheckBoxPreference>("pref_key_is_custom_dict")
|
||||||
val prefCustomDictPicker = findPreference<Preference>("pref_key_custom_dict")
|
val prefCustomDictPicker = findPreference<Preference>("pref_key_custom_dict")
|
||||||
val prefPwgenType = findPreference<ListPreference>("pref_key_pwgen_type")
|
val prefPwgenType = findPreference<ListPreference>("pref_key_pwgen_type")
|
||||||
showHideDependentPrefs(prefPwgenType?.value, prefIsCustomDict, prefCustomDictPicker)
|
updateXkPasswdPrefsVisibility(prefPwgenType?.value, prefIsCustomDict, prefCustomDictPicker)
|
||||||
|
|
||||||
prefPwgenType?.onPreferenceChangeListener = ChangeListener { _, newValue ->
|
prefPwgenType?.onPreferenceChangeListener = ChangeListener { _, newValue ->
|
||||||
showHideDependentPrefs(newValue, prefIsCustomDict, prefCustomDictPicker)
|
updateXkPasswdPrefsVisibility(newValue, prefIsCustomDict, prefCustomDictPicker)
|
||||||
true
|
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) {
|
when (newValue as String) {
|
||||||
PgpActivity.KEY_PWGEN_TYPE_CLASSIC -> {
|
PgpActivity.KEY_PWGEN_TYPE_CLASSIC -> {
|
||||||
prefIsCustomDict?.isVisible = false
|
prefIsCustomDict?.isVisible = false
|
||||||
|
|
|
@ -831,7 +831,7 @@ class PgpActivity : AppCompatActivity(), OpenPgpServiceConnection.OnBound {
|
||||||
// ignore and keep default
|
// ignore and keep default
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.getBoolean("clear_after_copy", true) && clearAfter != 0) {
|
if (clearAfter != 0) {
|
||||||
setTimer()
|
setTimer()
|
||||||
showSnackbar(this.resources.getString(R.string.clipboard_password_toast_text, clearAfter))
|
showSnackbar(this.resources.getString(R.string.clipboard_password_toast_text, clearAfter))
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -5,9 +5,12 @@
|
||||||
package com.zeapo.pwdstore.git
|
package com.zeapo.pwdstore.git
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.os.Handler
|
||||||
import android.util.Patterns
|
import android.util.Patterns
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
|
import androidx.core.os.postDelayed
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import com.zeapo.pwdstore.R
|
import com.zeapo.pwdstore.R
|
||||||
import com.zeapo.pwdstore.databinding.ActivityGitConfigBinding
|
import com.zeapo.pwdstore.databinding.ActivityGitConfigBinding
|
||||||
import com.zeapo.pwdstore.utils.PasswordRepository
|
import com.zeapo.pwdstore.utils.PasswordRepository
|
||||||
|
@ -23,7 +26,10 @@ class GitConfigActivity : BaseGitActivity() {
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
|
|
||||||
binding.gitUserName.setText(username)
|
if (username.isEmpty())
|
||||||
|
binding.gitUserName.requestFocus()
|
||||||
|
else
|
||||||
|
binding.gitUserName.setText(username)
|
||||||
binding.gitUserEmail.setText(email)
|
binding.gitUserEmail.setText(email)
|
||||||
val repo = PasswordRepository.getRepository(PasswordRepository.getRepositoryDirectory(this))
|
val repo = PasswordRepository.getRepository(PasswordRepository.getRepositoryDirectory(this))
|
||||||
if (repo != null) {
|
if (repo != null) {
|
||||||
|
@ -55,8 +61,10 @@ class GitConfigActivity : BaseGitActivity() {
|
||||||
putString("git_config_user_email", email)
|
putString("git_config_user_email", email)
|
||||||
putString("git_config_user_name", name)
|
putString("git_config_user_name", name)
|
||||||
}
|
}
|
||||||
PasswordRepository.setUserName(name)
|
PasswordRepository.setUserName(name)
|
||||||
PasswordRepository.setUserEmail(email)
|
PasswordRepository.setUserEmail(email)
|
||||||
|
Snackbar.make(binding.root, getString(R.string.git_server_config_save_success), Snackbar.LENGTH_SHORT).show()
|
||||||
|
Handler().postDelayed(500) { finish() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ class SshKeyGenActivity : AppCompatActivity() {
|
||||||
public override fun onCreate(savedInstanceState: Bundle?) {
|
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
title = "Generate SSH Key"
|
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
supportFragmentManager
|
supportFragmentManager
|
||||||
.beginTransaction()
|
.beginTransaction()
|
||||||
|
|
|
@ -10,81 +10,124 @@ import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.inputmethod.InputMethodManager
|
import android.view.inputmethod.InputMethodManager
|
||||||
import android.widget.ArrayAdapter
|
import androidx.core.content.edit
|
||||||
import android.widget.Button
|
|
||||||
import android.widget.CheckBox
|
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.Spinner
|
|
||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
import androidx.fragment.app.Fragment
|
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.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() {
|
class SshKeyGenFragment : Fragment() {
|
||||||
|
|
||||||
private lateinit var checkBox: CheckBox
|
private var keyLength = 4096
|
||||||
private lateinit var comment: EditText
|
private var _binding: FragmentSshKeygenBinding? = null
|
||||||
private lateinit var generate: Button
|
private val binding get() = _binding!!
|
||||||
private lateinit var passphrase: TextInputEditText
|
|
||||||
private lateinit var spinner: Spinner
|
|
||||||
private lateinit var activity: SshKeyGenActivity
|
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?
|
savedInstanceState: Bundle?
|
||||||
): View? {
|
): 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?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
activity = requireActivity() as SshKeyGenActivity
|
with(binding) {
|
||||||
findViews(view)
|
generate.setOnClickListener {
|
||||||
val lengths = arrayOf(2048, 4096)
|
lifecycleScope.launch { generate(passphrase.text.toString(), comment.text.toString()) }
|
||||||
val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, lengths)
|
}
|
||||||
spinner.adapter = adapter
|
showPassphrase.setOnCheckedChangeListener { _, isChecked: Boolean ->
|
||||||
generate.setOnClickListener { generate() }
|
val selection = passphrase.selectionEnd
|
||||||
checkBox.setOnCheckedChangeListener { _, isChecked: Boolean ->
|
if (isChecked) {
|
||||||
val selection = passphrase.selectionEnd
|
passphrase.inputType = (
|
||||||
if (isChecked) {
|
InputType.TYPE_CLASS_TEXT
|
||||||
passphrase.inputType = (
|
or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
|
||||||
InputType.TYPE_CLASS_TEXT
|
} else {
|
||||||
or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
|
passphrase.inputType = (
|
||||||
} else {
|
InputType.TYPE_CLASS_TEXT
|
||||||
passphrase.inputType = (
|
or InputType.TYPE_TEXT_VARIATION_PASSWORD)
|
||||||
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) {
|
override fun onDestroyView() {
|
||||||
checkBox = view.findViewById(R.id.show_passphrase)
|
super.onDestroyView()
|
||||||
comment = view.findViewById(R.id.comment)
|
_binding = null
|
||||||
generate = view.findViewById(R.id.generate)
|
|
||||||
passphrase = view.findViewById(R.id.passphrase)
|
|
||||||
spinner = view.findViewById(R.id.length)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invoked when 'Generate' button of SshKeyGenFragment clicked. Generates a
|
// Invoked when 'Generate' button of SshKeyGenFragment clicked. Generates a
|
||||||
// private and public key, then replaces the SshKeyGenFragment with a
|
// private and public key, then replaces the SshKeyGenFragment with a
|
||||||
// ShowSshKeyFragment which displays the public key.
|
// ShowSshKeyFragment which displays the public key.
|
||||||
fun generate() {
|
private suspend fun generate(passphrase: String, comment: String) {
|
||||||
val length = (spinner.selectedItem as Int).toString()
|
binding.generate.text = getString(R.string.ssh_key_gen_generating_progress)
|
||||||
val passphrase = passphrase.text.toString()
|
val jsch = JSch()
|
||||||
val comment = comment.text.toString()
|
val e = try {
|
||||||
KeyGenerateTask(activity).execute(length, passphrase, comment)
|
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()
|
hideKeyboard()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hideKeyboard() {
|
private fun hideKeyboard() {
|
||||||
val imm = activity.getSystemService<InputMethodManager>()
|
val activity = activity ?: return
|
||||||
|
val imm = activity.getSystemService<InputMethodManager>() ?: return
|
||||||
var view = activity.currentFocus
|
var view = activity.currentFocus
|
||||||
if (view == null) {
|
if (view == null) {
|
||||||
view = View(activity)
|
view = View(activity)
|
||||||
}
|
}
|
||||||
imm?.hideSoftInputFromWindow(view.windowToken, 0)
|
imm.hideSoftInputFromWindow(view.windowToken, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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<String?, Void?, Exception?>() {
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -23,7 +23,7 @@
|
||||||
android:id="@+id/git_user_name"
|
android:id="@+id/git_user_name"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:inputType="textNoSuggestions|textVisiblePassword" />
|
android:inputType="textPersonName" />
|
||||||
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,34 @@
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:text="@string/ssh_keygen_length" />
|
android:text="@string/ssh_keygen_length" />
|
||||||
|
|
||||||
<Spinner
|
<com.google.android.material.button.MaterialButtonToggleGroup
|
||||||
android:id="@+id/length"
|
style="@style/TextAppearance.MaterialComponents.Headline1"
|
||||||
android:layout_width="fill_parent"
|
android:id="@+id/key_length_group"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:spinnerMode="dropdown" />
|
app:selectionRequired="true"
|
||||||
|
app:singleSelection="true">
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
style="?attr/materialButtonOutlinedStyle"
|
||||||
|
android:id="@+id/key_length_2048"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/key_length_2048"
|
||||||
|
android:textColor="?android:attr/textColorPrimary"
|
||||||
|
app:rippleColor="@color/ripple_color"
|
||||||
|
app:strokeColor="?attr/colorSecondary"
|
||||||
|
app:backgroundTint="@color/toggle_button_selector" />
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
style="?attr/materialButtonOutlinedStyle"
|
||||||
|
android:id="@+id/key_length_4096"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/key_length_4096"
|
||||||
|
android:textColor="?android:attr/textColorPrimary"
|
||||||
|
app:rippleColor="@color/ripple_color"
|
||||||
|
app:strokeColor="?attr/colorSecondary"
|
||||||
|
app:backgroundTint="@color/toggle_button_selector" />
|
||||||
|
</com.google.android.material.button.MaterialButtonToggleGroup>
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -38,7 +61,7 @@
|
||||||
android:inputType="textPassword" />
|
android:inputType="textPassword" />
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
<CheckBox
|
<com.google.android.material.checkbox.MaterialCheckBox
|
||||||
android:id="@+id/show_passphrase"
|
android:id="@+id/show_passphrase"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
|
@ -72,8 +72,7 @@
|
||||||
<string name="pref_dialog_delete_title">تنحية المستودع</string>
|
<string name="pref_dialog_delete_title">تنحية المستودع</string>
|
||||||
<string name="pref_crypto_title">التشفير</string>
|
<string name="pref_crypto_title">التشفير</string>
|
||||||
<string name="pref_provider_title">إختيار مزود الأوبن بي جي بي OpenPGP</string>
|
<string name="pref_provider_title">إختيار مزود الأوبن بي جي بي OpenPGP</string>
|
||||||
<string name="pref_general_title">الإعدادات العامة</string>
|
<string name="pref_category_general_title">الإعدادات العامة</string>
|
||||||
<string name="pref_show_time_title">مدة الإبقاء على كلمة السر ظاهرة</string>
|
|
||||||
<string name="pref_copy_title">نسخ كلمة السر تلقائيًا</string>
|
<string name="pref_copy_title">نسخ كلمة السر تلقائيًا</string>
|
||||||
<string name="ssh_key_success_dialog_title">تم استيراد مفتاح الـ SSH</string>
|
<string name="ssh_key_success_dialog_title">تم استيراد مفتاح الـ SSH</string>
|
||||||
<string name="ssh_key_error_dialog_text">نص الرسالة : \n</string>
|
<string name="ssh_key_error_dialog_text">نص الرسالة : \n</string>
|
||||||
|
@ -88,7 +87,6 @@
|
||||||
<string name="pref_external_repository_summary">إستخدم كلمة مرور المستودع الخارجي</string>
|
<string name="pref_external_repository_summary">إستخدم كلمة مرور المستودع الخارجي</string>
|
||||||
<string name="pref_select_external_repository">إختيار مستودع التخزين الخارجي</string>
|
<string name="pref_select_external_repository">إختيار مستودع التخزين الخارجي</string>
|
||||||
<string name="prefs_use_default_file_picker">إستخدم أداة إختيار الملفات الإفتراضي</string>
|
<string name="prefs_use_default_file_picker">إستخدم أداة إختيار الملفات الإفتراضي</string>
|
||||||
<string name="prefs_clear_after_copy_title">تنظيف الحافظة مباشرةً بعد النسخ</string>
|
|
||||||
<string name="prefs_export_passwords_title">تصدير كلمات السر</string>
|
<string name="prefs_export_passwords_title">تصدير كلمات السر</string>
|
||||||
<string name="prefs_version">النسخة</string>
|
<string name="prefs_version">النسخة</string>
|
||||||
|
|
||||||
|
|
|
@ -112,8 +112,7 @@
|
||||||
<string name="pref_crypto_title">Šifrování</string>
|
<string name="pref_crypto_title">Šifrování</string>
|
||||||
<string name="pref_provider_title">Vybrat poskytovatele OpenPGP</string>
|
<string name="pref_provider_title">Vybrat poskytovatele OpenPGP</string>
|
||||||
<string name="pref_key_title">Vybrat ID OpenPGP klíče</string>
|
<string name="pref_key_title">Vybrat ID OpenPGP klíče</string>
|
||||||
<string name="pref_general_title">Všeobecné</string>
|
<string name="pref_category_general_title">Všeobecné</string>
|
||||||
<string name="pref_show_time_title">Čas zobrazení hesla</string>
|
|
||||||
<string name="pref_copy_title">Automaticky kopírovat heslo</string>
|
<string name="pref_copy_title">Automaticky kopírovat heslo</string>
|
||||||
<string name="pref_copy_dialog_title">Automatické kopírování hesla do schránky po úspěšném dešifrování.</string>
|
<string name="pref_copy_dialog_title">Automatické kopírování hesla do schránky po úspěšném dešifrování.</string>
|
||||||
<string name="ssh_key_success_dialog_title">SSH-key importován</string>
|
<string name="ssh_key_success_dialog_title">SSH-key importován</string>
|
||||||
|
|
|
@ -87,8 +87,7 @@
|
||||||
<string name="pref_crypto_title">Kryptografie</string>
|
<string name="pref_crypto_title">Kryptografie</string>
|
||||||
<string name="pref_provider_title">Wähle OpenPGP-Provider</string>
|
<string name="pref_provider_title">Wähle OpenPGP-Provider</string>
|
||||||
<string name="pref_key_title">Wähle OpenPGP-Key ID</string>
|
<string name="pref_key_title">Wähle OpenPGP-Key ID</string>
|
||||||
<string name="pref_general_title">Allgemein</string>
|
<string name="pref_category_general_title">Allgemein</string>
|
||||||
<string name="pref_show_time_title">Ablaufzeit des Passworts</string>
|
|
||||||
<string name="pref_copy_title">Kopiere Passwort automatisch</string>
|
<string name="pref_copy_title">Kopiere Passwort automatisch</string>
|
||||||
<string name="pref_copy_dialog_title">Kopiert das Passwort in die Zwischenablage, wenn der Eintrag entschlüsselt wurde.</string>
|
<string name="pref_copy_dialog_title">Kopiert das Passwort in die Zwischenablage, wenn der Eintrag entschlüsselt wurde.</string>
|
||||||
<string name="ssh_key_success_dialog_title">SSH-Key importiert</string>
|
<string name="ssh_key_success_dialog_title">SSH-Key importiert</string>
|
||||||
|
@ -112,8 +111,6 @@
|
||||||
<string name="pref_external_repository_summary">Nutze ein externes Repository</string>
|
<string name="pref_external_repository_summary">Nutze ein externes Repository</string>
|
||||||
<string name="pref_select_external_repository">Wähle ein externes Repository</string>
|
<string name="pref_select_external_repository">Wähle ein externes Repository</string>
|
||||||
<string name="prefs_use_default_file_picker">Benutze Standardauswahl für Dateien</string>
|
<string name="prefs_use_default_file_picker">Benutze Standardauswahl für Dateien</string>
|
||||||
<string name="prefs_clear_after_copy_title">Zwischenablage automatisch leeren</string>
|
|
||||||
<string name="prefs_clear_after_copy_summary">Nach automatischen oder manuellen Kopieren des Passwords wird die Zwischenablage automatisch geleert</string>
|
|
||||||
<string name="prefs_export_passwords_title">Passwörter exportieren</string>
|
<string name="prefs_export_passwords_title">Passwörter exportieren</string>
|
||||||
<string name="prefs_export_passwords_summary">Exportiert die verschlüsselten Passwörter in ein externes Verzeichnis</string>
|
<string name="prefs_export_passwords_summary">Exportiert die verschlüsselten Passwörter in ein externes Verzeichnis</string>
|
||||||
<string name="prefs_version">Version</string>
|
<string name="prefs_version">Version</string>
|
||||||
|
|
|
@ -113,8 +113,7 @@
|
||||||
<string name="pref_provider_title">Selecciona un proveedor OpenPGP</string>
|
<string name="pref_provider_title">Selecciona un proveedor OpenPGP</string>
|
||||||
<string name="pref_key_title">Selecciona la llave OpenPGP</string>
|
<string name="pref_key_title">Selecciona la llave OpenPGP</string>
|
||||||
<string name="pref_no_key_selected">Ninguna llave seleccionada</string>
|
<string name="pref_no_key_selected">Ninguna llave seleccionada</string>
|
||||||
<string name="pref_general_title">General</string>
|
<string name="pref_category_general_title">General</string>
|
||||||
<string name="pref_show_time_title">Tiempo para mostrar contraseña</string>
|
|
||||||
<string name="pref_copy_title">Copiar contraseña automáticamente</string>
|
<string name="pref_copy_title">Copiar contraseña automáticamente</string>
|
||||||
<string name="pref_copy_dialog_title">Automáticamente copia la contraseña al portapapeles si el descifrado fue exitoso.</string>
|
<string name="pref_copy_dialog_title">Automáticamente copia la contraseña al portapapeles si el descifrado fue exitoso.</string>
|
||||||
<string name="ssh_key_success_dialog_title">Llave SSH importada</string>
|
<string name="ssh_key_success_dialog_title">Llave SSH importada</string>
|
||||||
|
@ -142,8 +141,6 @@
|
||||||
<string name="pref_external_repository_summary">Usar un repositorio externo para contraseñas</string>
|
<string name="pref_external_repository_summary">Usar un repositorio externo para contraseñas</string>
|
||||||
<string name="pref_select_external_repository">Seleccionar repositorio externo</string>
|
<string name="pref_select_external_repository">Seleccionar repositorio externo</string>
|
||||||
<string name="prefs_use_default_file_picker">Usar seleccionador de archivos por defecto</string>
|
<string name="prefs_use_default_file_picker">Usar seleccionador de archivos por defecto</string>
|
||||||
<string name="prefs_clear_after_copy_title">Limpiar automáticamente el portapapeles después de copiar</string>
|
|
||||||
<string name="prefs_clear_after_copy_summary">Después de copiar manual o automáticamente la contraseña, el portapapeles será automáticamente limpiado.</string>
|
|
||||||
<string name="prefs_export_passwords_title">Exportar contraseñas</string>
|
<string name="prefs_export_passwords_title">Exportar contraseñas</string>
|
||||||
<string name="prefs_export_passwords_summary">Exporta las contraseñas cifradas a un directorio externo.</string>
|
<string name="prefs_export_passwords_summary">Exporta las contraseñas cifradas a un directorio externo.</string>
|
||||||
<string name="prefs_version">Versión</string>
|
<string name="prefs_version">Versión</string>
|
||||||
|
|
|
@ -121,8 +121,7 @@
|
||||||
<string name="pref_provider_title">Sélection du prestataire OpenPGP</string>
|
<string name="pref_provider_title">Sélection du prestataire OpenPGP</string>
|
||||||
<string name="pref_key_title">Sélection de votre identifiant OpenPGP</string>
|
<string name="pref_key_title">Sélection de votre identifiant OpenPGP</string>
|
||||||
<string name="pref_no_key_selected">Aucune clé sélectionnée</string>
|
<string name="pref_no_key_selected">Aucune clé sélectionnée</string>
|
||||||
<string name="pref_general_title">Général</string>
|
<string name="pref_category_general_title">Général</string>
|
||||||
<string name="pref_show_time_title">Durée de disponibilité du mot de passe</string>
|
|
||||||
<string name="pref_copy_title">Copie automatique du mot de passe</string>
|
<string name="pref_copy_title">Copie automatique du mot de passe</string>
|
||||||
<string name="pref_copy_dialog_title">Copie automatiquement le mot de passe vers le presse-papier si le déchiffrement a réussi.</string>
|
<string name="pref_copy_dialog_title">Copie automatiquement le mot de passe vers le presse-papier si le déchiffrement a réussi.</string>
|
||||||
<string name="ssh_key_success_dialog_title">Clef SSH importée</string>
|
<string name="ssh_key_success_dialog_title">Clef SSH importée</string>
|
||||||
|
@ -147,8 +146,6 @@
|
||||||
<string name="pref_external_repository_summary">Utilise un dépôt externe pour les mots de passe</string>
|
<string name="pref_external_repository_summary">Utilise un dépôt externe pour les mots de passe</string>
|
||||||
<string name="pref_select_external_repository">Choisissez un dépôt externe</string>
|
<string name="pref_select_external_repository">Choisissez un dépôt externe</string>
|
||||||
<string name="prefs_use_default_file_picker">Utiliser le selecteur de fichier par défaut</string>
|
<string name="prefs_use_default_file_picker">Utiliser le selecteur de fichier par défaut</string>
|
||||||
<string name="prefs_clear_after_copy_title">Vider le presse-papier automatiquement après la copie</string>
|
|
||||||
<string name="prefs_clear_after_copy_summary">"Après une copie du mot de passe, le presse papier sera automatiquement vidé "</string>
|
|
||||||
<string name="prefs_export_passwords_title">Exporter les mots de passe</string>
|
<string name="prefs_export_passwords_title">Exporter les mots de passe</string>
|
||||||
<string name="prefs_export_passwords_summary">Exporter les mots de passe (chiffrés) vers un répertoire externe</string>
|
<string name="prefs_export_passwords_summary">Exporter les mots de passe (chiffrés) vers un répertoire externe</string>
|
||||||
<string name="prefs_version">Version</string>
|
<string name="prefs_version">Version</string>
|
||||||
|
|
|
@ -73,8 +73,7 @@
|
||||||
<string name="pref_crypto_title">暗号化</string>
|
<string name="pref_crypto_title">暗号化</string>
|
||||||
<string name="pref_provider_title">OpenPGP プロバイダーを選択</string>
|
<string name="pref_provider_title">OpenPGP プロバイダーを選択</string>
|
||||||
<string name="pref_key_title">OpenPGP 鍵 ID を選択</string>
|
<string name="pref_key_title">OpenPGP 鍵 ID を選択</string>
|
||||||
<string name="pref_general_title">全般</string>
|
<string name="pref_category_general_title">全般</string>
|
||||||
<string name="pref_show_time_title">パスワード表示時間</string>
|
|
||||||
<string name="pref_copy_title">自動的にパスワードをコピー</string>
|
<string name="pref_copy_title">自動的にパスワードをコピー</string>
|
||||||
<string name="pref_copy_dialog_title">復号化が成功した後、自動的にパスワードをクリップボードにコピーします。</string>
|
<string name="pref_copy_dialog_title">復号化が成功した後、自動的にパスワードをクリップボードにコピーします。</string>
|
||||||
<string name="ssh_key_success_dialog_title">SSH 鍵をインポートしました</string>
|
<string name="ssh_key_success_dialog_title">SSH 鍵をインポートしました</string>
|
||||||
|
|
|
@ -126,9 +126,7 @@
|
||||||
<string name="pref_provider_title">Выберите провайдера OpenPGP</string>
|
<string name="pref_provider_title">Выберите провайдера OpenPGP</string>
|
||||||
<string name="pref_key_title">Выберите ключ OpenPGP</string>
|
<string name="pref_key_title">Выберите ключ OpenPGP</string>
|
||||||
<string name="pref_no_key_selected">Ключи не выбраны</string>
|
<string name="pref_no_key_selected">Ключи не выбраны</string>
|
||||||
<string name="pref_general_title">Общие</string>
|
<string name="pref_category_general_title">Общие</string>
|
||||||
<string name="pref_show_time_title">Время в буфере</string>
|
|
||||||
<string name="pref_show_time_summary">Уставить время (в секундах) в течении которого пароль будет находиться в буфере обмена. 0 - останется навсегда. Текущее значение: %1$s</string>
|
|
||||||
<string name="pref_copy_title">Автоматически копировать пароль</string>
|
<string name="pref_copy_title">Автоматически копировать пароль</string>
|
||||||
<string name="pref_copy_dialog_title">Автоматически копировать пароль в буфер обмена после успешного расшифрования</string>
|
<string name="pref_copy_dialog_title">Автоматически копировать пароль в буфер обмена после успешного расшифрования</string>
|
||||||
<string name="ssh_key_success_dialog_title">SSH ключ импортирован</string>
|
<string name="ssh_key_success_dialog_title">SSH ключ импортирован</string>
|
||||||
|
@ -158,8 +156,6 @@
|
||||||
<string name="pref_external_repository_summary">Использовать внешний репозиторий</string>
|
<string name="pref_external_repository_summary">Использовать внешний репозиторий</string>
|
||||||
<string name="pref_select_external_repository">Выбрать внешний репозиторий</string>
|
<string name="pref_select_external_repository">Выбрать внешний репозиторий</string>
|
||||||
<string name="prefs_use_default_file_picker">Использовать стандартное окно выбора файлов</string>
|
<string name="prefs_use_default_file_picker">Использовать стандартное окно выбора файлов</string>
|
||||||
<string name="prefs_clear_after_copy_title">Автоматически очищать буфер обмена после вставки</string>
|
|
||||||
<string name="prefs_clear_after_copy_summary">После автоматического или ручного копирования, буфер обмена будет автоматически очищен.</string>
|
|
||||||
<string name="prefs_export_passwords_title">Экспортировать пароли</string>
|
<string name="prefs_export_passwords_title">Экспортировать пароли</string>
|
||||||
<string name="prefs_export_passwords_summary">Экспортировать пароли в открытом виде во внешнее хранилище</string>
|
<string name="prefs_export_passwords_summary">Экспортировать пароли в открытом виде во внешнее хранилище</string>
|
||||||
<string name="prefs_version">Версия</string>
|
<string name="prefs_version">Версия</string>
|
||||||
|
|
|
@ -73,8 +73,7 @@
|
||||||
<string name="pref_crypto_title">加密</string>
|
<string name="pref_crypto_title">加密</string>
|
||||||
<string name="pref_provider_title">选择 OpenPGP 应用</string>
|
<string name="pref_provider_title">选择 OpenPGP 应用</string>
|
||||||
<string name="pref_key_title">选择 OpenPGP Key Id</string>
|
<string name="pref_key_title">选择 OpenPGP Key Id</string>
|
||||||
<string name="pref_general_title">通用</string>
|
<string name="pref_category_general_title">通用</string>
|
||||||
<string name="pref_show_time_title">密码保存时限</string>
|
|
||||||
<string name="pref_copy_title">自动复制密码</string>
|
<string name="pref_copy_title">自动复制密码</string>
|
||||||
<string name="pref_copy_dialog_title">解密成功后自动将密码复制到剪贴板</string>
|
<string name="pref_copy_dialog_title">解密成功后自动将密码复制到剪贴板</string>
|
||||||
<string name="ssh_key_success_dialog_title">成功导入SSH密钥</string>
|
<string name="ssh_key_success_dialog_title">成功导入SSH密钥</string>
|
||||||
|
|
|
@ -70,8 +70,7 @@
|
||||||
<string name="pref_crypto_title">加密</string>
|
<string name="pref_crypto_title">加密</string>
|
||||||
<string name="pref_provider_title">選擇 OpenPGP app</string>
|
<string name="pref_provider_title">選擇 OpenPGP app</string>
|
||||||
<string name="pref_key_title">選擇 OpenPGP Key Id</string>
|
<string name="pref_key_title">選擇 OpenPGP Key Id</string>
|
||||||
<string name="pref_general_title">一般</string>
|
<string name="pref_category_general_title">一般</string>
|
||||||
<string name="pref_show_time_title">密碼保存時限</string>
|
|
||||||
<string name="pref_copy_title">自動複製密碼</string>
|
<string name="pref_copy_title">自動複製密碼</string>
|
||||||
<string name="pref_copy_dialog_title">解密成功後自動將密碼複製到剪貼簿</string>
|
<string name="pref_copy_dialog_title">解密成功後自動將密碼複製到剪貼簿</string>
|
||||||
<string name="ssh_key_success_dialog_title">成功匯入 SSH 金鑰</string>
|
<string name="ssh_key_success_dialog_title">成功匯入 SSH 金鑰</string>
|
||||||
|
|
|
@ -143,9 +143,10 @@
|
||||||
<string name="pref_provider_title">Select OpenPGP provider</string>
|
<string name="pref_provider_title">Select OpenPGP provider</string>
|
||||||
<string name="pref_key_title">Select OpenPGP key ID</string>
|
<string name="pref_key_title">Select OpenPGP key ID</string>
|
||||||
<string name="pref_no_key_selected">No key selected</string>
|
<string name="pref_no_key_selected">No key selected</string>
|
||||||
<string name="pref_general_title">General</string>
|
<string name="pref_category_general_title">General</string>
|
||||||
<string name="pref_show_time_title">Password show time</string>
|
<string name="pref_category_title_passwords">Passwords</string>
|
||||||
<string name="pref_show_time_summary">Set the time (in seconds) you want the password to be in clipboard. 0 means forever. Current value: %1$s</string>
|
<string name="pref_clipboard_timeout_title">Password copy timeout</string>
|
||||||
|
<string name="pref_clipboard_timeout_summary">Set the time (in seconds) you want the password to be in clipboard. 0 means forever. Current value: %1$s</string>
|
||||||
<string name="pref_copy_title">Automatically copy password</string>
|
<string name="pref_copy_title">Automatically copy password</string>
|
||||||
<string name="pref_copy_dialog_title">Automatically copy the password to the clipboard after decryption was successful.</string>
|
<string name="pref_copy_dialog_title">Automatically copy the password to the clipboard after decryption was successful.</string>
|
||||||
<string name="ssh_key_import_error_not_an_ssh_key_message">Selected file does not appear to be an SSH private key.</string>
|
<string name="ssh_key_import_error_not_an_ssh_key_message">Selected file does not appear to be an SSH private key.</string>
|
||||||
|
@ -177,8 +178,6 @@
|
||||||
<string name="pref_external_repository_summary">Use an external password repository</string>
|
<string name="pref_external_repository_summary">Use an external password repository</string>
|
||||||
<string name="pref_select_external_repository">Select external repository</string>
|
<string name="pref_select_external_repository">Select external repository</string>
|
||||||
<string name="prefs_use_default_file_picker">Use default file picker</string>
|
<string name="prefs_use_default_file_picker">Use default file picker</string>
|
||||||
<string name="prefs_clear_after_copy_title">Automatically clear the clipboard after copy</string>
|
|
||||||
<string name="prefs_clear_after_copy_summary">After an automatic copy or a manual copy of the password, the clipboard will be automatically cleared.</string>
|
|
||||||
<string name="prefs_export_passwords_title">Export passwords</string>
|
<string name="prefs_export_passwords_title">Export passwords</string>
|
||||||
<string name="prefs_export_passwords_summary">Exports the encrypted passwords to an external directory</string>
|
<string name="prefs_export_passwords_summary">Exports the encrypted passwords to an external directory</string>
|
||||||
<string name="prefs_version">Version</string>
|
<string name="prefs_version">Version</string>
|
||||||
|
@ -223,6 +222,10 @@
|
||||||
<string name="ssh_keygen_copy">Copy</string>
|
<string name="ssh_keygen_copy">Copy</string>
|
||||||
<string name="ssh_keygen_tip">Provide this public key to your Git server.</string>
|
<string name="ssh_keygen_tip">Provide this public key to your Git server.</string>
|
||||||
<string name="ssh_keygen_show_passphrase">Show passphrase</string>
|
<string name="ssh_keygen_show_passphrase">Show passphrase</string>
|
||||||
|
<string name="ssh_key_gen_generating_progress">Generating keys…</string>
|
||||||
|
<string name="ssh_keygen_generating_done">Done!</string>
|
||||||
|
<string name="key_length_2048" translatable="false">2048</string>
|
||||||
|
<string name="key_length_4096" translatable="false">4096</string>
|
||||||
|
|
||||||
<!-- Misc -->
|
<!-- Misc -->
|
||||||
<string name="dialog_ok">OK</string>
|
<string name="dialog_ok">OK</string>
|
||||||
|
@ -236,9 +239,9 @@
|
||||||
<string name="git_pull">Pull from remote</string>
|
<string name="git_pull">Pull from remote</string>
|
||||||
<string name="git_push">Push to remote</string>
|
<string name="git_push">Push to remote</string>
|
||||||
<string name="show_password_pref_title">Show the password</string>
|
<string name="show_password_pref_title">Show the password</string>
|
||||||
<string name="show_password_pref_summary">Control the visibility of the passwords once decrypted, this does not disable the password copy</string>
|
<string name="show_password_pref_summary">Control the visibility of the passwords once decrypted. This does not disable copying to clipboard.</string>
|
||||||
<string name="show_extra_content_pref_title">Show extra content</string>
|
<string name="show_extra_content_pref_title">Show extra content</string>
|
||||||
<string name="show_extra_content_pref_summary">Control the visibility of the extra content once decrypted</string>
|
<string name="show_extra_content_pref_summary">Control the visibility of the extra content once decrypted.</string>
|
||||||
<string name="pwd_generate_button">Generate</string>
|
<string name="pwd_generate_button">Generate</string>
|
||||||
<string name="refresh_list">Refresh list</string>
|
<string name="refresh_list">Refresh list</string>
|
||||||
<string name="no_repo_selected">No external repository selected</string>
|
<string name="no_repo_selected">No external repository selected</string>
|
||||||
|
|
|
@ -1,61 +1,61 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<androidx.preference.PreferenceCategory app:title="@string/pref_autofill_title">
|
<PreferenceCategory app:title="@string/pref_autofill_title">
|
||||||
<androidx.preference.SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
app:defaultValue="true"
|
app:defaultValue="true"
|
||||||
app:key="autofill_enable"
|
app:key="autofill_enable"
|
||||||
app:title="@string/pref_autofill_enable_title"/>
|
app:title="@string/pref_autofill_enable_title"/>
|
||||||
<androidx.preference.ListPreference
|
<ListPreference
|
||||||
app:defaultValue="file"
|
app:defaultValue="file"
|
||||||
app:entries="@array/oreo_autofill_directory_structure_entries"
|
app:entries="@array/oreo_autofill_directory_structure_entries"
|
||||||
app:entryValues="@array/oreo_autofill_directory_structure_values"
|
app:entryValues="@array/oreo_autofill_directory_structure_values"
|
||||||
app:key="oreo_autofill_directory_structure"
|
app:key="oreo_autofill_directory_structure"
|
||||||
app:title="@string/oreo_autofill_preference_directory_structure"
|
app:title="@string/oreo_autofill_preference_directory_structure"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="autofill_apps"
|
app:key="autofill_apps"
|
||||||
app:title="@string/pref_autofill_apps_title"/>
|
app:title="@string/pref_autofill_apps_title"/>
|
||||||
<androidx.preference.CheckBoxPreference
|
<CheckBoxPreference
|
||||||
app:defaultValue="true"
|
app:defaultValue="true"
|
||||||
app:key="autofill_default"
|
app:key="autofill_default"
|
||||||
app:summary="@string/pref_autofill_default_hint"
|
app:summary="@string/pref_autofill_default_hint"
|
||||||
app:title="@string/pref_autofill_default_title"/>
|
app:title="@string/pref_autofill_default_title"/>
|
||||||
<androidx.preference.CheckBoxPreference
|
<CheckBoxPreference
|
||||||
app:defaultValue="false"
|
app:defaultValue="false"
|
||||||
app:key="autofill_always"
|
app:key="autofill_always"
|
||||||
app:title="@string/pref_autofill_always_title"/>
|
app:title="@string/pref_autofill_always_title"/>
|
||||||
<androidx.preference.CheckBoxPreference
|
<CheckBoxPreference
|
||||||
app:defaultValue="false"
|
app:defaultValue="false"
|
||||||
app:key="autofill_full_path"
|
app:key="autofill_full_path"
|
||||||
app:summary="@string/pref_autofill_full_path_hint"
|
app:summary="@string/pref_autofill_full_path_hint"
|
||||||
app:title="@string/pref_autofill_full_path_title"/>
|
app:title="@string/pref_autofill_full_path_title"/>
|
||||||
</androidx.preference.PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<androidx.preference.PreferenceCategory app:title="@string/pref_git_title">
|
<PreferenceCategory app:title="@string/pref_git_title">
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="git_server_info"
|
app:key="git_server_info"
|
||||||
app:title="@string/pref_edit_server_info" />
|
app:title="@string/pref_edit_server_info" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="git_config"
|
app:key="git_config"
|
||||||
app:title="@string/pref_edit_git_config" />
|
app:title="@string/pref_edit_git_config" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="ssh_key"
|
app:key="ssh_key"
|
||||||
app:title="@string/pref_ssh_title" />
|
app:title="@string/pref_ssh_title" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="ssh_keygen"
|
app:key="ssh_keygen"
|
||||||
app:title="@string/pref_ssh_keygen_title" />
|
app:title="@string/pref_ssh_keygen_title" />
|
||||||
<androidx.preference.Preference app:key="clear_saved_pass" />
|
<Preference app:key="clear_saved_pass" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="hotp_remember_clear_choice"
|
app:key="hotp_remember_clear_choice"
|
||||||
app:title="@string/hotp_remember_clear_choice" />
|
app:title="@string/hotp_remember_clear_choice" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="ssh_openkeystore_clear_keyid"
|
app:key="ssh_openkeystore_clear_keyid"
|
||||||
app:title="@string/ssh_openkeystore_clear_keyid" />
|
app:title="@string/ssh_openkeystore_clear_keyid" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="ssh_see_key"
|
app:key="ssh_see_key"
|
||||||
app:title="@string/pref_ssh_see_key_title" />
|
app:title="@string/pref_ssh_see_key_title" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="git_delete_repo"
|
app:key="git_delete_repo"
|
||||||
app:summary="@string/pref_git_delete_repo_summary"
|
app:summary="@string/pref_git_delete_repo_summary"
|
||||||
app:title="@string/pref_git_delete_repo" />
|
app:title="@string/pref_git_delete_repo" />
|
||||||
|
@ -63,23 +63,23 @@
|
||||||
app:key="git_external"
|
app:key="git_external"
|
||||||
app:summary="@string/pref_external_repository_summary"
|
app:summary="@string/pref_external_repository_summary"
|
||||||
app:title="@string/pref_external_repository" />
|
app:title="@string/pref_external_repository" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:dependency="git_external"
|
app:dependency="git_external"
|
||||||
app:key="pref_select_external"
|
app:key="pref_select_external"
|
||||||
app:title="@string/pref_select_external_repository" />
|
app:title="@string/pref_select_external_repository" />
|
||||||
</androidx.preference.PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<androidx.preference.PreferenceCategory app:title="@string/pref_crypto_title">
|
<PreferenceCategory app:title="@string/pref_crypto_title">
|
||||||
<me.msfjarvis.openpgpktx.preference.OpenPgpAppPreference
|
<me.msfjarvis.openpgpktx.preference.OpenPgpAppPreference
|
||||||
app:key="openpgp_provider_list"
|
app:key="openpgp_provider_list"
|
||||||
app:title="@string/pref_provider_title" />
|
app:title="@string/pref_provider_title" />
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="openpgp_key_id_pref"
|
app:key="openpgp_key_id_pref"
|
||||||
app:title="@string/pref_key_title" />
|
app:title="@string/pref_key_title" />
|
||||||
</androidx.preference.PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<androidx.preference.PreferenceCategory app:title="@string/password_generator_category_title">
|
<PreferenceCategory app:title="@string/password_generator_category_title">
|
||||||
<androidx.preference.ListPreference
|
<ListPreference
|
||||||
app:key="pref_key_pwgen_type"
|
app:key="pref_key_pwgen_type"
|
||||||
app:title="@string/xkpwgen_pref_gentype_title"
|
app:title="@string/xkpwgen_pref_gentype_title"
|
||||||
app:defaultValue="classic"
|
app:defaultValue="classic"
|
||||||
|
@ -87,19 +87,19 @@
|
||||||
app:entryValues="@array/pwgen_provider_values"
|
app:entryValues="@array/pwgen_provider_values"
|
||||||
app:useSimpleSummaryProvider="true"
|
app:useSimpleSummaryProvider="true"
|
||||||
app:persistent="true" />
|
app:persistent="true" />
|
||||||
<androidx.preference.CheckBoxPreference
|
<CheckBoxPreference
|
||||||
app:key="pref_key_is_custom_dict"
|
app:key="pref_key_is_custom_dict"
|
||||||
app:title="@string/xkpwgen_pref_custom_dict_title"
|
app:title="@string/xkpwgen_pref_custom_dict_title"
|
||||||
app:summaryOn="@string/xkpwgen_pref_custom_dict_summary_on"
|
app:summaryOn="@string/xkpwgen_pref_custom_dict_summary_on"
|
||||||
app:summaryOff="@string/xkpwgen_pref_custom_dict_summary_off"/>
|
app:summaryOff="@string/xkpwgen_pref_custom_dict_summary_off"/>
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="pref_key_custom_dict"
|
app:key="pref_key_custom_dict"
|
||||||
app:title="@string/xkpwgen_pref_custom_dict_picker_title"
|
app:title="@string/xkpwgen_pref_custom_dict_picker_title"
|
||||||
app:summary="@string/xkpwgen_pref_custom_dict_picker_summary"
|
app:summary="@string/xkpwgen_pref_custom_dict_picker_summary"
|
||||||
app:dependency="pref_key_is_custom_dict"/>
|
app:dependency="pref_key_is_custom_dict"/>
|
||||||
</androidx.preference.PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<androidx.preference.PreferenceCategory app:title="@string/pref_general_title">
|
<PreferenceCategory app:title="@string/pref_category_general_title">
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:defaultValue="@string/app_theme_def"
|
android:defaultValue="@string/app_theme_def"
|
||||||
android:key="app_theme"
|
android:key="app_theme"
|
||||||
|
@ -107,45 +107,7 @@
|
||||||
android:entryValues="@array/app_theme_values"
|
android:entryValues="@array/app_theme_values"
|
||||||
android:summary="%s"
|
android:summary="%s"
|
||||||
android:title="@string/theme_title" />
|
android:title="@string/theme_title" />
|
||||||
<androidx.preference.EditTextPreference
|
<ListPreference
|
||||||
app:defaultValue="45"
|
|
||||||
app:dialogTitle="@string/pref_show_time_summary"
|
|
||||||
android:inputType="number"
|
|
||||||
app:key="general_show_time"
|
|
||||||
app:summary="@string/pref_show_time_summary"
|
|
||||||
app:title="@string/pref_show_time_title" />
|
|
||||||
<androidx.preference.CheckBoxPreference
|
|
||||||
app:defaultValue="true"
|
|
||||||
app:title="@string/show_password_pref_title"
|
|
||||||
app:summary="@string/show_password_pref_summary"
|
|
||||||
app:key="show_password" />
|
|
||||||
<androidx.preference.CheckBoxPreference
|
|
||||||
app:defaultValue="true"
|
|
||||||
app:title="@string/show_extra_content_pref_title"
|
|
||||||
app:summary="@string/show_extra_content_pref_summary"
|
|
||||||
app:key="show_extra_content" />
|
|
||||||
<androidx.preference.CheckBoxPreference
|
|
||||||
app:defaultValue="true"
|
|
||||||
app:dialogTitle="@string/pref_copy_dialog_title"
|
|
||||||
app:key="copy_on_decrypt"
|
|
||||||
app:summary="@string/pref_copy_dialog_title"
|
|
||||||
app:title="@string/pref_copy_title" />
|
|
||||||
<androidx.preference.CheckBoxPreference
|
|
||||||
app:defaultValue="true"
|
|
||||||
app:key="clear_after_copy"
|
|
||||||
app:summary="@string/prefs_clear_after_copy_summary"
|
|
||||||
app:title="@string/prefs_clear_after_copy_title" />
|
|
||||||
<androidx.preference.CheckBoxPreference
|
|
||||||
app:defaultValue="true"
|
|
||||||
app:key="filter_recursively"
|
|
||||||
app:summary="@string/pref_recursive_filter_hint"
|
|
||||||
app:title="@string/pref_recursive_filter" />
|
|
||||||
<androidx.preference.CheckBoxPreference
|
|
||||||
app:defaultValue="false"
|
|
||||||
app:key="search_on_start"
|
|
||||||
app:summary="@string/pref_search_on_start_hint"
|
|
||||||
app:title="@string/pref_search_on_start" />
|
|
||||||
<androidx.preference.ListPreference
|
|
||||||
app:title="@string/pref_sort_order_title"
|
app:title="@string/pref_sort_order_title"
|
||||||
app:defaultValue="FOLDER_FIRST"
|
app:defaultValue="FOLDER_FIRST"
|
||||||
app:key="sort_order"
|
app:key="sort_order"
|
||||||
|
@ -153,35 +115,69 @@
|
||||||
app:entryValues="@array/sort_order_values"
|
app:entryValues="@array/sort_order_values"
|
||||||
app:persistent="true"
|
app:persistent="true"
|
||||||
app:summary="%s" />
|
app:summary="%s" />
|
||||||
<androidx.preference.CheckBoxPreference
|
<CheckBoxPreference
|
||||||
|
app:defaultValue="true"
|
||||||
|
app:key="filter_recursively"
|
||||||
|
app:summary="@string/pref_recursive_filter_hint"
|
||||||
|
app:title="@string/pref_recursive_filter" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
app:defaultValue="false"
|
||||||
|
app:key="search_on_start"
|
||||||
|
app:summary="@string/pref_search_on_start_hint"
|
||||||
|
app:title="@string/pref_search_on_start" />
|
||||||
|
<CheckBoxPreference
|
||||||
app:title="@string/pref_show_hidden_title"
|
app:title="@string/pref_show_hidden_title"
|
||||||
app:summary="@string/pref_show_hidden_summary"
|
app:summary="@string/pref_show_hidden_summary"
|
||||||
app:key="show_hidden_folders"
|
app:key="show_hidden_folders"
|
||||||
app:defaultValue="false"
|
app:defaultValue="false"
|
||||||
app:persistent="true" />
|
app:persistent="true" />
|
||||||
<androidx.preference.SwitchPreferenceCompat
|
<CheckBoxPreference
|
||||||
app:key="biometric_auth"
|
app:key="biometric_auth"
|
||||||
app:title="@string/biometric_auth_title"
|
app:title="@string/biometric_auth_title"
|
||||||
app:summary="@string/biometric_auth_summary" />
|
app:summary="@string/biometric_auth_summary" />
|
||||||
</androidx.preference.PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory app:title="@string/pref_category_title_passwords">
|
||||||
|
<EditTextPreference
|
||||||
|
android:inputType="number"
|
||||||
|
app:defaultValue="45"
|
||||||
|
app:key="general_show_time"
|
||||||
|
app:summary="@string/pref_clipboard_timeout_summary"
|
||||||
|
app:title="@string/pref_clipboard_timeout_title" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
app:defaultValue="true"
|
||||||
|
app:title="@string/show_password_pref_title"
|
||||||
|
app:summary="@string/show_password_pref_summary"
|
||||||
|
app:key="show_password" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
app:defaultValue="true"
|
||||||
|
app:title="@string/show_extra_content_pref_title"
|
||||||
|
app:summary="@string/show_extra_content_pref_summary"
|
||||||
|
app:key="show_extra_content" />
|
||||||
|
<CheckBoxPreference
|
||||||
|
app:defaultValue="true"
|
||||||
|
app:dialogTitle="@string/pref_copy_dialog_title"
|
||||||
|
app:key="copy_on_decrypt"
|
||||||
|
app:summary="@string/pref_copy_dialog_title"
|
||||||
|
app:title="@string/pref_copy_title" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
<androidx.preference.PreferenceCategory app:title="@string/pref_misc_title">
|
<PreferenceCategory app:title="@string/pref_misc_title">
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:key="export_passwords"
|
app:key="export_passwords"
|
||||||
app:title="@string/prefs_export_passwords_title"
|
app:title="@string/prefs_export_passwords_title"
|
||||||
app:summary="@string/prefs_export_passwords_summary"/>
|
app:summary="@string/prefs_export_passwords_summary"/>
|
||||||
|
|
||||||
<androidx.preference.CheckBoxPreference
|
<CheckBoxPreference
|
||||||
app:defaultValue="false"
|
app:defaultValue="false"
|
||||||
app:key="clear_clipboard_20x"
|
app:key="clear_clipboard_20x"
|
||||||
app:summary="@string/pref_clear_clipboard_hint"
|
app:summary="@string/pref_clear_clipboard_hint"
|
||||||
app:title="@string/pref_clear_clipboard_title" />
|
app:title="@string/pref_clear_clipboard_title" />
|
||||||
</androidx.preference.PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<androidx.preference.PreferenceCategory>
|
<PreferenceCategory>
|
||||||
<androidx.preference.Preference
|
<Preference
|
||||||
app:icon="@mipmap/ic_launcher_round"
|
app:icon="@mipmap/ic_launcher_round"
|
||||||
app:key="app_version"
|
app:key="app_version"
|
||||||
app:title="@string/prefs_version" />
|
app:title="@string/prefs_version" />
|
||||||
</androidx.preference.PreferenceCategory>
|
</PreferenceCategory>
|
||||||
</androidx.preference.PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|
Loading…
Reference in a new issue