Fix revert of committed words

Now that separators are put into their own LogUnits, they must be handled
when going through a revert.

Bug: 9088919

Change-Id: Ibebd0752bb2fa38d74ac96001d63070dd419cee3
main
Kurt Partridge 2013-05-31 22:08:38 -07:00
parent a0c3e02d71
commit 94ef54321e
1 changed files with 33 additions and 13 deletions

View File

@ -83,6 +83,8 @@ import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.regex.Pattern; import java.util.regex.Pattern;
// TODO: Add a unit test for every "logging" method (i.e. that is called from the IME and calls
// enqueueEvent to record a LogStatement).
/** /**
* Logs the use of the LatinIME keyboard. * Logs the use of the LatinIME keyboard.
* *
@ -1450,21 +1452,39 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang
public static void latinIME_revertCommit(final String committedWord, public static void latinIME_revertCommit(final String committedWord,
final String originallyTypedWord, final boolean isBatchMode, final String originallyTypedWord, final boolean isBatchMode,
final String separatorString) { final String separatorString) {
// TODO: Prioritize adding a unit test for this method (as it is especially complex)
// TODO: Update the UserRecording LogBuffer as well as the MainLogBuffer
final ResearchLogger researchLogger = getInstance(); final ResearchLogger researchLogger = getInstance();
// TODO: Verify that mCurrentLogUnit has been restored and contains the reverted word. //
final LogUnit logUnit; // 1. Remove separator LogUnit
logUnit = researchLogger.mMainLogBuffer.peekLastLogUnit(); final LogUnit lastLogUnit = researchLogger.mMainLogBuffer.peekLastLogUnit();
if (originallyTypedWord.length() > 0 && hasLetters(originallyTypedWord)) { // Check that we're not at the beginning of input
if (logUnit != null) { if (lastLogUnit == null) return;
logUnit.setWords(originallyTypedWord); // Check that we're after a separator
} if (lastLogUnit.getWordsAsString() != null) return;
} // Remove separator
researchLogger.enqueueEvent(logUnit != null ? logUnit : researchLogger.mCurrentLogUnit, final LogUnit separatorLogUnit = researchLogger.mMainLogBuffer.unshiftIn();
LOGSTATEMENT_LATINIME_REVERTCOMMIT, committedWord, originallyTypedWord,
separatorString); // 2. Add revert LogStatement
if (logUnit != null) { final LogUnit revertedLogUnit = researchLogger.mMainLogBuffer.peekLastLogUnit();
logUnit.setContainsUserDeletions(); if (revertedLogUnit == null) return;
if (!revertedLogUnit.getWordsAsString().equals(scrubDigitsFromString(committedWord))) {
// Any word associated with the reverted LogUnit has already had its digits scrubbed, so
// any digits in the committedWord argument must also be scrubbed for an accurate
// comparison.
return;
} }
researchLogger.enqueueEvent(revertedLogUnit, LOGSTATEMENT_LATINIME_REVERTCOMMIT,
committedWord, originallyTypedWord, separatorString);
// 3. Update the word associated with the LogUnit
revertedLogUnit.setWords(originallyTypedWord);
revertedLogUnit.setContainsUserDeletions();
// 4. Re-add the separator LogUnit
researchLogger.mMainLogBuffer.shiftIn(separatorLogUnit);
// 5. Record stats
researchLogger.mStatistics.recordRevertCommit(SystemClock.uptimeMillis()); researchLogger.mStatistics.recordRevertCommit(SystemClock.uptimeMillis());
} }