still adjust multilingual typing confidences on slow input connections

This commit is contained in:
Helium314 2023-12-20 09:00:43 +01:00
parent 8d3a32bcb2
commit 228f859cbd
3 changed files with 34 additions and 21 deletions

View file

@ -149,6 +149,8 @@ public interface DictionaryFacilitator {
@NonNull final NgramContext ngramContext, final long timeStampInSeconds, @NonNull final NgramContext ngramContext, final long timeStampInSeconds,
final boolean blockPotentiallyOffensive); final boolean blockPotentiallyOffensive);
void adjustConfidences(final String word, final boolean wasAutoCapitalized);
void unlearnFromUserHistory(final String word, void unlearnFromUserHistory(final String word,
@NonNull final NgramContext ngramContext, final long timeStampInSeconds, @NonNull final NgramContext ngramContext, final long timeStampInSeconds,
final int eventType); final int eventType);

View file

@ -610,21 +610,7 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
// increase / decrease confidence if we have more than one dictionary group // increase / decrease confidence if we have more than one dictionary group
boolean[] validWordForDictionary; // store results to avoid unnecessary duplicate lookups boolean[] validWordForDictionary; // store results to avoid unnecessary duplicate lookups
if (mDictionaryGroups.size() > 1 && words.length == 1) { // ignore if more than a single word, this only happens with (badly working) spaceAwareGesture if (mDictionaryGroups.size() > 1 && words.length == 1) { // ignore if more than a single word, this only happens with (badly working) spaceAwareGesture
validWordForDictionary = new boolean[mDictionaryGroups.size()]; validWordForDictionary = adjustConfidencesInternal(suggestion, wasAutoCapitalized);
// if suggestion was auto-capitalized, check against both the suggestion and the de-capitalized suggestion
final String decapitalizedSuggestion;
if (wasAutoCapitalized)
decapitalizedSuggestion = suggestion.substring(0, 1).toLowerCase() + suggestion.substring(1);
else
decapitalizedSuggestion = suggestion;
for (int i = 0; i < mDictionaryGroups.size(); i ++) {
final DictionaryGroup dictionaryGroup = mDictionaryGroups.get(i);
final boolean isValidWord = isValidWord(suggestion, ALL_DICTIONARY_TYPES, dictionaryGroup);
if (isValidWord || (wasAutoCapitalized && isValidWord(decapitalizedSuggestion, ALL_DICTIONARY_TYPES, dictionaryGroup)))
dictionaryGroup.increaseConfidence();
else dictionaryGroup.decreaseConfidence();
validWordForDictionary[i] = isValidWord;
}
} else } else
validWordForDictionary = null; validWordForDictionary = null;
@ -656,6 +642,30 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
} }
} }
@Override public void adjustConfidences(final String word, final boolean wasAutoCapitalized) {
if (mDictionaryGroups.size() > 1 && !word.contains(Constants.WORD_SEPARATOR))
adjustConfidencesInternal(word, wasAutoCapitalized);
}
private boolean[] adjustConfidencesInternal(final String word, final boolean wasAutoCapitalized) {
final boolean[] validWordForDictionary = new boolean[mDictionaryGroups.size()];
// if suggestion was auto-capitalized, check against both the suggestion and the de-capitalized suggestion
final String decapitalizedSuggestion;
if (wasAutoCapitalized)
decapitalizedSuggestion = word.substring(0, 1).toLowerCase() + word.substring(1);
else
decapitalizedSuggestion = word;
for (int i = 0; i < mDictionaryGroups.size(); i ++) {
final DictionaryGroup dictionaryGroup = mDictionaryGroups.get(i);
final boolean isValidWord = isValidWord(word, ALL_DICTIONARY_TYPES, dictionaryGroup);
if (isValidWord || (wasAutoCapitalized && isValidWord(decapitalizedSuggestion, ALL_DICTIONARY_TYPES, dictionaryGroup)))
dictionaryGroup.increaseConfidence();
else dictionaryGroup.decreaseConfidence();
validWordForDictionary[i] = isValidWord;
}
return validWordForDictionary;
}
// main and secondary isValid provided to avoid duplicate lookups // main and secondary isValid provided to avoid duplicate lookups
private void addToPersonalDictionaryIfInvalidButInHistory(String suggestion, boolean[] validWordForDictionary) { private void addToPersonalDictionaryIfInvalidButInHistory(String suggestion, boolean[] validWordForDictionary) {
final DictionaryGroup dictionaryGroup = getClearlyPreferredDictionaryGroupOrNull(); final DictionaryGroup dictionaryGroup = getClearlyPreferredDictionaryGroupOrNull();

View file

@ -1535,20 +1535,21 @@ public final class InputLogic {
// That's to avoid unintended additions in some sensitive fields, or fields that // That's to avoid unintended additions in some sensitive fields, or fields that
// expect to receive non-words. // expect to receive non-words.
// mInputTypeNoAutoCorrect changed to !mShouldShowSuggestions because this was cancelling learning way too often // mInputTypeNoAutoCorrect changed to !mShouldShowSuggestions because this was cancelling learning way too often
if (!settingsValues.mInputAttributes.mShouldShowSuggestions || settingsValues.mIncognitoModeEnabled) if (!settingsValues.mInputAttributes.mShouldShowSuggestions || settingsValues.mIncognitoModeEnabled || TextUtils.isEmpty(suggestion))
return; return;
final boolean wasAutoCapitalized = mWordComposer.wasAutoCapitalized() && !mWordComposer.isMostlyCaps();
final String word = stripWordSeparatorsFromEnd(suggestion, settingsValues);
if (mConnection.hasSlowInputConnection()) { if (mConnection.hasSlowInputConnection()) {
// Since we don't unlearn when the user backspaces on a slow InputConnection, // Since we don't unlearn when the user backspaces on a slow InputConnection,
// turn off learning to guard against adding typos that the user later deletes. // turn off learning to guard against adding typos that the user later deletes.
Log.w(TAG, "Skipping learning due to slow InputConnection."); Log.w(TAG, "Skipping learning due to slow InputConnection.");
// but we still want to adjust confidences for multilingual typing
mDictionaryFacilitator.adjustConfidences(word, wasAutoCapitalized);
return; return;
} }
if (TextUtils.isEmpty(suggestion)) return;
final boolean wasAutoCapitalized = mWordComposer.wasAutoCapitalized() && !mWordComposer.isMostlyCaps();
final int timeStampInSeconds = (int)TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()); final int timeStampInSeconds = (int)TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
mDictionaryFacilitator.addToUserHistory(stripWordSeparatorsFromEnd(suggestion, settingsValues), wasAutoCapitalized, mDictionaryFacilitator.addToUserHistory(word, wasAutoCapitalized, ngramContext,
ngramContext, timeStampInSeconds, settingsValues.mBlockPotentiallyOffensive); timeStampInSeconds, settingsValues.mBlockPotentiallyOffensive);
} }
// strip word separators from end (may be necessary for urls, e.g. when the user has typed // strip word separators from end (may be necessary for urls, e.g. when the user has typed