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

Commit 48cc0d64 authored by Jatin Matani's avatar Jatin Matani Committed by Android (Google) Code Review
Browse files

Merge "Nuke Amanatto"

parents 53e81fdc 15acbdc9
Loading
Loading
Loading
Loading
+0 −38
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2014 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.DictionaryFacilitator;

@SuppressWarnings("unused")
public class ContextualDictionaryUpdater {
    public ContextualDictionaryUpdater(final Context context,
            final DictionaryFacilitator dictionaryFacilitator,
            final Runnable onUpdateRunnable) {
    }

    public void onLoadSettings(final boolean usePersonalizedDicts) {
    }

    public void onStartInputView(final String  packageName) {
    }

    public void onDestroy() {
    }
}
+0 −46
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2014 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.DictionaryFacilitator;

@SuppressWarnings("unused")
public class PersonalizationDictionaryUpdater {
    final Context mContext;
    final DictionaryFacilitator mDictionaryFacilitator;
    boolean mDictCleared = false;

    public PersonalizationDictionaryUpdater(final Context context,
            final DictionaryFacilitator dictionaryFacilitator) {
        mContext = context;
        mDictionaryFacilitator = dictionaryFacilitator;
    }

    public void onLoadSettings(final boolean usePersonalizedDicts) {
        if (!mDictCleared) {
            // Clear and never update the personalization dictionary.
            PersonalizationHelper.removeAllPersonalizationDictionaries(mContext);
            mDictionaryFacilitator.clearPersonalizationDictionary();
            mDictCleared = true;
        }
    }

    public void onDestroy() {
    }
}
+2 −22
Original line number Original line Diff line number Diff line
@@ -17,21 +17,18 @@
package com.android.inputmethod.latin;
package com.android.inputmethod.latin;


import android.content.Context;
import android.content.Context;
import android.view.inputmethod.InputMethodSubtype;
import android.util.Pair;
import android.util.Pair;
import android.view.inputmethod.InputMethodSubtype;


import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.ExpandableBinaryDictionary.UpdateEntriesForInputEventsCallback;
import com.android.inputmethod.latin.personalization.PersonalizationDataChunk;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import com.android.inputmethod.latin.utils.SuggestionResults;
import com.android.inputmethod.latin.utils.SuggestionResults;


import java.io.File;
import java.io.File;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashMap;
import java.util.Locale;
import java.util.List;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;


@@ -120,8 +117,6 @@ public interface DictionaryFacilitator {


    boolean hasPersonalizationDictionary();
    boolean hasPersonalizationDictionary();


    void flushPersonalizationDictionary();

    void waitForLoadingMainDictionaries(final long timeout, final TimeUnit unit)
    void waitForLoadingMainDictionaries(final long timeout, final TimeUnit unit)
            throws InterruptedException;
            throws InterruptedException;


@@ -152,21 +147,6 @@ public interface DictionaryFacilitator {


    void clearUserHistoryDictionary();
    void clearUserHistoryDictionary();


    // This method gets called only when the IME receives a notification to remove the
    // personalization dictionary.
    void clearPersonalizationDictionary();

    void clearContextualDictionary();

    void addEntriesToPersonalizationDictionary(
            final PersonalizationDataChunk personalizationDataChunk,
            final SpacingAndPunctuations spacingAndPunctuations,
            final UpdateEntriesForInputEventsCallback callback);

    @UsedForTesting
    void addPhraseToContextualDictionary(final String[] phrase, final int probability,
            final int bigramProbabilityForWords, final int bigramProbabilityForPhrases);

    void dumpDictionaryForDebug(final String dictName);
    void dumpDictionaryForDebug(final String dictName);


    ArrayList<Pair<String, DictionaryStats>> getStatsOfEnabledSubDicts();
    ArrayList<Pair<String, DictionaryStats>> getStatsOfEnabledSubDicts();
+0 −86
Original line number Original line Diff line number Diff line
@@ -23,16 +23,11 @@ import android.util.Pair;
import android.view.inputmethod.InputMethodSubtype;
import android.view.inputmethod.InputMethodSubtype;


import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.latin.ExpandableBinaryDictionary.UpdateEntriesForInputEventsCallback;
import com.android.inputmethod.latin.NgramContext.WordInfo;
import com.android.inputmethod.latin.NgramContext.WordInfo;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.common.Constants;
import com.android.inputmethod.latin.personalization.ContextualDictionary;
import com.android.inputmethod.latin.personalization.PersonalizationDataChunk;
import com.android.inputmethod.latin.personalization.PersonalizationDictionary;
import com.android.inputmethod.latin.personalization.UserHistoryDictionary;
import com.android.inputmethod.latin.personalization.UserHistoryDictionary;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import com.android.inputmethod.latin.settings.SettingsValuesForSuggestion;
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
import com.android.inputmethod.latin.utils.DistracterFilter;
import com.android.inputmethod.latin.utils.DistracterFilter;
import com.android.inputmethod.latin.utils.DistracterFilterCheckingExactMatchesAndSuggestions;
import com.android.inputmethod.latin.utils.DistracterFilterCheckingExactMatchesAndSuggestions;
import com.android.inputmethod.latin.utils.DistracterFilterCheckingIsInDictionary;
import com.android.inputmethod.latin.utils.DistracterFilterCheckingIsInDictionary;
@@ -83,16 +78,13 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
    // To synchronize assigning mDictionaryGroup to ensure closing dictionaries.
    // To synchronize assigning mDictionaryGroup to ensure closing dictionaries.
    private final Object mLock = new Object();
    private final Object mLock = new Object();
    private final DistracterFilter mDistracterFilter;
    private final DistracterFilter mDistracterFilter;
    private final PersonalizationHelperForDictionaryFacilitator mPersonalizationHelper;


    private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS =
    private static final String[] DICT_TYPES_ORDERED_TO_GET_SUGGESTIONS =
            new String[] {
            new String[] {
                Dictionary.TYPE_MAIN,
                Dictionary.TYPE_MAIN,
                Dictionary.TYPE_USER_HISTORY,
                Dictionary.TYPE_USER_HISTORY,
                Dictionary.TYPE_PERSONALIZATION,
                Dictionary.TYPE_USER,
                Dictionary.TYPE_USER,
                Dictionary.TYPE_CONTACTS,
                Dictionary.TYPE_CONTACTS,
                Dictionary.TYPE_CONTEXTUAL
            };
            };


    public static final Map<String, Class<? extends ExpandableBinaryDictionary>>
    public static final Map<String, Class<? extends ExpandableBinaryDictionary>>
@@ -100,10 +92,8 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {


    static {
    static {
        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER_HISTORY, UserHistoryDictionary.class);
        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER_HISTORY, UserHistoryDictionary.class);
        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_PERSONALIZATION, PersonalizationDictionary.class);
        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER, UserBinaryDictionary.class);
        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_USER, UserBinaryDictionary.class);
        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_CONTACTS, ContactsBinaryDictionary.class);
        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_CONTACTS, ContactsBinaryDictionary.class);
        DICT_TYPE_TO_CLASS.put(Dictionary.TYPE_CONTEXTUAL, ContextualDictionary.class);
    }
    }


    private static final String DICT_FACTORY_METHOD_NAME = "getDictionary";
    private static final String DICT_FACTORY_METHOD_NAME = "getDictionary";
@@ -257,23 +247,18 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {


    public DictionaryFacilitatorImpl() {
    public DictionaryFacilitatorImpl() {
        mDistracterFilter = DistracterFilter.EMPTY_DISTRACTER_FILTER;
        mDistracterFilter = DistracterFilter.EMPTY_DISTRACTER_FILTER;
        mPersonalizationHelper = null;
    }
    }


    public DictionaryFacilitatorImpl(final Context context) {
    public DictionaryFacilitatorImpl(final Context context) {
        mDistracterFilter = new DistracterFilterCheckingExactMatchesAndSuggestions(context);
        mDistracterFilter = new DistracterFilterCheckingExactMatchesAndSuggestions(context);
        mPersonalizationHelper =
                new PersonalizationHelperForDictionaryFacilitator(context, mDistracterFilter);
    }
    }


    public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) {
    public void updateEnabledSubtypes(final List<InputMethodSubtype> enabledSubtypes) {
        mDistracterFilter.updateEnabledSubtypes(enabledSubtypes);
        mDistracterFilter.updateEnabledSubtypes(enabledSubtypes);
        mPersonalizationHelper.updateEnabledSubtypes(enabledSubtypes);
    }
    }


    // TODO: remove this, it's confusing with seamless multiple language switching
    // TODO: remove this, it's confusing with seamless multiple language switching
    public void setIsMonolingualUser(final boolean isMonolingualUser) {
    public void setIsMonolingualUser(final boolean isMonolingualUser) {
        mPersonalizationHelper.setIsMonolingualUser(isMonolingualUser);
    }
    }


    public boolean isActive() {
    public boolean isActive() {
@@ -586,9 +571,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
            }
            }
        }
        }
        mDistracterFilter.close();
        mDistracterFilter.close();
        if (mPersonalizationHelper != null) {
            mPersonalizationHelper.close();
        }
    }
    }


    @UsedForTesting
    @UsedForTesting
@@ -630,20 +612,6 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
        return false;
        return false;
    }
    }


    public void flushPersonalizationDictionary() {
        final HashSet<ExpandableBinaryDictionary> personalizationDictsUsedForSuggestion =
                new HashSet<>();
        final DictionaryGroup[] dictionaryGroups = mDictionaryGroups;
        for (final DictionaryGroup dictionaryGroup : dictionaryGroups) {
            final ExpandableBinaryDictionary personalizationDictUsedForSuggestion =
                    dictionaryGroup.getSubDict(Dictionary.TYPE_PERSONALIZATION);
            personalizationDictsUsedForSuggestion.add(personalizationDictUsedForSuggestion);
        }
        mPersonalizationHelper.flushPersonalizationDictionariesToUpdate(
                personalizationDictsUsedForSuggestion);
        mDistracterFilter.close();
    }

    public void waitForLoadingMainDictionaries(final long timeout, final TimeUnit unit)
    public void waitForLoadingMainDictionaries(final long timeout, final TimeUnit unit)
            throws InterruptedException {
            throws InterruptedException {
        mLatchForWaitingLoadingMainDictionaries.await(timeout, unit);
        mLatchForWaitingLoadingMainDictionaries.await(timeout, unit);
@@ -861,64 +829,10 @@ public class DictionaryFacilitatorImpl implements DictionaryFacilitator {
        clearSubDictionary(Dictionary.TYPE_USER_HISTORY);
        clearSubDictionary(Dictionary.TYPE_USER_HISTORY);
    }
    }


    // This method gets called only when the IME receives a notification to remove the
    // personalization dictionary.
    public void clearPersonalizationDictionary() {
        clearSubDictionary(Dictionary.TYPE_PERSONALIZATION);
        mPersonalizationHelper.clearDictionariesToUpdate();
    }

    public void clearContextualDictionary() {
    public void clearContextualDictionary() {
        clearSubDictionary(Dictionary.TYPE_CONTEXTUAL);
        clearSubDictionary(Dictionary.TYPE_CONTEXTUAL);
    }
    }


    public void addEntriesToPersonalizationDictionary(
            final PersonalizationDataChunk personalizationDataChunk,
            final SpacingAndPunctuations spacingAndPunctuations,
            final UpdateEntriesForInputEventsCallback callback) {
        mPersonalizationHelper.updateEntriesOfPersonalizationDictionaries(
                getMostProbableLocale(), personalizationDataChunk, spacingAndPunctuations,
                callback);
    }

    @UsedForTesting
    public void addPhraseToContextualDictionary(final String[] phrase, final int probability,
            final int bigramProbabilityForWords, final int bigramProbabilityForPhrases) {
        // TODO: we're inserting the phrase into the dictionary for the active language. Rethink
        // this a bit from a theoretical point of view.
        final ExpandableBinaryDictionary contextualDict =
                getDictionaryGroupForMostProbableLanguage().getSubDict(Dictionary.TYPE_CONTEXTUAL);
        if (contextualDict == null) {
            return;
        }
        NgramContext ngramContext = NgramContext.BEGINNING_OF_SENTENCE;
        for (int i = 0; i < phrase.length; i++) {
            final String[] subPhrase = Arrays.copyOfRange(phrase, i /* start */, phrase.length);
            final String subPhraseStr = TextUtils.join(Constants.WORD_SEPARATOR, subPhrase);
            contextualDict.addUnigramEntryWithCheckingDistracter(
                    subPhraseStr, probability, null /* shortcutTarget */,
                    Dictionary.NOT_A_PROBABILITY /* shortcutFreq */,
                    false /* isNotAWord */, false /* isPossiblyOffensive */,
                    BinaryDictionary.NOT_A_VALID_TIMESTAMP,
                    DistracterFilter.EMPTY_DISTRACTER_FILTER);
            contextualDict.addNgramEntry(ngramContext, subPhraseStr,
                    bigramProbabilityForPhrases, BinaryDictionary.NOT_A_VALID_TIMESTAMP);

            if (i < phrase.length - 1) {
                contextualDict.addUnigramEntryWithCheckingDistracter(
                        phrase[i], probability, null /* shortcutTarget */,
                        Dictionary.NOT_A_PROBABILITY /* shortcutFreq */,
                        false /* isNotAWord */, false /* isPossiblyOffensive */,
                        BinaryDictionary.NOT_A_VALID_TIMESTAMP,
                        DistracterFilter.EMPTY_DISTRACTER_FILTER);
                contextualDict.addNgramEntry(ngramContext, phrase[i],
                        bigramProbabilityForWords, BinaryDictionary.NOT_A_VALID_TIMESTAMP);
            }
            ngramContext =
                    ngramContext.getNextNgramContext(new NgramContext.WordInfo(phrase[i]));
        }
    }

    public void dumpDictionaryForDebug(final String dictName) {
    public void dumpDictionaryForDebug(final String dictName) {
        final DictionaryGroup[] dictionaryGroups = mDictionaryGroups;
        final DictionaryGroup[] dictionaryGroups = mDictionaryGroups;
        for (final DictionaryGroup dictionaryGroup : dictionaryGroups) {
        for (final DictionaryGroup dictionaryGroup : dictionaryGroups) {
+2 −22
Original line number Original line Diff line number Diff line
@@ -81,9 +81,7 @@ import com.android.inputmethod.latin.common.InputPointers;
import com.android.inputmethod.latin.define.DebugFlags;
import com.android.inputmethod.latin.define.DebugFlags;
import com.android.inputmethod.latin.define.ProductionFlags;
import com.android.inputmethod.latin.define.ProductionFlags;
import com.android.inputmethod.latin.inputlogic.InputLogic;
import com.android.inputmethod.latin.inputlogic.InputLogic;
import com.android.inputmethod.latin.personalization.ContextualDictionaryUpdater;
import com.android.inputmethod.latin.personalization.DictionaryDecayBroadcastReciever;
import com.android.inputmethod.latin.personalization.DictionaryDecayBroadcastReciever;
import com.android.inputmethod.latin.personalization.PersonalizationDictionaryUpdater;
import com.android.inputmethod.latin.personalization.PersonalizationHelper;
import com.android.inputmethod.latin.personalization.PersonalizationHelper;
import com.android.inputmethod.latin.settings.Settings;
import com.android.inputmethod.latin.settings.Settings;
import com.android.inputmethod.latin.settings.SettingsActivity;
import com.android.inputmethod.latin.settings.SettingsActivity;
@@ -141,17 +139,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
    final Settings mSettings;
    final Settings mSettings;
    private final DictionaryFacilitator mDictionaryFacilitator =
    private final DictionaryFacilitator mDictionaryFacilitator =
      DictionaryFacilitatorProvider.newDictionaryFacilitator(this /* context */);
      DictionaryFacilitatorProvider.newDictionaryFacilitator(this /* context */);
    // TODO: Move from LatinIME.
    private final PersonalizationDictionaryUpdater mPersonalizationDictionaryUpdater =
            new PersonalizationDictionaryUpdater(this /* context */, mDictionaryFacilitator);
    private final ContextualDictionaryUpdater mContextualDictionaryUpdater =
            new ContextualDictionaryUpdater(this /* context */, mDictionaryFacilitator,
                    new Runnable() {
                        @Override
                        public void run() {
                            mHandler.postUpdateSuggestionStrip(SuggestedWords.INPUT_STYLE_NONE);
                        }
                    });
    final InputLogic mInputLogic = new InputLogic(this /* LatinIME */,
    final InputLogic mInputLogic = new InputLogic(this /* LatinIME */,
            this /* SuggestionStripViewAccessor */, mDictionaryFacilitator);
            this /* SuggestionStripViewAccessor */, mDictionaryFacilitator);
    // We expect to have only one decoder in almost all cases, hence the default capacity of 1.
    // We expect to have only one decoder in almost all cases, hence the default capacity of 1.
@@ -642,11 +629,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen


    private void refreshPersonalizationDictionarySession(
    private void refreshPersonalizationDictionarySession(
            final SettingsValues currentSettingsValues) {
            final SettingsValues currentSettingsValues) {
        // TODO: Remove all existing personalized dictionaries.
        mDictionaryFacilitator.setIsMonolingualUser(
        mDictionaryFacilitator.setIsMonolingualUser(
                mRichImm.isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes());
                mRichImm.isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes());
        mPersonalizationDictionaryUpdater.onLoadSettings(
                currentSettingsValues.mUsePersonalizedDicts);
        mContextualDictionaryUpdater.onLoadSettings(currentSettingsValues.mUsePersonalizedDicts);
        final boolean shouldKeepUserHistoryDictionaries;
        final boolean shouldKeepUserHistoryDictionaries;
        if (currentSettingsValues.mUsePersonalizedDicts) {
        if (currentSettingsValues.mUsePersonalizedDicts) {
            shouldKeepUserHistoryDictionaries = true;
            shouldKeepUserHistoryDictionaries = true;
@@ -730,8 +715,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
    @Override
    @Override
    public void onDestroy() {
    public void onDestroy() {
        mDictionaryFacilitator.closeDictionaries();
        mDictionaryFacilitator.closeDictionaries();
        mPersonalizationDictionaryUpdater.onDestroy();
        mContextualDictionaryUpdater.onDestroy();
        mSettings.onDestroy();
        mSettings.onDestroy();
        NetworkConnectivityUtils.onDestroy(this /* context */);
        NetworkConnectivityUtils.onDestroy(this /* context */);
        unregisterReceiver(mRingerModeChangeReceiver);
        unregisterReceiver(mRingerModeChangeReceiver);
@@ -1050,8 +1033,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
                currentSettingsValues.mGestureTrailEnabled,
                currentSettingsValues.mGestureTrailEnabled,
                currentSettingsValues.mGestureFloatingPreviewTextEnabled);
                currentSettingsValues.mGestureFloatingPreviewTextEnabled);


        // Contextual dictionary should be updated for the current application.
        mContextualDictionaryUpdater.onStartInputView(editorInfo.packageName);
        if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
        if (TRACE) Debug.startMethodTracing("/data/trace/latinime");
    }
    }


@@ -1943,7 +1924,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
    @UsedForTesting
    @UsedForTesting
    /* package for test */ void clearPersonalizedDictionariesForTest() {
    /* package for test */ void clearPersonalizedDictionariesForTest() {
        mDictionaryFacilitator.clearUserHistoryDictionary();
        mDictionaryFacilitator.clearUserHistoryDictionary();
        mDictionaryFacilitator.clearPersonalizationDictionary();
    }
    }


    @UsedForTesting
    @UsedForTesting
Loading