From be0da57b0050b06aa5ab9e9dc885a692e2f11faf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= Date: Tue, 4 Aug 2026 16:20:57 +0200 Subject: [PATCH 1/2] Allow reusing imeSpecs Fixes #1015 This is documented as Android's intended API contract in https://developer.android.com/reference/kotlin/android/view/inputmethod/InlineSuggestionsRequest?hl=en#getinlinepresentationspecs: > If the max suggestion count is larger than > the number of specs in the list, then > the last spec is used for the remainder > of the suggestions. --- .../util/autofill/Api30AutofillResponseBuilder.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/passwordstore/util/autofill/Api30AutofillResponseBuilder.kt b/app/src/main/java/app/passwordstore/util/autofill/Api30AutofillResponseBuilder.kt index c106ec344e..b8b1cb20c8 100644 --- a/app/src/main/java/app/passwordstore/util/autofill/Api30AutofillResponseBuilder.kt +++ b/app/src/main/java/app/passwordstore/util/autofill/Api30AutofillResponseBuilder.kt @@ -184,19 +184,28 @@ class Api30AutofillResponseBuilder private constructor(form: FillableForm) : matchedFiles: List, ): FillResponse? { var datasetCount = 0 + val maxSuggestions = inlineSuggestionsRequest?.maxSuggestionCount + ?: InlineSuggestionsRequest.SUGGESTION_COUNT_UNLIMITED val imeSpecs = inlineSuggestionsRequest?.inlinePresentationSpecs ?: emptyList() + fun nextImeSpec(): InlinePresentationSpec? = + when { + datasetCount < maxSuggestions -> + imeSpecs.getOrNull(datasetCount) ?: imeSpecs.lastOrNull() + + else -> null + } return FillResponse.Builder().run { for (file in matchedFiles) { - makeMatchDataset(context, file, imeSpecs.getOrNull(datasetCount))?.let { + makeMatchDataset(context, file, nextImeSpec())?.let { datasetCount++ addDataset(it) } } - makeGenerateDataset(context, imeSpecs.getOrNull(datasetCount))?.let { + makeGenerateDataset(context, nextImeSpec())?.let { datasetCount++ addDataset(it) } - makeSearchDataset(context, imeSpecs.getOrNull(datasetCount))?.let { + makeSearchDataset(context, nextImeSpec())?.let { datasetCount++ addDataset(it) } From 468d653e0986b4f52a58451a853c6a3b5809d054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalie=20Klestrup=20R=C3=B6ijezon?= Date: Tue, 4 Aug 2026 17:43:34 +0200 Subject: [PATCH 2/2] Fix formatting via Spotless --- .../util/autofill/Api30AutofillResponseBuilder.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/passwordstore/util/autofill/Api30AutofillResponseBuilder.kt b/app/src/main/java/app/passwordstore/util/autofill/Api30AutofillResponseBuilder.kt index b8b1cb20c8..2d9cec39e9 100644 --- a/app/src/main/java/app/passwordstore/util/autofill/Api30AutofillResponseBuilder.kt +++ b/app/src/main/java/app/passwordstore/util/autofill/Api30AutofillResponseBuilder.kt @@ -184,14 +184,13 @@ class Api30AutofillResponseBuilder private constructor(form: FillableForm) : matchedFiles: List, ): FillResponse? { var datasetCount = 0 - val maxSuggestions = inlineSuggestionsRequest?.maxSuggestionCount - ?: InlineSuggestionsRequest.SUGGESTION_COUNT_UNLIMITED + val maxSuggestions = + inlineSuggestionsRequest?.maxSuggestionCount + ?: InlineSuggestionsRequest.SUGGESTION_COUNT_UNLIMITED val imeSpecs = inlineSuggestionsRequest?.inlinePresentationSpecs ?: emptyList() fun nextImeSpec(): InlinePresentationSpec? = when { - datasetCount < maxSuggestions -> - imeSpecs.getOrNull(datasetCount) ?: imeSpecs.lastOrNull() - + datasetCount < maxSuggestions -> imeSpecs.getOrNull(datasetCount) ?: imeSpecs.lastOrNull() else -> null } return FillResponse.Builder().run {