Merge branch 'release/3.3.1'

This commit is contained in:
J-Jamet
2022-02-26 18:16:59 +01:00
24 changed files with 136 additions and 42 deletions

View File

@@ -1,3 +1,11 @@
KeePassDX(3.3.1)
* Fix Japanese keyboard in search #1248
* Better OOM management #256
* Fix filters #1249
* Fix temp advanced unlocking #1245
* Best autofill recognition #1250
* Workaround to fill OTP token in multiple fields with Magikeyboard (long press) #1158
KeePassDX(3.3.0)
* Quick search and dynamic filters #163 #462 #521
* Keep search context #1141

View File

@@ -12,8 +12,8 @@ android {
applicationId "com.kunzisoft.keepass"
minSdkVersion 15
targetSdkVersion 31
versionCode = 102
versionName = "3.3.0"
versionCode = 103
versionName = "3.3.1"
multiDexEnabled true
testApplicationId = "com.kunzisoft.keepass.tests"
@@ -104,7 +104,7 @@ android {
}
}
def room_version = "2.4.1"
def room_version = "2.4.2"
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"

View File

@@ -130,8 +130,9 @@ class CipherDatabaseAction(context: Context) {
cipherDatabaseResultListener: (CipherEncryptDatabase?) -> Unit) {
if (useTempDao) {
serviceActionTask {
var cipherDatabase: CipherEncryptDatabase? = null
mBinder?.getCipherDatabase(databaseUri)?.let { cipherDatabaseEntity ->
val cipherDatabase = CipherEncryptDatabase().apply {
cipherDatabase = CipherEncryptDatabase().apply {
this.databaseUri = Uri.parse(cipherDatabaseEntity.databaseUri)
this.encryptedValue = Base64.decode(
cipherDatabaseEntity.encryptedValue,
@@ -142,8 +143,8 @@ class CipherDatabaseAction(context: Context) {
Base64.NO_WRAP
)
}
cipherDatabaseResultListener.invoke(cipherDatabase)
}
cipherDatabaseResultListener.invoke(cipherDatabase)
}
} else {
IOActionTask(

View File

@@ -377,10 +377,12 @@ class StructureParser(private val structure: AssistStructure) {
when {
inputIsVariationType(inputType,
InputType.TYPE_NUMBER_VARIATION_NORMAL) -> {
if (usernameIdCandidate == null) {
usernameIdCandidate = autofillId
usernameValueCandidate = node.autofillValue
Log.d(TAG, "Autofill username candidate android number type: ${showHexInputType(inputType)}")
}
}
inputIsVariationType(inputType,
InputType.TYPE_NUMBER_VARIATION_PASSWORD) -> {
result?.passwordId = autofillId

View File

@@ -180,12 +180,16 @@ abstract class BinaryData : Parcelable {
companion object {
private val TAG = BinaryData::class.java.name
private const val MAX_BINARY_BYTE = 10485760 // 10 MB
fun canMemoryBeAllocatedInRAM(context: Context, memoryWanted: Long): Boolean {
if (memoryWanted > MAX_BINARY_BYTE)
return false
val memoryInfo = ActivityManager.MemoryInfo()
(context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).getMemoryInfo(memoryInfo)
(context.getSystemService(Context.ACTIVITY_SERVICE)
as? ActivityManager?)?.getMemoryInfo(memoryInfo)
val availableMemory = memoryInfo.availMem
return availableMemory > memoryWanted * 3
return availableMemory > (memoryWanted * 5)
}
}

View File

@@ -18,6 +18,8 @@ package com.kunzisoft.keepass.magikeyboard;
import static com.kunzisoft.keepass.magikeyboard.MagikeyboardService.KEY_BACK_KEYBOARD;
import static com.kunzisoft.keepass.magikeyboard.MagikeyboardService.KEY_CHANGE_KEYBOARD;
import static com.kunzisoft.keepass.magikeyboard.MagikeyboardService.KEY_OTP;
import static com.kunzisoft.keepass.magikeyboard.MagikeyboardService.KEY_OTP_ALT;
import android.content.Context;
import android.content.res.TypedArray;
@@ -1047,6 +1049,9 @@ public class KeyboardView extends View implements View.OnClickListener {
if (popupKey.codes[0] == KEY_BACK_KEYBOARD) {
mKeyboardActionListener.onKey(KEY_CHANGE_KEYBOARD, popupKey.codes);
return true;
} else if (popupKey.codes[0] == KEY_OTP) {
mKeyboardActionListener.onKey(KEY_OTP_ALT, popupKey.codes);
return true;
} else {
int popupKeyboardId = popupKey.popupResId;
if (popupKeyboardId != 0) {

View File

@@ -245,35 +245,52 @@ class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionL
dismissCustomKeys()
}
KEY_USERNAME -> {
if (entryInfoKey != null) {
currentInputConnection.commitText(entryInfoKey!!.username, 1)
entryInfoKey?.username?.let { username ->
currentInputConnection.commitText(username, 1)
}
actionTabAutomatically()
}
KEY_PASSWORD -> {
if (entryInfoKey != null) {
currentInputConnection.commitText(entryInfoKey!!.password, 1)
entryInfoKey?.password?.let { password ->
currentInputConnection.commitText(password, 1)
}
val otpFieldExists = entryInfoKey?.containsCustomField(OTP_TOKEN_FIELD) ?: false
actionGoAutomatically(!otpFieldExists)
}
KEY_OTP -> {
if (entryInfoKey != null) {
entryInfoKey?.let { entryInfo ->
currentInputConnection.commitText(
entryInfoKey!!.getGeneratedFieldValue(OTP_TOKEN_FIELD), 1)
entryInfo.getGeneratedFieldValue(OTP_TOKEN_FIELD), 1)
}
actionGoAutomatically()
}
KEY_OTP_ALT -> {
entryInfoKey?.let { entryInfo ->
val otpToken = entryInfo.getGeneratedFieldValue(OTP_TOKEN_FIELD)
if (otpToken.isNotEmpty()) {
// Cut to fill each digit separatelyKeyEvent.KEYCODE_TAB
val otpTokenChars = otpToken.chunked(1)
otpTokenChars.forEachIndexed { index, char ->
currentInputConnection.commitText(char, 1)
if (index < (otpTokenChars.size-1))
currentInputConnection.sendKeyEvent(
KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_TAB)
)
}
}
}
actionGoAutomatically()
}
KEY_URL -> {
if (entryInfoKey != null) {
currentInputConnection.commitText(entryInfoKey!!.url, 1)
entryInfoKey?.url?.let { url ->
currentInputConnection.commitText(url, 1)
}
actionGoAutomatically()
}
KEY_FIELDS -> {
if (entryInfoKey != null) {
entryInfoKey?.customFields?.let { customFields ->
fieldsAdapter?.apply {
setFields(entryInfoKey!!.customFields.filter { it.name != OTP_TOKEN_FIELD})
setFields(customFields.filter { it.name != OTP_TOKEN_FIELD})
notifyDataSetChanged()
}
}
@@ -347,7 +364,8 @@ class MagikeyboardService : InputMethodService(), KeyboardView.OnKeyboardActionL
private const val KEY_ENTRY = 620
private const val KEY_USERNAME = 500
private const val KEY_PASSWORD = 510
private const val KEY_OTP = 515
const val KEY_OTP = 515
const val KEY_OTP_ALT = 516
private const val KEY_URL = 520
private const val KEY_FIELDS = 530

View File

@@ -141,7 +141,7 @@
android:layout_height="wrap_content"
android:checked="false"
style="@style/KeepassDXStyle.Chip.Filter"
android:text="@string/entry_expires" />
android:text="@string/expired" />
<com.google.android.material.chip.Chip
android:id="@+id/search_chip_note"
android:layout_width="wrap_content"
@@ -154,7 +154,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:enabled="false"
style="@style/KeepassDXStyle.Chip.Filter"
android:text="@string/other"/>
<com.google.android.material.chip.Chip

View File

@@ -328,7 +328,7 @@
<string name="error_move_entry_here">Sem záznam přesunout nelze.</string>
<string name="error_copy_entry_here">Sem záznam zkopírovat nelze.</string>
<string name="list_groups_show_number_entries_title">Ukázat počet záznamů</string>
<string name="list_groups_show_number_entries_summary">Ukázat počet záznamů ve skupině</string>
<string name="list_groups_show_number_entries_summary">Zobrazit počet záznamů ve skupině</string>
<string name="content_description_background">Pozadí</string>
<string name="content_description_update_from_list">Aktualizovat</string>
<string name="content_description_keyboard_close_fields">Zavřít pole</string>
@@ -601,4 +601,18 @@
<string name="hint_icon_name">Jméno symbolu</string>
<string name="warning_exact_alarm">Nepovolili jste aplikaci použít přesný alarm. Výsledkem je, že funkce požadující časovač nebudou provedeny v přesný okamžik.</string>
<string name="permission">Povolení</string>
<string name="tags">Tagy</string>
<string name="menu_merge_database">Sloučit databázi</string>
<string name="warning_database_info_reloaded">Opětovné načtení databáze smaže všechny lokálně změněné data.</string>
<string name="warning_keyfile_integrity">Hash souboru není garantován protože Android umožňuje změnu souboru v běhu. Změňte koncovku souboru na .bin pro opravu integrity.</string>
<string name="enable_keep_screen_on_title">Ponechat obrazovku zapnutou</string>
<string name="content_description_database_color">Barva databáze</string>
<string name="wireless">Wi-Fi</string>
<string name="searchable">Vyhledatelné</string>
<string name="case_sensitive">Rozlišování velkých a malých písmen</string>
<string name="current_group">Tato skupina</string>
<string name="menu_merge_from">Sloučit z …</string>
<string name="custom_data">Vlastní data</string>
<string name="search_filters">Vyhledat filtry</string>
<string name="menu_save_copy_to">Uložit kopii do …</string>
</resources>

View File

@@ -635,4 +635,7 @@
<string name="case_sensitive">Groß-/Kleinschreibung beachten</string>
<string name="menu_merge_from">Zusammenführen von …</string>
<string name="menu_save_copy_to">Kopie speichern unter …</string>
<string name="content_description_nav_header">Navigationskopfzeile</string>
<string name="navigation_drawer_close">Navigationsleiste schließen</string>
<string name="navigation_drawer_open">Navigationsleiste öffnen</string>
</resources>

View File

@@ -615,7 +615,7 @@
<string name="searchable">Αναζητήσιμο</string>
<string name="case_sensitive">Διάκριση πεζών-κεφαλαίων</string>
<string name="menu_merge_from">Συγχώνευση από …</string>
<string name="inherited">Κληρονόμησε</string>
<string name="inherited">Κληρονομώ</string>
<string name="search_filters">Αναζήτηση φίλτρων</string>
<string name="content_description_nav_header">Κεφαλίδα πλοήγησης</string>
<string name="navigation_drawer_close">Κλείσιμο συρταριού πλοήγησης</string>

View File

@@ -498,7 +498,7 @@
<string name="autofill_web_domain_blocklist_title">Lista de bloqueo de los dominios web</string>
<string name="autofill_application_id_blocklist_summary">Lista de bloqueo que impide el llenado automático de las aplicaciones</string>
<string name="autofill_application_id_blocklist_title">Lista de bloqueo de las aplicaciones</string>
<string name="autofill_ask_to_save_data_summary">Pedir que se guarden los datos cuando se valide un formulario</string>
<string name="autofill_ask_to_save_data_summary">Solicitar datos de guardado al completar el llenado de un formulario</string>
<string name="autofill_ask_to_save_data_title">Pedir que se guarden los datos</string>
<string name="autofill_save_search_info_summary">Intente guardar la información de la búsqueda cuando haga una selección de entrada manual</string>
<string name="autofill_save_search_info_title">Guardar la información de la búsqueda</string>
@@ -626,5 +626,5 @@
<string name="search_filters">Filtros de búsqueda</string>
<string name="menu_merge_from">Fusionar desde …</string>
<string name="menu_save_copy_to">Guardar una copia en …</string>
<string name="inherited">Heredado</string>
<string name="inherited">Heredar</string>
</resources>

View File

@@ -282,12 +282,12 @@
<string name="allow_no_password_summary">Autorise lappui du bouton \"Ouvrir\" si aucun identifiant nest sélectionné</string>
<string name="menu_file_selection_read_only">Protéger en écriture</string>
<string name="menu_open_file_read_and_write">Modifiable</string>
<string name="enable_read_only_title">Protégé en écriture</string>
<string name="enable_read_only_title">Protéger en écriture</string>
<string name="enable_read_only_summary">Ouvre la base de données en lecture seule par défaut</string>
<string name="education_read_only_title">Protégez en écriture votre base de données</string>
<string name="education_read_only_summary">Changez le mode douverture pour la session.
\n
\n\"Protégé en écriture\" empêche les modifications involontaires de la base de données.
\n\"Protéger en écriture\" empêche les modifications involontaires de la base de données.
\n\"Modifiable\" vous permet dajouter, de supprimer ou de modifier tous les éléments comme vous le souhaitez.</string>
<string name="edit_entry">Modifier lentrée</string>
<string name="error_load_database">Impossible de charger votre base de données.</string>
@@ -631,8 +631,9 @@
<string name="menu_merge_from">Fusionner depuis …</string>
<string name="wireless">Wi-Fi</string>
<string name="searchable">Recherchable</string>
<string name="inherited">Hérité</string>
<string name="inherited">Hériter</string>
<string name="auto_type_sequence">Séquence Auto-Type</string>
<string name="custom_data">Données personnalisées</string>
<string name="case_sensitive">Sensible à la casse</string>
<string name="expired">Expiré</string>
</resources>

View File

@@ -617,7 +617,7 @@
<string name="navigation_drawer_close">Szuflada nawigacyjna zamknięta</string>
<string name="case_sensitive">Wielkość liter</string>
<string name="regex">Wyrażenie regularne</string>
<string name="inherited">Dziedziczone</string>
<string name="inherited">Dziedzicz</string>
<string name="auto_type_sequence">Sekwencja automatycznego wpisywania</string>
<string name="current_group">Obecna grupa</string>
<string name="custom_data">Dane niestandardowe</string>
@@ -626,4 +626,5 @@
<string name="auto_type">Automatyczne wpisywanie</string>
<string name="searchable">Przeszukiwalne</string>
<string name="menu_save_copy_to">Zapisz kopię w…</string>
<string name="expired">Wygasłe</string>
</resources>

View File

@@ -612,4 +612,12 @@
<string name="error_move_group_here">Você não pode mover um grupo aqui.</string>
<string name="wireless">Wi-Fi</string>
<string name="warning_keyfile_integrity">O hash do arquivo não é garantido porque o Android pode alterar seus dados em tempo real. Altere a extensão do arquivo para .bin para obter a integridade correta.</string>
<string name="content_description_nav_header">Cabeçalho de navegação</string>
<string name="navigation_drawer_open">Gaveta de navegação aberta</string>
<string name="searchable">Pesquisável</string>
<string name="inherited">Herdar</string>
<string name="custom_data">Dados personalizados</string>
<string name="menu_merge_from">Mesclar de…</string>
<string name="menu_save_copy_to">Salvar uma cópia em…</string>
<string name="navigation_drawer_close">Gaveta de navegação fechada</string>
</resources>

View File

@@ -495,7 +495,7 @@
<string name="education_advanced_unlock_title">Desbloqueio avançado da base de dados</string>
<string name="autofill_inline_suggestions_keyboard">Adicionadas sugestões de preenchimento automático.</string>
<string name="autofill_read_only_save">Não é possível guardar dados numa base de dados aberta apenas com permissão de leitura.</string>
<string name="autofill_ask_to_save_data_summary">Pedir para guardar dados quando é validado um formulário</string>
<string name="autofill_ask_to_save_data_summary">Pedir para guardar dados quando terminar de preencher um formulário</string>
<string name="autofill_ask_to_save_data_title">Pedir para guardar dados</string>
<string name="autofill_save_search_info_summary">Tentar guardar as informações de pesquisas ao fazer uma seleção de entrada manual</string>
<string name="autofill_save_search_info_title">Guardar informações de pesquisas</string>
@@ -590,4 +590,17 @@
<string name="content_description_database_color">Cor da base de dados</string>
<string name="content_description_entry_foreground_color">Cor do primeiro plano da página inicial</string>
<string name="content_description_entry_background_color">Cor do fundo da página inicial</string>
<string name="content_description_nav_header">Cabeçalho de navegação</string>
<string name="searchable">Pesquisável</string>
<string name="auto_type_sequence">Sequência de preenchimento automático</string>
<string name="custom_data">Dados personalizados</string>
<string name="search_filters">Filtros de pesquisa</string>
<string name="current_group">Grupo atual</string>
<string name="case_sensitive">Sensível a maiúsculas e minúsculas</string>
<string name="regex">Expressão regular</string>
<string name="menu_save_copy_to">Guardar uma cópia em…</string>
<string name="navigation_drawer_open">Gaveta de navegação aberta</string>
<string name="navigation_drawer_close">Gaveta de navegação fechada</string>
<string name="inherited">Herdar</string>
<string name="menu_merge_from">Unir de…</string>
</resources>

View File

@@ -50,7 +50,7 @@
<string name="entry_notes">Заметки</string>
<string name="entry_confpassword">Подтверждение пароля</string>
<string name="entry_created">Создано</string>
<string name="entry_expires">Истекает</string>
<string name="entry_expires">Срок действия</string>
<string name="entry_keyfile">Файл ключа</string>
<string name="entry_modified">Изменено</string>
<string name="entry_not_found">Данные записи не найдены.</string>
@@ -406,7 +406,7 @@
<string name="download_finalization">Завершение…</string>
<string name="download_complete">Готово!</string>
<string name="hide_expired_entries_title">Скрывать устаревшие записи</string>
<string name="hide_expired_entries_summary">Не показывать записи с истёкшим сроком</string>
<string name="hide_expired_entries_summary">Не показывать записи с истёкшим сроком действия</string>
<string name="contact">Контактная информация</string>
<string name="contribution">Помощь проекту</string>
<string name="html_about_contribution">Для <strong>сохранения нашей независимости</strong>, <strong>исправления ошибок</strong>, <strong>добавления новых функций</strong> и <strong>поддержания разработки в активном состоянии</strong>, мы рассчитываем на вашу <strong>поддержку</strong>.</string>
@@ -614,8 +614,8 @@
<string name="show_entry_colors_summary">Показывать цвета текста и фона записи</string>
<string name="navigation_drawer_open">Открыть панель навигации</string>
<string name="content_description_nav_header">Заголовок навигации</string>
<string name="searchable">Искомое</string>
<string name="inherited">Наследуемое</string>
<string name="searchable">Доступно для поиска</string>
<string name="inherited">Наследовать</string>
<string name="case_sensitive">С учётом регистра</string>
<string name="menu_save_copy_to">Сохранить копию в…</string>
<string name="menu_merge_from">Объединить с…</string>
@@ -625,4 +625,5 @@
<string name="auto_type_sequence">Последовательность автонабора</string>
<string name="current_group">Текущая группа</string>
<string name="custom_data">Пользовательские данные</string>
<string name="expired">Срок действия истёк</string>
</resources>

View File

@@ -399,8 +399,8 @@
<string name="download_progression">Devam ediyor: %1$d%%</string>
<string name="download_finalization">Sonuçlandırılıyor…</string>
<string name="download_complete">Tamamlandı!</string>
<string name="hide_expired_entries_title">Süresi dolmuş girdileri gizle</string>
<string name="hide_expired_entries_summary">Süresi dolmuş girdiler gösterilmez</string>
<string name="hide_expired_entries_title">Süresi dolan girdileri gizle</string>
<string name="hide_expired_entries_summary">Süresi dolan girdiler gösterilmez</string>
<string name="warning_database_read_only">Veri tabanı değişikliklerini kaydetmek için dosya yazma erişimi ver</string>
<string name="hide_broken_locations_summary">Son veri tabanları listesindeki bozuk bağlantıları gizle</string>
<string name="hide_broken_locations_title">Bozuk veri tabanı bağlantılarını gizle</string>
@@ -611,7 +611,7 @@
<string name="navigation_drawer_open">Gezinme çekmecesi açık</string>
<string name="navigation_drawer_close">Gezinme çekmecesi kapalı</string>
<string name="searchable">Aranabilir</string>
<string name="inherited">Devralınan</string>
<string name="inherited">Aktar</string>
<string name="auto_type_sequence">Otomatik yazma sırası</string>
<string name="menu_merge_from">Şuradan birleştir…</string>
<string name="regex">Düzenli ifade</string>
@@ -620,4 +620,5 @@
<string name="current_group">Geçerli grup</string>
<string name="custom_data">Özel veri</string>
<string name="menu_save_copy_to">Bir kopyasını şuraya kaydet…</string>
<string name="expired">Süresi doldu</string>
</resources>

View File

@@ -616,7 +616,7 @@
<string name="navigation_drawer_open">Відкрити панель навігації</string>
<string name="navigation_drawer_close">Закрити панель навігації</string>
<string name="searchable">Шукане</string>
<string name="inherited">Успадковане</string>
<string name="inherited">Успадкувати</string>
<string name="current_group">Поточна група</string>
<string name="case_sensitive">З урахуванням регістру</string>
<string name="regex">Регулярний вираз</string>
@@ -625,4 +625,5 @@
<string name="search_filters">Фільтри пошуку</string>
<string name="auto_type_sequence">Послідовність автовведення</string>
<string name="menu_save_copy_to">Зберегти копію в …</string>
<string name="expired">Термін дії завершився</string>
</resources>

View File

@@ -619,11 +619,12 @@
<string name="regex">正则表达式</string>
<string name="menu_merge_from">合并自…</string>
<string name="menu_save_copy_to">保存副本到…</string>
<string name="inherited">继承</string>
<string name="inherited">继承</string>
<string name="content_description_nav_header">导航标题</string>
<string name="navigation_drawer_close">导航抽屉关闭</string>
<string name="navigation_drawer_open">导航抽屉开启</string>
<string name="search_filters">搜索过滤器</string>
<string name="case_sensitive">区分大小写</string>
<string name="auto_type">自动输入</string>
<string name="expired">已过期</string>
</resources>

View File

@@ -90,6 +90,7 @@
<string name="entry_confpassword">Confirm password</string>
<string name="entry_created">Created</string>
<string name="entry_expires">Expires</string>
<string name="expired">Expired</string>
<string name="entry_UUID">UUID</string>
<string name="entry_history">History</string>
<string name="entry_attachments">Attachments</string>

View File

@@ -20,6 +20,6 @@
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search"
android:searchMode="showSearchLabelAsBadge"
android:inputType="textNoSuggestions|textVisiblePassword"
android:inputType="textNoSuggestions"
android:imeOptions="actionSearch|flagNoPersonalizedLearning"
/>

View File

@@ -0,0 +1,6 @@
* Fix Japanese keyboard in search #1248
* Better OOM management #256
* Fix filters #1249
* Fix temp advanced unlocking #1245
* Best autofill recognition #1250
* Workaround to fill OTP token in multiple fields with Magikeyboard (long press) #1158

View File

@@ -0,0 +1,6 @@
* Correction du clavier japonais dans la recherche #1248
* Meilleur gestion d'OOM #256
* Correction des filtres #1249
* Correction du déverouillage avancé temporaire #1245
* Meilleure reconnaissance du remplissage automatique #1250
* Solution pour remplir le token OTP dans des champs multiple avec le Magiclavier (appui long) #1158