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

Commit 7d7f0820 authored by Dan Zivkovic's avatar Dan Zivkovic
Browse files

Stop waking up to decay dynamic dictionaries.

Bug 19516048.

Change-Id: Ibc27a792b4fa80fa8c6af4721c47a617526e9584
parent e4619f02
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -133,13 +133,6 @@
            </intent-filter>
        </receiver>

        <receiver android:name=".personalization.DictionaryDecayBroadcastReciever"
            android:exported="false">
            <intent-filter>
                <action android:name="com.android.inputmethod.latin.personalization.DICT_DECAY" />
            </intent-filter>
        </receiver>

        <receiver android:name=".DictionaryPackInstallBroadcastReceiver" android:exported="false">
            <intent-filter>
                <action android:name="com.android.inputmethod.dictionarypack.aosp.UNKNOWN_CLIENT" />
+1 −1
Original line number Diff line number Diff line
@@ -259,7 +259,7 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
    /**
     * Check whether GC is needed and run GC if required.
     */
    protected void runGCIfRequired(final boolean mindsBlockByGC) {
    public void runGCIfRequired(final boolean mindsBlockByGC) {
        asyncExecuteTaskWithWriteLock(new Runnable() {
            @Override
            public void run() {
+0 −3
Original line number Diff line number Diff line
@@ -73,7 +73,6 @@ import com.android.inputmethod.latin.common.InputPointers;
import com.android.inputmethod.latin.define.DebugFlags;
import com.android.inputmethod.latin.define.ProductionFlags;
import com.android.inputmethod.latin.inputlogic.InputLogic;
import com.android.inputmethod.latin.personalization.DictionaryDecayBroadcastReciever;
import com.android.inputmethod.latin.personalization.PersonalizationHelper;
import com.android.inputmethod.latin.settings.Settings;
import com.android.inputmethod.latin.settings.SettingsActivity;
@@ -584,7 +583,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        dictDumpFilter.addAction(DictionaryDumpBroadcastReceiver.DICTIONARY_DUMP_INTENT_ACTION);
        registerReceiver(mDictionaryDumpBroadcastReceiver, dictDumpFilter);

        DictionaryDecayBroadcastReciever.setUpIntervalAlarmForDictionaryDecaying(this);
        StatsUtils.onCreate(mSettings.getCurrent(), mRichImm);
    }

@@ -704,7 +702,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        unregisterReceiver(mDictionaryPackInstallReceiver);
        unregisterReceiver(mDictionaryDumpBroadcastReceiver);
        mStatsUtilsManager.onDestroy(this /* context */);
        DictionaryDecayBroadcastReciever.cancelIntervalAlarmForDictionaryDecaying(this);
        super.onDestroy();
    }

+0 −85
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.inputmethod.latin.personalization;

import android.content.Context;

import com.android.inputmethod.latin.Dictionary;
import com.android.inputmethod.latin.ExpandableBinaryDictionary;
import com.android.inputmethod.latin.makedict.DictionaryHeader;

import java.io.File;
import java.util.Locale;
import java.util.Map;

/**
 * This class is a base class of a dictionary that supports decaying for the personalized language
 * model.
 */
public abstract class DecayingExpandableBinaryDictionaryBase extends ExpandableBinaryDictionary {
    private static final boolean DBG_DUMP_ON_CLOSE = false;

    /** Any pair being typed or picked */
    public static final int FREQUENCY_FOR_TYPED = 2;

    public static final int FREQUENCY_FOR_WORDS_IN_DICTS = FREQUENCY_FOR_TYPED;
    public static final int FREQUENCY_FOR_WORDS_NOT_IN_DICTS = Dictionary.NOT_A_PROBABILITY;

    protected DecayingExpandableBinaryDictionaryBase(final Context context,
            final String dictName, final Locale locale, final String dictionaryType,
            final File dictFile) {
        super(context, dictName, locale, dictionaryType, dictFile);
        if (mLocale != null && mLocale.toString().length() > 1) {
            reloadDictionaryIfRequired();
        }
    }

    @Override
    public void close() {
        if (DBG_DUMP_ON_CLOSE) {
            dumpAllWordsForDebug();
        }
        // Flush pending writes.
        asyncFlushBinaryDictionary();
        super.close();
    }

    @Override
    protected Map<String, String> getHeaderAttributeMap() {
        final Map<String, String> attributeMap = super.getHeaderAttributeMap();
        attributeMap.put(DictionaryHeader.USES_FORGETTING_CURVE_KEY,
                DictionaryHeader.ATTRIBUTE_VALUE_TRUE);
        attributeMap.put(DictionaryHeader.HAS_HISTORICAL_INFO_KEY,
                DictionaryHeader.ATTRIBUTE_VALUE_TRUE);
        return attributeMap;
    }

    @Override
    protected void loadInitialContentsLocked() {
        // No initial contents.
    }

    /* package */ void runGCIfRequired() {
        runGCIfRequired(false /* mindsBlockByGC */);
    }

    @Override
    public boolean isValidWord(final String word) {
        // Strings out of this dictionary should not be considered existing words.
        return false;
    }
}
+0 −89
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.inputmethod.latin.personalization;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import java.util.concurrent.TimeUnit;

/**
 * Broadcast receiver for periodically updating decaying dictionaries.
 */
public class DictionaryDecayBroadcastReciever extends BroadcastReceiver {
    /**
     * The root domain for the personalization.
     */
    private static final String PERSONALIZATION_DOMAIN =
            "com.android.inputmethod.latin.personalization";

    /**
     * The action of the intent to tell the time to decay dictionaries.
     */
    private static final String DICTIONARY_DECAY_INTENT_ACTION =
            PERSONALIZATION_DOMAIN + ".DICT_DECAY";

    /**
     * Interval to update for decaying dictionaries.
     */
    static final long DICTIONARY_DECAY_INTERVAL_IN_MILLIS = TimeUnit.MINUTES.toMillis(60);

    private static PendingIntent getPendingIntentForDictionaryDecay(final Context context) {
        final Intent updateIntent = new Intent(DICTIONARY_DECAY_INTENT_ACTION);
        updateIntent.setClass(context, DictionaryDecayBroadcastReciever.class);
        return PendingIntent.getBroadcast(context, 0 /* requestCode */,
                updateIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    }

    /**
     * Set up interval alarm for dynamic dictionaries.
     */
    public static void setUpIntervalAlarmForDictionaryDecaying(final Context context) {
        final AlarmManager alarmManager =
                (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        if (null == alarmManager) {
            return;
        }
        final long alarmTriggerTimeInMillis =
                System.currentTimeMillis() + DICTIONARY_DECAY_INTERVAL_IN_MILLIS;
        alarmManager.setInexactRepeating(AlarmManager.RTC, alarmTriggerTimeInMillis,
                DICTIONARY_DECAY_INTERVAL_IN_MILLIS, getPendingIntentForDictionaryDecay(context));
    }

    /**
     * Cancel interval alarm that has been set up.
     */
    public static void cancelIntervalAlarmForDictionaryDecaying(final Context context) {
        final AlarmManager alarmManager =
                (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        if (null == alarmManager) {
            return;
        }
        alarmManager.cancel(getPendingIntentForDictionaryDecay(context));
    }

    @Override
    public void onReceive(final Context context, final Intent intent) {
        final String action = intent.getAction();
        if (action.equals(DICTIONARY_DECAY_INTENT_ACTION)) {
            PersonalizationHelper.runGCOnAllOpenedUserHistoryDictionaries();
        }
    }
}
Loading