Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f068c6e6 authored by Satoshi Kataoka's avatar Satoshi Kataoka Committed by Android (Google) Code Review
Browse files

Merge "Low memory mode in UserHistory"

parents f6009233 97485273
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.inputmethod.latin.personalization;
import android.content.Context;

import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.compat.ActivityManagerCompatUtils;
import com.android.inputmethod.keyboard.ProximityInfo;
import com.android.inputmethod.latin.AbstractDictionaryWriter;
import com.android.inputmethod.latin.ExpandableDictionary;
@@ -41,7 +42,8 @@ import java.util.ArrayList;
public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWriter {
    private static final String TAG = DynamicPersonalizationDictionaryWriter.class.getSimpleName();
    /** 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 */
    private static final int FREQUENCY_FOR_TYPED = 2;
@@ -53,10 +55,14 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
    private final UserHistoryDictionaryBigramList mBigramList =
            new UserHistoryDictionaryBigramList();
    private final ExpandableDictionary mExpandableDictionary;
    private final int mMaxHistoryBigrams;

    public DynamicPersonalizationDictionaryWriter(final Context context, final String dictType) {
        super(context, dictType);
        mExpandableDictionary = new ExpandableDictionary(dictType);
        final boolean isLowRamDevice = ActivityManagerCompatUtils.isLowRamDevice(context);
        mMaxHistoryBigrams = isLowRamDevice ?
                LOW_MEMORY_MAX_HISTORY_BIGRAMS : DEFAULT_MAX_HISTORY_BIGRAMS;
    }

    @Override
@@ -72,6 +78,10 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
    @Override
    public void addUnigramWord(final String word, final String shortcutTarget, final int frequency,
            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);
        mBigramList.addBigram(null, word, (byte)frequency);
    }
@@ -79,6 +89,10 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
    @Override
    public void addBigramWords(final String word0, final String word1, final int frequency,
            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) {
            mExpandableDictionary.setBigramAndGetFrequency(word0, word1,
                    new ForgettingCurveParams(frequency, System.currentTimeMillis(),
@@ -102,19 +116,22 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
    protected void writeDictionary(final DictEncoder dictEncoder)
            throws IOException, UnsupportedFormatException {
        UserHistoryDictIOUtils.writeDictionary(dictEncoder,
                new FrequencyProvider(mBigramList, mExpandableDictionary), mBigramList,
                        FORMAT_OPTIONS);
                new FrequencyProvider(mBigramList, mExpandableDictionary, mMaxHistoryBigrams),
                mBigramList, FORMAT_OPTIONS);
    }

    private static class FrequencyProvider implements BigramDictionaryInterface {
        final private UserHistoryDictionaryBigramList mBigramList;
        final private ExpandableDictionary mExpandableDictionary;
        private final UserHistoryDictionaryBigramList mBigramList;
        private final ExpandableDictionary mExpandableDictionary;
        private final int mMaxHistoryBigrams;

        public FrequencyProvider(final UserHistoryDictionaryBigramList bigramList,
                final ExpandableDictionary expandableDictionary) {
                final ExpandableDictionary expandableDictionary, final int maxHistoryBigrams) {
            mBigramList = bigramList;
            mExpandableDictionary = expandableDictionary;
            mMaxHistoryBigrams = maxHistoryBigrams;
        }

        @Override
        public int getFrequency(final String word0, final String word1) {
            final int freq;
@@ -130,7 +147,7 @@ public class DynamicPersonalizationDictionaryWriter extends AbstractDictionaryWr
                    if (prevFc > 0 && prevFc == fc) {
                        freq = fc & 0xFF;
                    } else if (UserHistoryForgettingCurveUtils.
                            needsToSave(fc, isValid, mBigramList.size() <= MAX_HISTORY_BIGRAMS)) {
                            needsToSave(fc, isValid, mBigramList.size() <= mMaxHistoryBigrams)) {
                        freq = fc & 0xFF;
                    } else {
                        // Delete this entry