Loading java/src/com/android/inputmethod/latin/personalization/DynamicPersonalizationDictionaryWriter.java +24 −7 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.inputmethod.latin.personalization; import android.content.Context; import android.content.Context; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.compat.ActivityManagerCompatUtils; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.AbstractDictionaryWriter; import com.android.inputmethod.latin.AbstractDictionaryWriter; import com.android.inputmethod.latin.ExpandableDictionary; import com.android.inputmethod.latin.ExpandableDictionary; Loading @@ -41,7 +42,8 @@ import java.util.ArrayList; public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter { public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter { private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName(); private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName(); /** Maximum number of pairs. Pruning will start when databases goes above this number. */ /** Maximum number of pairs. Pruning will start when databases goes above this number. */ public static final int MAX_HISTORY_BIGRAMS = 10000; public static final int DEFAULT_MAX_HISTORY_BIGRAMS = 10000; public static final int LOW_MEMORY_MAX_HISTORY_BIGRAMS = 2000; /** Any pair being typed or picked */ /** Any pair being typed or picked */ private static final int FREQUENCY_FOR_TYPED = 2; private static final int FREQUENCY_FOR_TYPED = 2; Loading @@ -53,10 +55,14 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr private final UserHistoryDictionaryBigramList mBigramList = private final UserHistoryDictionaryBigramList mBigramList = new UserHistoryDictionaryBigramList(); new UserHistoryDictionaryBigramList(); private final ExpandableDictionary mExpandableDictionary; private final ExpandableDictionary mExpandableDictionary; private final int mMaxHistoryBigrams; public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) { public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) { super(context, dictType); super(context, dictType); mExpandableDictionary = new ExpandableDictionary(dictType); mExpandableDictionary = new ExpandableDictionary(dictType); final boolean isLowRamDevice = ActivityManagerCompatUtils.isLowRamDevice(context); mMaxHistoryBigrams = isLowRamDevice ? LOW_MEMORY_MAX_HISTORY_BIGRAMS : DEFAULT_MAX_HISTORY_BIGRAMS; } } @Override @Override Loading @@ -72,6 +78,10 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr @Override @Override public void addUnigramWord(final String word, final String shortcutTarget, final int frequency, public void addUnigramWord(final String word, final String shortcutTarget, final int frequency, final boolean isNotAWord) { final boolean isNotAWord) { if (mBigramList.size() > mMaxHistoryBigrams * 2) { // Too many entries: just stop adding new vocabrary and wait next refresh. return; } mExpandableDictionary.addWord(word, shortcutTarget, frequency); mExpandableDictionary.addWord(word, shortcutTarget, frequency); mBigramList.addBigram(null, word, (byte)frequency); mBigramList.addBigram(null, word, (byte)frequency); } } Loading @@ -79,6 +89,10 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr @Override @Override public void addBigramWords(final String word0, final String word1, final int frequency, public void addBigramWords(final String word0, final String word1, final int frequency, final boolean isValid, final long lastModifiedTime) { final boolean isValid, final long lastModifiedTime) { if (mBigramList.size() > mMaxHistoryBigrams * 2) { // Too many entries: just stop adding new vocabrary and wait next refresh. return; } if (lastModifiedTime > 0) { if (lastModifiedTime > 0) { mExpandableDictionary.setBigramAndGetFrequency(word0, word1, mExpandableDictionary.setBigramAndGetFrequency(word0, word1, new ForgettingCurveParams(frequency, System.currentTimeMillis(), new ForgettingCurveParams(frequency, System.currentTimeMillis(), Loading @@ -102,19 +116,22 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr protected void writeDictionary(final DictEncoder dictEncoder) protected void writeDictionary(final DictEncoder dictEncoder) throws IOException, UnsupportedFormatException { throws IOException, UnsupportedFormatException { UserHistoryDictIOUtils.writeDictionary(dictEncoder, UserHistoryDictIOUtils.writeDictionary(dictEncoder, new FrequencyProvider(mBigramList, mExpandableDictionary), mBigramList, new FrequencyProvider(mBigramList, mExpandableDictionary, mMaxHistoryBigrams), FORMAT_OPTIONS); mBigramList, FORMAT_OPTIONS); } } private static class FrequencyProvider implements BigramDictionaryInterface { private static class FrequencyProvider implements BigramDictionaryInterface { final private UserHistoryDictionaryBigramList mBigramList; private final UserHistoryDictionaryBigramList mBigramList; final private ExpandableDictionary mExpandableDictionary; private final ExpandableDictionary mExpandableDictionary; private final int mMaxHistoryBigrams; public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList, public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList, final ExpandableDictionary expandableDictionary) { final ExpandableDictionary expandableDictionary, final int maxHistoryBigrams) { mBigramList = bigramList; mBigramList = bigramList; mExpandableDictionary = expandableDictionary; mExpandableDictionary = expandableDictionary; mMaxHistoryBigrams = maxHistoryBigrams; } } @Override @Override public int getFrequency(final String word0, final String word1) { public int getFrequency(final String word0, final String word1) { final int freq; final int freq; Loading @@ -130,7 +147,7 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr if (prevFc > 0 && prevFc == fc) { if (prevFc > 0 && prevFc == fc) { freq = fc & 0xFF; freq = fc & 0xFF; } else if (UserHistoryForgettingCurveUtils. } else if (UserHistoryForgettingCurveUtils. needsToSave(fc, isValid, mBigramList.size() <= MAX_HISTORY_BIGRAMS)) { needsToSave(fc, isValid, mBigramList.size() <= mMaxHistoryBigrams)) { freq = fc & 0xFF; freq = fc & 0xFF; } else { } else { // Delete this entry // Delete this entry Loading Loading
java/src/com/android/inputmethod/latin/personalization/DynamicPersonalizationDictionaryWriter.java +24 −7 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.inputmethod.latin.personalization; import android.content.Context; import android.content.Context; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.annotations.UsedForTesting; import com.android.inputmethod.compat.ActivityManagerCompatUtils; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.AbstractDictionaryWriter; import com.android.inputmethod.latin.AbstractDictionaryWriter; import com.android.inputmethod.latin.ExpandableDictionary; import com.android.inputmethod.latin.ExpandableDictionary; Loading @@ -41,7 +42,8 @@ import java.util.ArrayList; public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter { public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter { private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName(); private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName(); /** Maximum number of pairs. Pruning will start when databases goes above this number. */ /** Maximum number of pairs. Pruning will start when databases goes above this number. */ public static final int MAX_HISTORY_BIGRAMS = 10000; public static final int DEFAULT_MAX_HISTORY_BIGRAMS = 10000; public static final int LOW_MEMORY_MAX_HISTORY_BIGRAMS = 2000; /** Any pair being typed or picked */ /** Any pair being typed or picked */ private static final int FREQUENCY_FOR_TYPED = 2; private static final int FREQUENCY_FOR_TYPED = 2; Loading @@ -53,10 +55,14 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr private final UserHistoryDictionaryBigramList mBigramList = private final UserHistoryDictionaryBigramList mBigramList = new UserHistoryDictionaryBigramList(); new UserHistoryDictionaryBigramList(); private final ExpandableDictionary mExpandableDictionary; private final ExpandableDictionary mExpandableDictionary; private final int mMaxHistoryBigrams; public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) { public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) { super(context, dictType); super(context, dictType); mExpandableDictionary = new ExpandableDictionary(dictType); mExpandableDictionary = new ExpandableDictionary(dictType); final boolean isLowRamDevice = ActivityManagerCompatUtils.isLowRamDevice(context); mMaxHistoryBigrams = isLowRamDevice ? LOW_MEMORY_MAX_HISTORY_BIGRAMS : DEFAULT_MAX_HISTORY_BIGRAMS; } } @Override @Override Loading @@ -72,6 +78,10 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr @Override @Override public void addUnigramWord(final String word, final String shortcutTarget, final int frequency, public void addUnigramWord(final String word, final String shortcutTarget, final int frequency, final boolean isNotAWord) { final boolean isNotAWord) { if (mBigramList.size() > mMaxHistoryBigrams * 2) { // Too many entries: just stop adding new vocabrary and wait next refresh. return; } mExpandableDictionary.addWord(word, shortcutTarget, frequency); mExpandableDictionary.addWord(word, shortcutTarget, frequency); mBigramList.addBigram(null, word, (byte)frequency); mBigramList.addBigram(null, word, (byte)frequency); } } Loading @@ -79,6 +89,10 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr @Override @Override public void addBigramWords(final String word0, final String word1, final int frequency, public void addBigramWords(final String word0, final String word1, final int frequency, final boolean isValid, final long lastModifiedTime) { final boolean isValid, final long lastModifiedTime) { if (mBigramList.size() > mMaxHistoryBigrams * 2) { // Too many entries: just stop adding new vocabrary and wait next refresh. return; } if (lastModifiedTime > 0) { if (lastModifiedTime > 0) { mExpandableDictionary.setBigramAndGetFrequency(word0, word1, mExpandableDictionary.setBigramAndGetFrequency(word0, word1, new ForgettingCurveParams(frequency, System.currentTimeMillis(), new ForgettingCurveParams(frequency, System.currentTimeMillis(), Loading @@ -102,19 +116,22 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr protected void writeDictionary(final DictEncoder dictEncoder) protected void writeDictionary(final DictEncoder dictEncoder) throws IOException, UnsupportedFormatException { throws IOException, UnsupportedFormatException { UserHistoryDictIOUtils.writeDictionary(dictEncoder, UserHistoryDictIOUtils.writeDictionary(dictEncoder, new FrequencyProvider(mBigramList, mExpandableDictionary), mBigramList, new FrequencyProvider(mBigramList, mExpandableDictionary, mMaxHistoryBigrams), FORMAT_OPTIONS); mBigramList, FORMAT_OPTIONS); } } private static class FrequencyProvider implements BigramDictionaryInterface { private static class FrequencyProvider implements BigramDictionaryInterface { final private UserHistoryDictionaryBigramList mBigramList; private final UserHistoryDictionaryBigramList mBigramList; final private ExpandableDictionary mExpandableDictionary; private final ExpandableDictionary mExpandableDictionary; private final int mMaxHistoryBigrams; public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList, public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList, final ExpandableDictionary expandableDictionary) { final ExpandableDictionary expandableDictionary, final int maxHistoryBigrams) { mBigramList = bigramList; mBigramList = bigramList; mExpandableDictionary = expandableDictionary; mExpandableDictionary = expandableDictionary; mMaxHistoryBigrams = maxHistoryBigrams; } } @Override @Override public int getFrequency(final String word0, final String word1) { public int getFrequency(final String word0, final String word1) { final int freq; final int freq; Loading @@ -130,7 +147,7 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr if (prevFc > 0 && prevFc == fc) { if (prevFc > 0 && prevFc == fc) { freq = fc & 0xFF; freq = fc & 0xFF; } else if (UserHistoryForgettingCurveUtils. } else if (UserHistoryForgettingCurveUtils. needsToSave(fc, isValid, mBigramList.size() <= MAX_HISTORY_BIGRAMS)) { needsToSave(fc, isValid, mBigramList.size() <= mMaxHistoryBigrams)) { freq = fc & 0xFF; freq = fc & 0xFF; } else { } else { // Delete this entry // Delete this entry Loading